web-dev-qa-db-ja.com

Ubuntuでfstabを使用して読み取り専用でマウントをバインドしますか?

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に配置する以外に、これを実現する方法はありますか?

8
mgd

古いカーネルでは、mount --bindは読み取り/書き込みファイルシステムの読み取り専用ビューを作成できません。カーネルは、ファイルシステムの読み取り/書き込みステータスを、バインドマウントによって複製されない単一の場所に保存します。新しいカーネルではこれが可能ですが、まだ別のmountステップが必要です。最初にバインドしてから読み取り専用にします。これを変更するカーネルパッチがあり、一部のディストリビューション(Debianなど)はそれを適用していますが、Ubuntuは(少なくとも12.04の時点では)適用していません。

解決策の1つは、 Oliが説明する のように、/etc/fstabからではなく、ブートスクリプトから読み取り専用ビューを作成することです。

それ以外の場合は、代わりに bindfs を使用できます。これは Fuse ファイルシステムです。 Fuseを通過すると、間接的なレイヤーが追加されるため、若干遅くなります。また、ACLなどの拡張ファイルメタデータのサポートも失われます。逆に、読み取り専用ビューには認識可能なファイルシステムタイプがあり、ファイルシステムのトラバーサル(locateやバックアップなど)から簡単に除外できます。

fstabエントリは次のようになります。

bindfs#/src  /dst  Fuse perms=a=rX
6
Gilles

この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スクリプトを作成することだと思います(したがって、すぐに発生します)。

6
Oli