【问题标题】:autodetect filesystem on mount()在 mount() 上自动检测文件系统
【发布时间】:2012-07-09 00:20:54
【问题描述】:

我的应用程序应该安装并检查插入 USB 插槽的任何 pendrive 的内容。 问题是,一些用户可能使用格式化为其他文件系统而不是标准“vfat”的笔式驱动器。 标准

 mount /dev/sda1 /mnt/pendrive -t auto

足以满足我的需要 - 它可以工作,并且将使用内核可读的任何文件系统。 问题是我必须在应用程序中执行此操作,并且当存在“自然”C 解决方案时,我宁愿避免调用 system() 和 shell 命令。

 #include <sys/mount.h>
 ...
 result = mount("/dev/sda1", "/mnt/pendrive", "vfat" ,0, NULL);

工作正常。但是,如果我将"vfat" 替换为"auto"NULL,则不会安装任何内容。

当我检查了busybox 的挂载源时,如果'auto' 或没有提供文件系统类型,它似乎在mount() 调用中将文件系统设置为NULL。但这个技巧似乎对我不起作用。我错过了什么?有没有一些相对简单的方法可以做到这一点?

【问题讨论】:

  • 当您将 auto 选项指定为文件系统类型时,挂载实用程序在内部尝试检测文件系统

标签: c linux filesystems mount


【解决方案1】:

内核无法自动检测文件系统,所以你必须自己做。

busybox 实际上做的只是遍历所有相关的文件系统,从 /proc/filesystems 解析,然后调用 mount() 直到它成功(见1898 行)

【讨论】:

    【解决方案2】:

    如果mount /dev/sda1 /mnt/pendrive -t auto 是您需要做的。那么就这样做吧。

    sprintf(cmd, "mount /dev/sda1 /mnt/pendrive -t auto")    
    rc = system(cmd);
    

    sprintf(cmd, "mount /dev/sda1 /mnt/pendrive -t auto")    
    if ((p = popen(cmd, "w")) != NULL)
    {
        ...
    }
    

    应该可以正常工作。您可能需要监听 udev 事件或扫描 udev 日志以查找当前连接的 USB 大容量存储设备,以获取节点路径,但这应该可以帮助您入门。

    【讨论】:

    • 提出问题的人明确提出,他宁愿不需要使用system(),也不需要打开外壳......
    【解决方案3】:

    为什么不直接使用循环呢?

    #define MAX 4
    const char *FSTypes[MAX] = { "ext4", "btrfs", "ntfs", "vfat" };
    short Inc = 0;
    
    for (; Inc < MAX; ++Inc)
    {
        if (mount("/source", "/target", FSTypes[Inc], 0, NULL) == 0)
        { /*If it's successful, stop.*/
            break;
        }
    }
    

    我意识到这是一个老问题,但这似乎与其他寻找答案的人有关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 2015-09-13
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      相关资源
      最近更新 更多