引き続きマウントプロパゲーションについて書いていきます。完全に私個人が理解するための資料です。間違いの指摘は大歓迎です。
shared と private を説明すれば、頭の良い皆さんはもう slave がどのような動きになるのかわかったのではないでしょうか。
slaveは、複数のマウントの間に主従関係が生じます。マスター配下のマウント操作はスレーブ配下に伝播しますが、スレーブ配下のマウント操作はマスターには伝播しません。
これまでと同じような例を用いて説明しましょう。まずはorigをbindにバインドマウントします。
# mount --bind orig bind # cat /proc/self/mountinfo | grep bind 133 30 253:0 /root/test/orig /root/test/bind rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-ubuntu--lv rw
そしてorig側のマウントをsharedに、bind側のマウントをslaveに設定します。
# mount --make-shared / # mount --make-slave bind # cat /proc/self/mountinfo :(略) 30 1 253:0 / / rw,relatime shared:1 - ext4 /dev/mapper/ubuntu--vg-ubuntu--lv rw :(略) 133 30 253:0 /root/test/orig /root/test/bind rw,relatime master:1 - ext4 /dev/mapper/ubuntu--vg-ubuntu--lv rw # tree . . ├── bind │ ├── tmp │ └── tmp2 └── orig ├── tmp └── tmp2 6 directories, 0 files
/proc/self/mountinfoを確認すると、orig側のマウントポイントである/はsharedに、bindはmasterと書かれており、/のsharedのあとに書かれた番号(1)と同じ番号が書かれています。これはbindは/(つまりorig側)のslaveであることを示しています。origにはこれまでの例のようにあらかじめディレクトリがふたつ作成されています。
ここで、これまでの例と同様にorig/tmpにtmpfsをマウントしてファイルを作成しましょう。
# mount -t tmpfs tmpfs orig/tmp # touch orig/tmp/testfile # tree . . ├── bind │ ├── tmp │ │ └── testfile │ └── tmp2 └── orig ├── tmp │ └── testfile └── tmp2 6 directories, 2 files
orig側はsharedですのでbind側にも同じマウントが伝播し、同じようなツリーが見えます。
それでは逆にbind/tmp2にtmpfsをマウントし、ファイルを作成します。
# mount -t tmpfs tmpfs bind/tmp2 # touch bind/tmp2/testfile2 # tree . . ├── bind │ ├── tmp │ │ └── testfile │ └── tmp2 │ └── testfile2 └── orig ├── tmp │ └── testfile └── tmp2 6 directories, 3 files
確認してみると、bind/tmp2で行ったtmpfsのマウントはorigでは見えていないことがわかります。つまりorig側のマウントはbind側に伝播しますが、逆は伝播しないということです。
マウント情報も確認しておきましょう。
# cat /proc/self/mountinfo :(略) 714 30 0:74 / /root/test/orig/tmp rw,relatime shared:346 - tmpfs tmpfs rw 729 133 0:74 / /root/test/bind/tmp rw,relatime master:346 - tmpfs tmpfs rw 742 133 0:75 / /root/test/bind/tmp2 rw,relatime - tmpfs tmpfs rw :(略)
orig/tmpはsharedで、bind/tmpはorig/tmpを参照するslaveであり、bind/tmp2はprivateでorig/tmp側には伝播していなことが確認できます。