他のオプションを変更せずに読み取り専用で再マウント

他のオプションを変更せずに読み取り専用で再マウント

職場では、ファイルシステムを読み取り専用で再マウントするsystemd-shutdownために使用されます。mount()

/* MS_REMOUNT requires that the data parameter
 * should be the same from the original mount
 * except for the desired changes. Since we want
 * to remount read-only, we should filter out
 * rw (and ro too, because it confuses the kernel) */
...filter_options(m->options, "rw\0ro\0", NULL, NULL, &options);

...mount(NULL, m->path, NULL, MS_REMOUNT|MS_RDONLY, options)...

strace mount -oremount,rw /bootところで、mountシステムコールの最後のパラメータとしてNULLが渡されました。これは、古いオプション文字列をコピーして変更する必要がないことを意味しますか?

ベストアンサー1

いいえ。

/etc/fstabジェネリック以外のオプションを編集して追加すると、foo/sbin/mountfoo」が最後の引数として渡されますmount()。あなたの例ではNULLを渡しますが、これは空の文字列を意味すると仮定します""。おそらく彼らは同じ効果を持っているでしょう。


/sbin/mountパスとデバイスの両方を渡すと、明らかに動作が異なります(!)。

再マウント機能は、fstabのオプションと一緒にmountコマンドを使用する標準的な方法に従います。これは、デバイスとdirの両方が指定されている場合にのみ、マウントがfstab(またはmtab)を読み取らないことを意味します。

 mount -o remount,rw /dev/foo /dir

この呼び出しの後、すべての古いマウントオプションが置き換えられ、mountコマンドによって内部的に生成され維持されるLoop =オプションを除いて、fstab(またはmtab)のすべてのエントリは無視されます。

 mount -o remount,rw  /dir

この呼び出しの後、mountはfstabを読み取り、オプションをコマンドライン(-o)のオプションとマージします。 fstabでマウントポイントが見つからない場合は、指定されていないソースから再マウントできます。

これは、最後のケースがマウントポイントの現在のオプションをオーバーライドするように見えることを意味します。


質問に記載されているコードには何か不審な点があります。インストールフラグをリセットしているようです。現在の動作:

既存のインストールを再インストール

... mountflagsおよびデータパラメータは、意図的に変更されたパラメータを除いて、元のmount()呼び出しで使用された値と一致する必要があります。

だからおそらくそのコメントがここから来たと思います。

MS_LAZYTIME、MS_MANDLOCK、MS_NOATIME、MS_NODEV、MS_NODIRATIME、MS_NOEXEC、MS_NOSUID、MS_RELATIME、MS_RDONLY、および MS_SYNCHRONOUS インストールフラグを変更できます。

コードは次のとおりです。うまくいきます。読み取り専用で再マウントすると、後続の書き込みの問題または blockdev が読み取り専用であるため、読み取り/書き込みの再マウントが拒否される問題を回避できます。systemd-shutdownこの時点で、SIGKILLはファイルシステムにアクセスできる他のプロセスに転送する必要があるため、NOEXECなどのセキュリティオプションを無視できます。

再インストール中にMS_DIRSYNCフラグ設定を変更しようとすると、自動的に無視されます。

これは、他のフラグが自動的に無視されず、一致しないと呼び出しが失敗する可能性があることを意味しますが、コアカーネルコードはそのようなことをしないと思います。

Linux 3.17 以降、MS_NOATIME、MS_NODIRATIME、MS_RELATIME、または MS_STRICTATIME のいずれかが mountflags に指定されていない場合、再マウント操作は MS_RELATIME をデフォルト値に設定する代わりに、これらのフラグの既存の値を保持します。

Linux 2.6.26以降、このフラグはmountflagsを読み取り専用にすることで、既存のバインドマウントを読み取り専用にすることもできます。

MS_REMOUNT | MS_BIND | MS_RDONLY

systemd-shutdownがfstabをまったく同じように処理しないのは問題ありませんmount -oremount,ro /boot。 (以前のsysvinitスクリプトは、ルートファイルシステムを除いてROを再マウントしないため、少なくともDebianでは問題ありません。)

おすすめ記事