マウント(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 固有の属性ではない場合は、どのように設定すればよいのでしょうsyncdirsync

コマンドラインマウントで作成できるのであれば、コマンドラインバージョンでも作成できるのではないでしょうか?

答え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()を と に処理することflagsですdata。パッケージmountのコマンドは、util-linuxこのために という名前のライブラリに依存しています。libmount一部は、長い Linux 固有のテーブルからのテーブル駆動です。

参考文献

  • ファイルmtab「」。GNU C ライブラリリファレンスマニュアル. 2.23. フリーソフトウェア財団。2016年。
  • カレル・ザック(2012年)。マウントオプション「」。libmount リファレンスマニュアル2.21. Linux カーネル アーカイブ。

関連情報