マウントされたファイルシステムを読み取り専用に再マウントするには、次のコマンドを使用できます。
mount -o remount,ro /foo
これは、たとえば、/
が呼び出される直前に、ルートファイルシステム(halt/reboot
)が読み取り専用で再マウントされるシャットダウンシーケンスで使用されます。
実際に読み取り専用に再マウントするとどうなりますか?カーネルの「フラグ」を変更して、書き込みが拒否されるようにしますか?
特定のファイルシステムを読み取り専用に再マウントする以外に何もしない独自のプログラムを作成するのはどれほど難しいでしょうか。
ファイルシステムのマウントまたは再マウントは、 mount(2)
syscallを使用して実行されます。再マウントするとき、これはターゲットの場所(マウントポイント)、マウント操作で使用されるフラグ、および関連する特定のファイルシステムに使用される追加のデータを取ります。読み取り専用で再マウントする場合、使用されるフラグは_MS_RDONLY
_および_MS_REMOUNT
_です。また、ファイルシステムが最初にマウントされたときに使用された他のフラグを提供する必要があります。
読み取り専用でファイルシステムを再マウントすると、いくつかのクリーンアップ(基本的には未処理の書き込みを終了)を実行した後、カーネルのファイルシステムデータ構造にフラグが設定されます。 _ext4
_ソースコード でどのように処理されるかを確認できます:_ext4
_ファイルシステムが読み取り/書き込みでマウントされてから読み取り専用で再マウントされた場合、ファイルシステムは同期され、クォータは一時停止され、スーパーブロック構造の_s_flags
_が更新され、ファイルシステムが読み取り専用であることを示します。これは、カーネル全体で書き込みを拒否するために使用されます。たとえば、読み取り専用ファイルシステムでの書き込みアクセスを防止する _sb_permission
_ を参照してください。
これを自分で実行したい場合は、上記のリンク先のマンページに従って、適切なオプションを指定してmount()
を呼び出すだけです。完全なソリューションを得るには、現在のマウントフラグを特定して更新する必要があると思いますが、ファイルシステムが現在マウントされているものと一致するように単純なプログラムをハードコーディングすることもできます...