これまでの続きです。まだまだ続きます。
- マウントプロパゲーション(1)〜 shared mount 〜 - TenForward
- マウントプロパゲーション(2)〜 private mount 〜 - TenForward
- マウントプロパゲーション(3)〜 slave mount 〜 - TenForward
- マウントプロパゲーション(4)〜 unbindable mount 〜 - TenForward
- マウントプロパゲーション(5)〜 mountinfoファイル 〜 - TenForward
- マウントプロパゲーション(6)〜 mountinfoファイル(2)〜 - TenForward
これまでと同様に完全に私個人が理解するための資料です(man 7 mount_namespaceみれば書いてますし)。間違いの指摘は大歓迎です。
マウントプロパゲーションとMount Namespaceの関係も見ておきましょう。
今回はprivateとsharedの場合にMount Namespaceが別になるとどうなるかを見てみます。
次のようにprivateなマウントである/mnt_priv
とsharedな/mnt_shrd
を準備します。以下の実行例ではふたつのシェルを使いますので、shell_1
とshell_2
とプロンプトを変えています。
shell_1# mkdir /mnt_priv shell_1# mkdir /mnt_shrd shell_1# mount -t tmpfs tmpfs /mnt_priv/ shell_1# mount -t tmpfs tmpfs /mnt_shrd/ shell_1# mount --make-private /mnt_priv/ (privateに設定) shell_1# mount --make-shared /mnt_shrd/ (sharedに設定)
ここでmountinfo
ファイルを確認しておきましょう。
shell_1# grep /mnt /proc/self/mountinfo 325 31 0:52 / /mnt_priv rw,relatime - tmpfs tmpfs rw 382 31 0:55 / /mnt_shrd rw,relatime shared:242 - tmpfs tmpfs rw
この例ではmnt_shrd
の方はIDが242のsharedとなっています。いっぽうで/mnt_priv
の方はエントリーがありませんのでprivateであることがわかります。
ここで別のシェルを開いてMount Namespaceを作成してみましょう。
shell_2# unshare --mount --propagation unchanged /bin/bash (Mount Namespaceを作成) shell_2# grep /mnt /proc/self/mountinfo 735 666 0:52 / /mnt_priv rw,relatime - tmpfs tmpfs rw 736 666 0:55 / /mnt_shrd rw,relatime shared:242 - tmpfs tmpfs rw
Mount Namespaceを作成するとき親のNamespaceのプロパゲーション設定を変更しないように--propagation unchanged
を指定しています。親のNamespaceとmountinfo
ファイルを比較すると、親のマウントの状態がそのままコピーされていることがわかります(ID:242が同じ)。
ここでこの名前空間内で新たにマウント操作を行ってみましょう。
shell_2# mount -t tmpfs tmpfs /mnt_priv/a shell_2# mount -t tmpfs tmpfs /mnt_shrd/b shell_2# grep /mnt /proc/self/mountinfo 735 666 0:52 / /mnt_priv rw,relatime - tmpfs tmpfs rw 736 666 0:55 / /mnt_shrd rw,relatime shared:242 - tmpfs tmpfs rw 737 735 0:56 / /mnt_priv/a rw,relatime - tmpfs tmpfs rw 738 736 0:57 / /mnt_shrd/b rw,relatime shared:222 - tmpfs tmpfs rw
共有マウント下の/mnt_shrd/b
はsharedとして新たにIDが割り当たっています。いっぽうでprivateの/mnt_priv/a
はprivateです。ここで最初のシェルに戻ってみましょう。
shell_1# grep /mnt /proc/self/mountinfo 325 31 0:52 / /mnt_priv rw,relatime - tmpfs tmpfs rw 382 31 0:55 / /mnt_shrd rw,relatime shared:242 - tmpfs tmpfs rw 739 382 0:57 / /mnt_shrd/b rw,relatime shared:222 - tmpfs tmpfs rw (2番目のシェルでsharedだったマウント)
2番目のシェルでsharedとなっていたID:222のマウントが共有されています。
ここでさらに最初のシェルでマウント操作を行ってみます。
shell_1# mount -t tmpfs tmpfs mnt_priv/c shell_1# mount -t tmpfs tmpfs mnt_shrd/d shell_1# grep /mnt /proc/self/mountinfo 325 31 0:52 / /mnt_priv rw,relatime - tmpfs tmpfs rw 382 31 0:55 / /mnt_shrd rw,relatime shared:242 - tmpfs tmpfs rw 739 382 0:57 / /mnt_shrd/b rw,relatime shared:222 - tmpfs tmpfs rw 753 325 0:58 / /mnt_priv/c rw,relatime - tmpfs tmpfs rw 754 382 0:59 / /mnt_shrd/d rw,relatime shared:255 - tmpfs tmpfs rw
新たに行ったマウントで、private以下のマウントはprivate、shared以下のマウントにはあらたにID:255が割り当たったsharedとなっています。
ここで再度2番目のシェルを確認してみると、次のようにID:255のマウントも共有されていることがわかります。
shell_2# grep /mnt /proc/self/mountinfo 735 666 0:52 / /mnt_priv rw,relatime - tmpfs tmpfs rw 736 666 0:55 / /mnt_shrd rw,relatime shared:242 - tmpfs tmpfs rw 737 735 0:56 / /mnt_priv/a rw,relatime - tmpfs tmpfs rw 738 736 0:57 / /mnt_shrd/b rw,relatime shared:222 - tmpfs tmpfs rw 755 736 0:59 / /mnt_shrd/d rw,relatime shared:255 - tmpfs tmpfs rw (最初のシェルでsharedだったマウント)
このようにsharedであればMount Namespaceをまたがっていてもマウントが共有されます。