chrootを実行した後にマウントされたディレクトリを正しくアンマウントする方法は?

chrootを実行した後にマウントされたディレクトリを正しくアンマウントする方法は?

通常、次のようにいくつかのディレクトリをchroot環境にマウントします。

mount -t proc /proc /mnt/chroot/proc
mount --rbind /dev /mnt/chroot/dev
mount --rbind /sys /mnt/chroot/sys
mount --rbind /run /mnt/chroot/run

ただし、完了時にマウントされたディレクトリをアンマウントできず、ディレクトリを使用して実行中のプロセスのリストを取得するように求められます。これは複数のプロセスリスト行を提供します。もしそうなら、これらのディレクトリを正しく削除する方法は?

ベストアンサー1

ファイルシステムのマウント解除を妨げる原因を見つける一般的な方法は、ファイルが開いているプロセス(またはファイル記述子、現在のディレクトリなど)を一覧表示することです。

lsof /path/to/mount/point
fuser -m /path/to/mount/point

プロセスのリストを見て、必要に応じて終了します。

カーネル自体は、カーネルの下に別のマウントポイントがある場合など、いくつかの方法でマウント解除を防止することもできます(マウント中は/mnt/chrootマウント解除できません)。/mnt/chroot/proc

バインドマウントを実行すると、上記のコマンドはファイルシステムへのすべてのパスを介してリストファイルを開きます。たとえば、経由またはファイルfuser -m /mnt/chroot/runシステムでファイルを開くプロセスを一覧表示します。/run/mnt/chroot/run

マウントポイントを使用するプロセスを見つけるには、プロセスとそのプロセスの開かれたファイルへのパスを一覧表示し、パスに対していくつかのフィルタリングを実行します。たとえば、

lsof /mnt/chroot/run | grep /mnt/chroot

またはすべてを取得します。

lsof | grep /mnt/chroot

または/proc直接訪問することができます:

ls -l /proc/[0-9]*/fd/* | grep /mnt/chroot

自動処理の場合(最新のヌル区切り文字がサポートさsedれていると仮定-z):

find /proc/[0-9]*/fd -type l -printf '%p %l/\0' |
sed -nz 's!^/proc/\([0-9]*\)/fd/[0-9]* /mnt/chroot/.*!\1!p' |
sort -nu

マウントされたファイルシステムの内容を実際に見つけることはできませんが、マウントポイントを再インポートする必要がある場合は、どこかに空のディレクトリを作成して実行してこれを実行できますmount --move /current/mount/point /empty/directory/out/of/the/way。また、遅延マウント解除(umount -l)を実行することもできます。ファイルシステムはすべてのマウントポイントにマウントされるわけではありません(したがってそのファイルを開くことはできません)、開いているファイルや他の参照がある限り、マウントされ続けます。

おすすめ記事