unshare -m でマウント名前空間を分離したプロセスがマウントしているデバイスには mkfs できない?
当たり前といえば当たり前だと思いますが...。
環境
% uname -rsm
Linux 4.20.8-arch1-1-ARCH x86_64
手順
デバイスをマウントさせるスクリプトを用意しておき、以下の手順をおこないます。
unshare -m スクリプト
を実行。マウント名前空間を分離させる- 別の名前空間(というかデフォルトの名前空間?)からデバイスを
mkfs
する
という手順を実施すると、 mkfs
で失敗します。
詳細
以下のようなスクリプトを用意します。ファイルを生成し、ループバックデバイスを使ってマウントします。
sweep() {
echo got signal
umount /mnt
losetup -d ${dev}
echo bye
exit 0
}
trap sweep INT TERM QUIT
dev=$(losetup -f)
dd if=/dev/zero of=./hoge.img bs=1M count=10
losetup ${dev} ./hoge.img
mkfs.ext4 -F ${dev}
mount ${dev} /mnt
echo ----
mount
echo ----
echo loop... $$
while true; do
sleep 1
done
スクリプトを unshare
で実行します。
% sudo unshare -m ./mount1.sh
略
/dev/loop0 on /mnt type ext4 (rw,relatime) ← /dev/loop0 が /mnt にマウントされた
----
loop... 28543 ←プロセスID
別の端末を開き(上記プロセスとは異なるマウント名前空間)、 mount
を実行します。 /dev/loop0 on /mnt
が無いことを確認します。
% mount
略
その端末で mkfs
を実行すると失敗します。「システムにより使用されている」と言われます。
% sudo mkfs.ext4 -F /dev/loop0
mke2fs 1.44.5 (15-Dec-2018)
/dev/loop0 contains a ext4 file system
last mounted on Thu Mar 7 17:32:58 2019
/dev/loop0 is apparently in use by the system; will not make a filesystem here!
質問
プロセス 28543
が /dev/loop0
をマウントしているので、異なるマウント名前空間からは /dev/loop0
はマウントされてないように見えるが、 実際は /dev/loop0
はプロセス 28543
により使用されている。よって、 /dev/loop0
は mkfs
できない。
という理解であっているでしょうか?