0

我对挂载功能有疑问,我想挂载一个 ntfs 磁盘,并且我已经准备好 ntfs-3g 驱动程序,我可以使用 ntfs-3g 命令或 shell 中的 mount 命令挂载这个磁盘,但是当我尝试使用 mount("/dev/sda1", "/mnt/sda1","ntfs-3g",MS_MGC_VAL,NULL); 它时总是失败。

我能做些什么?我不想使用“System()”,因为在我的系统中它总是返回-1(我不知道为什么,愚蠢的busybox ash?),我需要状态来识别它是否安装成功。

请帮忙,谢谢!!!!!!!

4

2 回答 2

2

我已经研究这个问题几个小时了,我相信正在发生的事情是对这些事情如何运作的误解。

  1. mount 程序(我的 Centos 6.5 系统上的 /bin/mount)不是 mount 系统调用的简单包装器。事实上,它非常聪明地弄清楚它正在处理什么,以及尝试安装什么东西。

  2. mount 系统调用仅适用于作为内核模块的文件系统驱动程序。您可以在 /etc/filesystems 或 /proc/filesystems 中找到的东西。

ntfs-3g 是一个FUSE驱动程序。挂载 FUSE 文件系统的唯一正确方法是使用适当的挂载程序。(我的系统上的 ntfs-3g 或 /sbin/mount.ntfs)。这是因为除了需要内核资源之外,还必须运行用户空间程序。知道如何解释磁盘格式的是用户空间程序,而不是内核。

正常的系统挂载程序发现它必须调用其他东西才能进行挂载,并自动推断它需要 /sbin/mount.ntfs 并为您调用它。底层的 mount 系统调用没有这样的功能。它只知道它不能挂载给定的文件系统并且失败了。

所以,你有两个选择:

  1. 修复系统上 mount 命令的任何问题。您可能想调查是否有实际的“安装”二进制文件。如果你这样做,直接调用它可能会有所帮助。

  2. 如果您知道该内容将被格式化为 ntfs,并且您没有真正的挂载程序,那么您可能想尝试直接调用 ntfs-3g。

于 2014-09-29T18:58:25.743 回答
0

您可以尝试以下解决方案:

  1. 验证您是否具有安装和卸载文件系统的正确权限。

  2. int mount(const char *source, const char *target, const char *filesystemtype, unsigned long mountflags, const void *data);

    filesystemtype内核支持的参数 值列在/proc/filesystems. 当加载适当的模块时,其他类型变得可见。检查是否ntfs-3g在此处列出。

  3. 检查errnomount系统调用设置的值,根据errno描述修复问题。资源:man -s 2 mount

    它很容易。只需添加#include "errno.h"您的源代码。然后您可以从 mount 的手册页中验证 mount 的错误是什么。这是一个示例代码,可帮助您入门:

int retval = mount();//your system call
if( retval != 0 )
{
    printf("ERROR:%d=%s\n",errno,strerror(errno));
}
  1. 尝试data使用类似的字符串挂载参数"allow_other,blksize=2048"

  2. 尝试在 NTFS 分区的 /etc/fstab 中使用 UUID 而不是设备名称。

如果您需要更多帮助,请告诉我。

于 2012-08-31T10:49:35.967 回答