如何在代码中使用mount函数来挂载ntfs-3g?

时间:2012-08-31 09:55:22

标签: c linux unix

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

我该怎么办?我不想使用“System()”,因为在我的系统中它总是返回-1(我不知道为什么,愚蠢的忙箱灰?),我需要状态来识别它是否成功。

请帮助,谢谢!!!!!!!

2 个答案:

答案 0 :(得分:2)

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

  1. 挂载程序(我的Centos 6.5系统上的/ bin / mount)不是挂载系统调用的简单包装器。事实上,它在弄清楚它的处理方式以及尝试使用它的方法时非常聪明。

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

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

    正常的系统挂载程序指出它必须调用其他东西才能使挂载发生,并自动推断它需要/sbin/mount.ntfs并为你调用它。底层安装系统调用没有这样的功能。它只知道它无法挂载给定的文件系统并失败。

    所以,你有两个选择:

    1. 修复系统上mount命令的错误。你可能想调查一下你是否有一个真正的坐骑'二进制或不。如果你这样做,直接调用可能会有所帮助。

    2. 如果你知道这个东西将是ntfs格式的,并且你没有真正的挂载程序,那么你可能想尝试直接调用ntfs-3g。

答案 1 :(得分: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. 检查挂载系统调用设置的errno值,并根据错误描述修复问题。资料来源:man -s 2 mount

    非常容易。只需在源代码中添加#include "errno.h"即可。然后你可以从mount的手册页验证安装进入的错误是什么。以下是一个示例代码,可帮助您入门:

  4. int retval = mount();//your system call
    if( retval != 0 )
    {
        printf("ERROR:%d=%s\n",errno,strerror(errno));
    }
    
    1. 尝试使用data

    2. 等字符串装入"allow_other,blksize=2048"参数
    3. 尝试在/ etc / fstab中使用UUID而不是设备名称作为NTFS分区。

    4. 如果您需要更多帮助,请与我们联系。