TenForward

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

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

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

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

前回と同様に引き続きマウントプロパゲーションとMount Namespaceの関係も見ていきます。今回はslaveです。

shell_1# mount -t tmpfs tmpfs /mnt_shrd/
shell_1# mount -t tmpfs tmpfs /mnt_mstr/
shell_1# mount --make-shared /mnt_shrd/ (sharedに設定)
shell_1# mount --make-shared /mnt_mstr/ (sharedに設定)
shell_1# grep /mnt /proc/self/mountinfo (sharedになっていることを確認)
590 31 0:52 / /mnt_shrd rw,relatime shared:324 - tmpfs tmpfs rw
604 31 0:55 / /mnt_mstr rw,relatime shared:331 - tmpfs tmpfs rw

tmpfsをふたつマウントし、両方ともsharedに設定しました。mountinfoファイルを確認するとsharedとなっているのがわかります。

ここで別のシェル(shell_2)を起動し、新しくMount Namespaceを作成してみましょう。

shell_2# unshare --mount --propagation unchanged /bin/bash (Mount Namespaceを作成)
shell_2# grep /mnt /proc/self/mountinfo (sharedであることを確認)
677 636 0:52 / /mnt_shrd rw,relatime shared:324 - tmpfs tmpfs rw
678 636 0:55 / /mnt_mstr rw,relatime shared:331 - tmpfs tmpfs rw

--propagation unchangedを指定していますので、さきほど行ったマウントはいずれもsharedで元のNamespaceと変わりません。ここでこのうちのひとつのマウントをslaveに設定してみましょう。

shell_2# mount --make-slave /mnt_mstr/ (slaveに設定)
shell_2# grep /mnt /proc/self/mountinfo (設定した方のマウントがslaveになったことを確認)
677 636 0:52 / /mnt_shrd rw,relatime shared:324 - tmpfs tmpfs rw
678 636 0:55 / /mnt_mstr rw,relatime master:331 - tmpfs tmpfs rw

ここでは/mnt_mstrの方をslaveに設定しましたので、オプショナルフィールドはmaster:331となっており、もとのMount Namespaceでshared:331となっていたマウントのslaveになっていることがわかります。

この新しいMount Namespace内で、このふたつのマウントのサブマウントを作成し、mountinfoファイルを確認してみましょう。

shell_2# mkdir /mnt_shrd/a
shell_2# mkdir /mnt_mstr/b
shell_2# mount -t tmpfs tmpfs /mnt_shrd/a
shell_2# mount -t tmpfs tmpfs /mnt_mstr/b
shell_2# grep /mnt /proc/self/mountinfo (mountinfoを確認)
677 636 0:52 / /mnt_shrd rw,relatime shared:324 - tmpfs tmpfs rw
678 636 0:55 / /mnt_mstr rw,relatime master:331 - tmpfs tmpfs rw
679 677 0:56 / /mnt_shrd/a rw,relatime shared:338 - tmpfs tmpfs rw
694 678 0:57 / /mnt_mstr/b rw,relatime - tmpfs tmpfs rw

もともとマウントされていた/mnt_shrd/mnt_mstrは変わりません。そして新たに行ったサブマウントは、

  • /mnt_shrd/aは新たなsharedマウントでIDが338(親のマウントからsharedを継承)
  • /mnt_mstr/bはprivateマウント

となっていることがわかります。

最初のシェル(shell_1)に戻ってmountinfoファイルを確認してみると、

shell_1# grep /mnt /proc/self/mountinfo 
590 31 0:52 / /mnt_shrd rw,relatime shared:324 - tmpfs tmpfs rw
604 31 0:55 / /mnt_mstr rw,relatime shared:331 - tmpfs tmpfs rw
680 590 0:56 / /mnt_shrd/a rw,relatime shared:338 - tmpfs tmpfs rw

別のシェル(shell_2)で作成したMount Namespace内で行ったsharedマウントは、もとのMount Namespaceにも伝播しています。いっぽうでslaveに設定したほうのマウントは伝播していません。

ここで最初のシェル(shell_1)の方で新たにマウントを行ってみましょう。

shell_1# mkdir /mnt_shrd/c
shell_1# mkdir /mnt_mstr/d
shell_1# mount -t tmpfs tmpfs /mnt_shrd/c
shell_1# mount -t tmpfs tmpfs /mnt_mstr/d
shell_1# grep /mnt /proc/self/mountinfo 
590 31 0:52 / /mnt_shrd rw,relatime shared:324 - tmpfs tmpfs rw
604 31 0:55 / /mnt_mstr rw,relatime shared:331 - tmpfs tmpfs rw
680 590 0:56 / /mnt_shrd/a rw,relatime shared:338 - tmpfs tmpfs rw
695 590 0:58 / /mnt_shrd/c rw,relatime shared:345 - tmpfs tmpfs rw (←新たに行われたマウント)
747 604 0:59 / /mnt_mstr/d rw,relatime shared:352 - tmpfs tmpfs rw (←新たに行われたマウント)

あらたにIDが345352のsharedマウントが行われています。これを別のシェル(shell_2)のMount Namespace内で確認してみましょう。

shell_2# grep /mnt /proc/self/mountinfo 
677 636 0:52 / /mnt_shrd rw,relatime shared:324 - tmpfs tmpfs rw
678 636 0:55 / /mnt_mstr rw,relatime master:331 - tmpfs tmpfs rw
679 677 0:56 / /mnt_shrd/a rw,relatime shared:338 - tmpfs tmpfs rw
694 678 0:57 / /mnt_mstr/b rw,relatime - tmpfs tmpfs rw
696 677 0:58 / /mnt_shrd/c rw,relatime shared:345 - tmpfs tmpfs rw
748 678 0:59 / /mnt_mstr/d rw,relatime master:352 - tmpfs tmpfs rw

最初のシェル(shell_1)で行われたID 345352のマウントは両方とも伝播しており、slaveマウントのサブマウントのほうはmasterとなっていますので、ID 352に対するslaveマウントであることがわかります。