1つのディレクトリ(/ src)を別の場所(/ dst)で読み取り専用として再マウントする必要があります。これは次のように実行できます。
$ Sudo mount --bind /src /dst
$ Sudo mount -o remount,ro /dst
ただし、/etc/fstab
を使用して、ブート時にマウントを実行し、この問題に対するさまざまな提案された解決策を見ました。
/src /dst none bind 0 0
/src /dst none remount,bind,ro 0 0
残念ながら、システム上にディレクトリを読み取り/書き込み用にマウントしたままにしておきます。
/src /dst none bind 0 0
/dst /dst none remount,bind,ro 0 0
/dst
をマウントしようとするとエラーが発生します:
mount: /dst not mounted already, or bad option
上記のソリューションはさまざまなディストリビューションで動作すると思われますが、残念ながらUbuntu 10.04.4 LTS(カーネル2.6.32-41-server)では動作しません。
mount
コマンドを/etc/rc.local
に配置する以外に、これを実現する方法はありますか?
古いカーネルでは、mount --bind
は読み取り/書き込みファイルシステムの読み取り専用ビューを作成できません。カーネルは、ファイルシステムの読み取り/書き込みステータスを、バインドマウントによって複製されない単一の場所に保存します。新しいカーネルではこれが可能ですが、まだ別のmount
ステップが必要です。最初にバインドしてから読み取り専用にします。これを変更するカーネルパッチがあり、一部のディストリビューション(Debianなど)はそれを適用していますが、Ubuntuは(少なくとも12.04の時点では)適用していません。
解決策の1つは、 Oliが説明する のように、/etc/fstab
からではなく、ブートスクリプトから読み取り専用ビューを作成することです。
それ以外の場合は、代わりに bindfs を使用できます。これは Fuse ファイルシステムです。 Fuseを通過すると、間接的なレイヤーが追加されるため、若干遅くなります。また、ACLなどの拡張ファイルメタデータのサポートも失われます。逆に、読み取り専用ビューには認識可能なファイルシステムタイプがあり、ファイルシステムのトラバーサル(locate
やバックアップなど)から簡単に除外できます。
fstab
エントリは次のようになります。
bindfs#/src /dst Fuse perms=a=rX
このLWNの記事 によると、この動作はバージョン2.6.25付近のカーネルに潜んでいます。要するに、ターゲットファイルシステムがrw
である場合、最上位の何かをバインドしてもro
に変換できません。
2.6.26では、(発見したように)再マウントをトリガーできるように部分的に修正しましたが、fstab内からそれを行う方法はまだありません。
これは私がfstabで試していたことです。
/home/oli/Desktop/testmount /mnt none bind,ro
mount -a
を実行した後、/mnt
がマウントされましたが、ファイルを作成できました。その後Sudo mount -o remount /mnt
を起動すると、読み取り専用になりました。
そのため、最もクリーンな方法は、/etc/rc.local
に行を追加するか、mountall
イベントで開始する非常にシンプルなUpstartスクリプトを作成することだと思います(したがって、すぐに発生します)。