Я пытаюсь смонтировать внешний диск в моем приложении C ++. Первоначально я пытался использовать mount (2), но это не удается:
int ret = mount(deviceName.c_str(), mountPoint.c_str(), fsType.c_str(), 0, NULL);
errno 19, ENODEV
(тип файловой системы не настроен в ядре)
Тем не менее, если я переключусь на использование mount (8), он будет работать нормально:
std::string cmd = "mount -t " + fsType + " " + deviceName + " " + mountPoint;
int ret = system(cmd.c_str());
Имеет ли mount (2) другой список допустимых типов файловых систем? Это устройство NTFS, поэтому я использовал ntfs-3g
как тип. Я проверил / proc / filesystems и увидел, что этого нет в списке, поэтому я попытался fuseblk
но это просто изменяет ошибку на 22, EINVAL
,
Как правильно монтировать устройства NTFS с помощью mount (2)?
mount.2
это просто вызов ядра. mount.8
это полный внешний инструмент, который выходит за рамки того, что делает ядро.
Я думаю, что вы можете искать libmount которая является библиотекой, реализующей всю магию монтирования mount.8
, Более новые версии монтирования используют это также. Это предусмотрено в Util-Linux.
Ты пробовал бегать mount(8)
с использованием strace
команда? Он распечатает системные вызовы, сделанные программой, в том числе mount(2)
, Когда я делаю такое крепление, оно порождает mount.ntfs
(который является NTFS-3g), который затем делает mount
за fuseblk
и затем вращается в фоновом режиме, чтобы поддержать эту точку монтирования.
Файловые системы на основе FUSE обрабатываются по-разному, потому что демон пользовательского пространства должен быть запущен. Монтаж с fuseblk
не предоставляет достаточно информации ядру для запуска демона (а ядро даже не имеет информации для запуска демона). Для NTFS-3G обычно можно сделать что-то вроде ntfs-3g /dev/sda1 /mnt/windows
(из справки). Не существует программного способа, чтобы заставить ядро сделать это, потому что это происходит в пространстве пользователя.