通常、次のようにいくつかのディレクトリを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
)を実行することもできます。ファイルシステムはすべてのマウントポイントにマウントされるわけではありません(したがってそのファイルを開くことはできません)、開いているファイルや他の参照がある限り、マウントされ続けます。
答え2
chroot "内部"で実行中のプロセスがある場合(シェルが終了した後でも)、ファイルシステムをアンマウントできない可能性があります(つまり、そのプロセスの下からファイルシステムを引き出すことはできません)。
この場合、シェルでchrootを再入力してサービスを停止するか、状態などに興味がない場合は、サービスを直接終了します(chroot "外部"でも)。