マウントプロパゲーション(6)〜 mountinfoファイル(2)〜
これまでの続きです。
- マウントプロパゲーション(1)〜 shared mount 〜 - TenForward
- マウントプロパゲーション(2)〜 private mount 〜 - TenForward
- マウントプロパゲーション(3)〜 slave mount 〜 - TenForward
- マウントプロパゲーション(4)〜 unbindable mount 〜 - TenForward
- マウントプロパゲーション(5)〜 mountinfoファイル 〜 - TenForward
これまでと同様に完全に私個人が理解するための資料です。間違いの指摘は大歓迎です。
前回書ききれなかった /proc/[PID]/mountinfo
ファイルのエントリーのお話です。
unbindableの場合
unbindableを指定した場合は次のようなエントリになります。
369 31 252:2 /root/test/test/orig /root/test/test/bind rw,relatime unbindable - ext4 /dev/vda2 rw
propagate_fromの場合
propagete_from
はslaveマウントなのですが、slaveとなっているマウントからmasterが見えないときに表示されます。これは、例えばchroot
したあと、masterとなるマウントがroot範囲外となった場合などに起こります。
図1のように、②を③にバインドマウントし、③を④にバインドマウントし、②は③のmaster、③は④のmasterとなっているとします(③のようにmasterかつslaveという設定ができます)。
このようにslaveが連鎖した状態で①の/mnt
にchroot
すると、④からmasterである③は見えません。③は②のslaveであり、④から②は見えますので、④のエントリにはpropagate_from:②
のように書かれます。実際は②はマウントポイントではないので、IDとしては①のIDが書かれます。
文章にするとわかりづらいですね。実際に試してみましょう(実際に試してもわかりづらいですが…)。
まずは後の操作の準備を行います。ここでは次のような操作を行います。
/
を/mnt
にバインドマウントする/proc
を/mnt/proc
にバインドマウントする/mnt
を一度privateにする。これは/mnt
はsharedにしたいのですが、他と共有を行わない独立したsharedとするためです/mnt
をsharedにする
これで/mnt
は独自のIDを持つsharedマウントとなります。
# mount --bind / /mnt ... (1) # mount --bind /proc /mnt/proc ... (2) # mount --make-private /mnt ... (3) # mount --make-shared /mnt ... (4) # cat /proc/self/mountinfo | grep "/mnt" 231 25 8:1 / /mnt rw,relatime shared:124 - ext4 /dev/sda1 rw,errors=remount-ro,data=ordered 238 231 0:4 / /mnt/proc rw,nosuid,nodev,noexec,relatime shared:13 - proc proc rw
ここでmountinfo
ファイルを確認すると上のようになります。ここで/mnt
に割り当たっているIDは124となっていますが、これは他とマウントは共有していないマウントです。
次にひとつめのslaveマウントを作成します。図1の②を③にバインドマウントします。
# mkdir /mnt2/etc # mount --bind /mnt/etc /mnt2/etc # cat /proc/self/mountinfo | grep "/mnt" 231 25 8:1 / /mnt rw,relatime shared:124 - ext4 /dev/sda1 rw,errors=remount-ro,data=ordered 238 231 0:4 / /mnt/proc rw,nosuid,nodev,noexec,relatime shared:13 - proc proc rw 252 25 8:1 /etc /mnt2/etc rw,relatime shared:124 - ext4 /dev/sda1 rw,errors=remount-ro,data=ordered
これだけでは上のように③(/mnt2/etc
)は②(/mnt/etc
、つまりは①の/mnt
)とマウントを共有するsharedマウントになっていますので、slaveに設定した上で、あとで行うバインドマウントのためにsharedにも設定します。
- ③(`/mnt2/etc')をslaveに設定する
- ③をsharedに設定する
# mount --make-slave /mnt2/etc ... (1) # mount --make-shared /mnt2/etc ... (2) # cat /proc/self/mountinfo | grep "/mnt" 231 25 8:1 / /mnt rw,relatime shared:124 - ext4 /dev/sda1 rw,errors=remount-ro,data=ordered 238 231 0:4 / /mnt/proc rw,nosuid,nodev,noexec,relatime shared:13 - proc proc rw 252 25 8:1 /etc /mnt2/etc rw,relatime shared:131 master:124 - ext4 /dev/sda1 rw,errors=remount-ro,data=ordered
mountinfo
を確認すると③(/mnt2/etc
)は独自のID(131)を持つshared、かつ①のマウント(②のマウントポイント)を参照するslaveとなっています(masterが①のIDである124)。
さらに次のslaveマウントを行います。
- ③(
/mnt2/etc
)を④(/mnt/tmp/etc
)にバインドマウントする - ④(
/mnt/tmp/etc
)をslaveに設定する
# mkdir /mnt/tmp/etc # mount --bind /mnt2/etc /mnt/tmp/etc ... (1) # mount --make-slave /mnt/tmp/etc ... (2) # cat /proc/self/mountinfo | grep "/mnt" 231 25 8:1 / /mnt rw,relatime shared:124 - ext4 /dev/sda1 rw,errors=remount-ro,data=ordered 238 231 0:4 / /mnt/proc rw,nosuid,nodev,noexec,relatime shared:13 - proc proc rw 252 25 8:1 /etc /mnt2/etc rw,relatime shared:131 master:124 - ext4 /dev/sda1 rw,errors=remount-ro,data=ordered 265 231 8:1 /etc /mnt/tmp/etc rw,relatime master:131 - ext4 /dev/sda1 rw,errors=remount-ro,data=ordered
mountinfo
を確認すると④(/mnt/tmp/etc
)は③(/mnt/etc
)をmasterとするslaveになっていることがわかります。
これで図1の状態になりましたので、①(/mnt
)にchroot
してみましょう。
# chroot /mnt # cat /proc/self/mountinfo 231 25 8:1 / / rw,relatime shared:124 - ext4 /dev/sda1 rw,errors=remount-ro,data=ordered 238 231 0:4 / /proc rw,nosuid,nodev,noexec,relatime shared:13 - proc proc rw 265 231 8:1 /etc /tmp/etc rw,relatime master:131 propagate_from:124 - ext4 /dev/sda1 rw,errors=remount-ro,data=ordered
③(/mnt2/etc
)が④(/mnt/tmp/etc
)から見えなくなりましたので、④のエントリーには②(つまりは①)のIDである124がpropagate_from
として表示されています。