マウントプロパゲーション(3)〜 slave mount 〜
引き続きマウントプロパゲーションについて書いていきます。完全に私個人が理解するための資料です。間違いの指摘は大歓迎です。
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
側には伝播していなことが確認できます。