TenForward

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

マウントプロパゲーション(3)〜 slave mount 〜

引き続きマウントプロパゲーションについて書いていきます。完全に私個人が理解するための資料です。間違いの指摘は大歓迎です。

tenforward.hatenablog.com

tenforward.hatenablog.com

shared と private を説明すれば、頭の良い皆さんはもう slave がどのような動きになるのかわかったのではないでしょうか。

slaveは、複数のマウントの間に主従関係が生じます。マスター配下のマウント操作はスレーブ配下に伝播しますが、スレーブ配下のマウント操作はマスターには伝播しません。

これまでと同じような例を用いて説明しましょう。まずはorigbindにバインドマウントします。

# 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に、bindmasterと書かれており、/の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/tmporig/tmpを参照するslaveであり、bind/tmp2はprivateでorig/tmp側には伝播していなことが確認できます。