TenForward

技術ブログ。はてなダイアリーから移転しました

マウントプロパゲーション(7)〜 Namespaceとプロパゲーション(1)〜

これまでの続きです。まだまだ続きます。

これまでと同様に完全に私個人が理解するための資料です(man 7 mount_namespaceみれば書いてますし)。間違いの指摘は大歓迎です。

マウントプロパゲーションとMount Namespaceの関係も見ておきましょう。

今回はprivateとsharedの場合にMount Namespaceが別になるとどうなるかを見てみます

次のようにprivateなマウントである/mnt_privとsharedな/mnt_shrdを準備します。以下の実行例ではふたつのシェルを使いますので、shell_1shell_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をまたがっていてもマウントが共有されます。