4

我正在尝试在我的 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的是 fstype。我检查了 /proc/filesystems 并看到它没有列出,所以我尝试fuseblk了,但这只是将错误更改为 22, EINVAL.

使用 mount(2) 挂载 NTFS 设备的正确方法是什么?

4

2 回答 2

4

mount.2只是一个内核调用。mount.8是一个完整的外部工具,它超越了内核的功能。

我想您可能正在寻找libmount,它是一个实现由mount.8. 较新的安装版本也使用它。它在util-linux中提供。

于 2012-09-06T13:36:57.410 回答
2

您是否尝试过mount(8)使用strace命令运行?它将打印出程序进行的系统调用,包括mount(2). 当我进行这样的安装时,它会生成mount.ntfs(即 NTFS-3g),然后执行一个mountforfuseblk然后旋转到后台以支持该安装点。

基于 FUSE 的文件系统的处理方式不同,因为必须启动用户空间守护进程。挂载fuseblk并没有为内核提供足够的信息来启动守护进程(内核甚至没有真正拥有启动守护进程的信息)。对于 ntfs-3g,通常会做类似ntfs-3g /dev/sda1 /mnt/windows的事情(来自帮助)。没有一种编程方式告诉内核这样做,因为它发生在用户空间中。

于 2012-09-06T13:34:34.583 回答