web-dev-qa-db-ja.com

バインドマウントがアンマウントされない原因を特定するにはどうすればよいですか?

マウントポイントがビジー状態でアンマウントできないという問題があります。通常、lsofまたはfuserは、どのプロセスがそれを使用しているかを教えてくれますが、これはバインドマウントであるため、lsofとfuserは、元のマウントポイントとバインドマウントポイントの両方を使用しているものを示します。

例:

ファイルシステムをマウントします。

$ Sudo mkdir /mnt/mount /mnt/bind
$ Sudo mount /dev/sdb1 /mnt/mount
$ Sudo mount -o bind /mnt/mount /mnt/bind

/ mnt/mountをビジー状態にしてマウントを解除できないプロセスを開始します

$ Sudo dd if=/dev/zero of=/mnt/mount/testfile bs=1 oflag=dsync

フューザーの内容を確認してください

$ Sudo fuser -m /mnt/mount
/mnt/mount:           4022
$ Sudo fuser -m /mnt/bind
/mnt/bind:            4022

Lsofの内容を確認してください

$ Sudo lsof +D /mnt/mount
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dd      4022 root    1w   REG   8,17    28545   12 /mnt/mount/testfile

$ Sudo lsof +D /mnt/bind
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dd      4022 root    1w   REG   8,17    40682   12 /mnt/bind/testfile

両方をアンマウントしてみてください

$ Sudo umount -v *
umount: /mnt/bind (/mnt/mount) unmounted
umount: /mnt/mount: target is busy

同じ手順を実行するが、代わりにファイルを/ mnt/bind/testfileに書き込むようにddに指示すると、/ mnt/mountのアンマウントは成功しますが、/ mnt/bindのアンマウントは失敗します。

明らかに、プロセス(この場合はdd)が使用しているマウントポイントに違いがありますが、lsofとfuserは区別されません。何かありますか?

2
Tal

Wurtelのおかげで、これが明らかになりました。

私の質問で使用されているfuserとlsofはどちらも、両方のマウントポイントを使用した同じプロセスを示していますが、これらのコマンドのいずれかがPIDを通知した後、次のように実行します。

lsof -p $PID

どのマウントポイントが使用されているかを正確に明らかにします。少しgrepを実行すると、設定が完了します。

1
Tal