安装座(8) 带安装座(2)

安装座(8) 带安装座(2)

我有一个软件可以以编程方式卸载分区(如果不忙)并在所有工作完成后再次安装它。

如果我在终端中运行:

sudo mount /dev/sdb1 /mnt/fat32 -o sync,dirsync,rw,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro -t vfat

我得到这个/proc/self/mountinfo

100 24 8:17 / /mnt/fat32 rw,relatime shared:61 - vfat /dev/sdb1 rw,sync,dirsync,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro

所以我制作了一个mountinfo 解析器并获取数据来恢复安装,但我正在使用 和 转换安装选项 ( ) 和超级选项 ( : ...rw,relatime中的最后一部分) :/mountinforw,sync,dirsync,mountoptionsdata

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

我的方法是将安装选项转换为适当的选项mountflags,并直接向 提供特殊选项data,但随后出现此错误:

[62857.390803] FAT-fs (sdb1): Unrecognized mount option "rw" or missing value

因此,我创建了一个函数来复制超级选项中的属性,它们恰好与文件系统特定数据相匹配,现在它可以工作了。但我仍然有一个问题:例如,如果它们不在安装选项标志中并且它们不是 vfat 特定属性,我该如何sync设置dirsync

如果可以通过命令行挂载来制作,那么也可以在命令行版本中制作,对吗?

答案1

给出的一些参数mount(8)被转换为mountflags参数中指定的标志mount(2):

  • syncMS_SYNCHRONOUS;
  • dirsyncMS_DIRSYNC;
  • relatimeMS_RELATIME;
  • rw是默认的,所以不能指定;ro将会MS_RDONLY

答案2

所以我做了一个mountinfo解析器[…]

您最好使用GNU C 运行时库中提供的setmntent()和。getmntent()

我的方法是将安装选项转换为适当的选项mountflags,并直接提供特殊选项data[…]

您需要做的是将给mnt_opts定的getmntent()和 处理为flagsdata。包mount中的命令依赖util-linux于一个库,名为库挂载。其中一些是表驱动的,来自冗长的 Linux 特定表。

进一步阅读

  • 文件mtab”。GNU C 库参考手册。 2.23。自由软件基金会。 2016年。
  • 卡雷尔·扎克 (2012)。 ”安装选项”。libmount 参考手册。 2.21。 Linux 内核档案。

相关内容