マウントプロパゲーション(8)〜 Namespaceとプロパゲーション(2)〜
これまでの続きです。まだまだ続きます。
- マウントプロパゲーション(1)〜 shared mount 〜 - TenForward
- マウントプロパゲーション(2)〜 private mount 〜 - TenForward
- マウントプロパゲーション(3)〜 slave mount 〜 - TenForward
- マウントプロパゲーション(4)〜 unbindable mount 〜 - TenForward
- マウントプロパゲーション(5)〜 mountinfoファイル 〜 - TenForward
- マウントプロパゲーション(6)〜 mountinfoファイル(2)〜 - TenForward
- マウントプロパゲーション(7)〜 Namespaceとプロパゲーション(1)〜 - TenForward
これまでと同様に完全に私個人が理解するための資料です(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が345
と352
の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 345
と352
のマウントは両方とも伝播しており、slaveマウントのサブマウントのほうはmaster
となっていますので、ID 352に対するslaveマウントであることがわかります。