私のArch Linuxシステム(Linux Kernel 3.14.2)では、バインドマウントは読み取り専用オプションに従わない。
# mkdir test
# mount --bind -o ro test/ /mnt
# touch /mnt/foo
生成ファイル/mnt/foo
の関連項目は/proc/mounts
。
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
マウントオプションは要求されたオプションと一致しませんが、バインドマウントの読み取り/書き込み動作と初期マウントで/dev/sda2
使用されたオプションと一致します。/
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
ただし、インストールを再インストールすると、読み取り専用オプションが適用されます。
# mount --bind -o remount,ro test/ /mnt
# touch /mnt/bar
touch: cannot touch ‘/mnt/bar’: Read-only file system
そして関連アイテム/proc/mounts/
/dev/sda2 /mnt ext4 ro,relatime,data=ordered 0 0
test
私が期待していたのと同じです(実際にはディレクトリのフルパスを見たいのですが)。元のマウントの項目/proc/mounts/
も変更されず、読み取り/書き込み状態のままです。/dev/sda2/
/
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
この動作と回避策は、少なくとも以後知られてきた。2008年マニュアルページに文書化されています。mount
ファイルシステムのマウントオプションは、元のマウントポイントのオプションと同じままであり、--bind / -rbindで-oオプションを渡して変更することはできません。別の再インストールコマンドを使用してインストールオプションを変更できます。
すべてのディストリビューションが同じように動作するわけではありません。 Archはこれらのオプションを静かに無視しているように見えますが、Debianはバインドマウントが読み取り専用マウントを取得できないときに警告を生成します。
mount: warning: /mnt seems to be mounted read-write.
Debian では、この動作が「修正」されたという報告があります。レニーとスクイーズあまりそうではないようですが普遍的な修正Debian Wheezyでも動作しません。初期インストール時に読み取り専用オプションを考慮してバインドインストールを実行する際の難点は何ですか?
ベストアンサー1
バインドマウントはただ…まあ…バインドマウントです。つまり、これは新しいマウントではありません。単にサブディレクトリを新しいマウントポイントに「リンク」/「露出」/「考慮」するだけです。したがって、インストールパラメータを変更することはできません。苦情を受け取る理由は次のとおりです。
# mount /mnt/1/lala /mnt/2 -o bind,ro
mount: warning: /mnt/2 seems to be mounted read-write.
しかし、あなたが言ったように、一般的なバインドマウントが機能します。
# mount /mnt/1/lala /mnt/2 -o bind
その後、roの再インストールも機能します。
# mount /mnt/1/lala /mnt/2 -o bind,remount,ro
しかし現実は、このバインドマウントだけでなく、マウント全体を変更することです。 /proc/mounts を見ると、バインドマウントとネイティブマウントの両方が読み取り専用になっていることがわかります。
/dev/loop0 /mnt/1 ext2 ro,relatime,errors=continue,user_xattr,acl 0 0
/dev/loop0 /mnt/2 ext2 ro,relatime,errors=continue,user_xattr,acl 0 0
だからあなたがすることは、初期インストールを読み取り専用インストールに変更することと同じです。それからもちろん、読み取り専用のバインドマウントを作成します。
2016年7月20日に更新:
以下は4.5カーネルでは機能しますが、4.3カーネルでは機能しません(間違っています。以下のアップデート#2を参照)。
カーネルには読み取り専用を制御する2つのフラグがあります。
- :
MS_READONLY
マウントが読み取り専用かどうかを示します。 - :
MNT_READONLY
「ユーザー」が読み取り専用を望むかどうかを示します。
4.5カーネルでは、aを実行することはmount -o bind,ro
実際には効果があります。たとえば、次のようになります。
# mkdir /tmp/test
# mkdir /tmp/test/a /tmp/test/b
# mount -t tmpfs none /tmp/test/a
# mkdir /tmp/test/a/d
# mount -o bind,ro /tmp/test/a/d /tmp/test/b
/tmp/test/a/d
toの読み取り専用バインドマウントが作成され、/tmp/test/b
次の形式で表示されます/proc/mounts
。
none /tmp/test/a tmpfs rw,relatime 0 0
none /tmp/test/b tmpfs ro,relatime 0 0
/proc/self/mountinfo
ユーザービュー(名前空間)を考慮したより詳細なビューはで見ることができます。関連する行は次のとおりです。
363 74 0:49 / /tmp/test/a rw,relatime shared:273 - tmpfs none rw
368 74 0:49 /d /tmp/test/b ro,relatime shared:273 - tmpfs none rw
ro
2行目を見ると、(MNT_READONLY
)とrw
()の両方が表示されていることがわかります!MS_READONLY
。
最終結果は次のとおりです。
# echo a > /tmp/test/a/d/f
# echo a > /tmp/test/b/f
-su: /tmp/test/b/f: Read-only file system
アップデート#2(2016年7月20日):
さらに詳しく調べると、この動作は実際にはutil-linuxの一部であるlibmountのバージョンによって異なります。これのサポートが追加されました。犯罪バージョン2.27としてリリースされました。
9ac77b8a78452eab0612523d27fee52159f5016a 送信 著者:カレルジュッカー 日付: 2015年8月17日 月曜日 11:54:26 +0200 libmount: "bind,ro" サポートを追加 これで、読み取り専用データベースを作成するには、2つのmount(8)呼び出しを使用する必要があります。 山: マウント /foo /bar -o バインド インストール/バー-o再インストール、ro、バインド このパッチを使用すると、「bind、ro」を指定して再マウントできます。 追加のmount(2)システムコールを介してlibmountを介して自動的に実行されます。そうではない もちろん原子的です。 署名者: Karel Zak
これは回避策も提供します。以前と最新のインストールでは、straceを使用してこの動作を確認できます。
古い:
mount("/tmp/test/a/d", "/tmp/test/b", 0x222e240, MS_MGC_VAL|MS_RDONLY|MS_BIND, NULL) = 0 <0.000681>
新しい:
mount("/tmp/test/a/d", "/tmp/test/b", 0x1a8ee90, MS_MGC_VAL|MS_RDONLY|MS_BIND, NULL) = 0 <0.011492>
mount("none", "/tmp/test/b", NULL, MS_RDONLY|MS_REMOUNT|MS_BIND, NULL) = 0 <0.006281>
結論として:
必要な結果を得るには、2つのコマンドを実行する必要があります(@ Thomasがすでに述べたように)。
mount SRC DST -o bind
mount DST -o remount,ro,bind
最新バージョンのマウント(util-linux> = 2.27)は、実行時に自動的にこれを行います。
mount SRC DST -o bind,ro