在Linux上用C++挂载NTFS设备?

4

我正在尝试在我的C++应用程序中挂载外部驱动器。我最初尝试使用mount(2),但是失败了:

int ret = mount(deviceName.c_str(), mountPoint.c_str(), fsType.c_str(), 0, NULL);

错误码是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设备的方法是什么?

2个回答

4

mount.2 只是一个内核调用。而 mount.8 是一个完整的外部工具,比内核功能更强大。

我认为你可能在寻找 libmount,它是一个实现了由 mount.8 完成的全部挂载操作的库。较新的 mount 版本也使用它。它提供在 util-linux 中。


啊,我承认我曾经假设在底层 mount.2 会调用 mount.8。这就解释了它们为什么没有以相同的方式运行。感谢您指向 libmount,我会去看看的。 - jam

2
你尝试过使用 strace 命令运行 mount(8) 吗?它会打印出程序所执行的系统调用,包括 mount(2)。当我进行这样的挂载时,它将生成 mount.ntfs(即 NTFS-3g),然后对 fuseblk 执行 mount,最后进入后台以支持该挂载点。
因为必须启动用户空间守护程序,所以基于 FUSE 的文件系统处理方式不同。使用 fuseblk 挂载不提供足够的信息来使内核启动守护程序(甚至内核实际上也没有启动守护程序的信息)。对于 ntfs-3g,通常应该像这样做:ntfs-3g /dev/sda1 /mnt/windows(来自帮助文档)。没有编程方法可以告诉内核如何进行此操作,因为它发生在用户空间中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接