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 できない。
という理解であっているでしょうか?