Chrootに入るとき、誰かが見に行くときにすべてが正しい場所にあることを保証するために、-bindの代わりに-rbindを使用して/ sysと/ devをマウントする必要がある場合があります。
アンマウントするときに問題が発生します。
単純なumountは常に失敗します。子供たちも乗っているので、使用されているようです:
$ umount /mnt/chroot/sys
umount: /mnt/chroot/sys: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
別の可能な解決策は、procからのマウントを一覧表示し、それぞれを次のようにアンマウントすることです。
$ grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount
ただし、再帰的なマウントが実際にはmtabに登録されていないため、これも失敗します。
/mnt/chroot/sys/kernel/security is not mounted (according to mtab)
おそらく解決策はレイジーアンマウントを実行することですが、これは私にとってかなり危険に思えます。
私が見逃したこれを行うより良い方法はありますか?
クレジットは Gilles に送られます。 Gillesは、質問のコメントで、「-n」スイッチはmtabを無視し、/ proc/mountsにリストされているものはすべてマウント解除することに注意しました。
マンページから:
-n Unmount without writing in /etc/mtab.
--rbindマウントを解明する方法に関する私の質問に答えるために、これは私のために働いた完全なコマンドです:
grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount -n
メルシー、ジル!
これは私にとって正しく機能しました https://unix.stackexchange.com/a/264488/4319 :
mount --rbind /dev /mnt/test
mount --make-rslave /mnt/test
umount -R /mnt/test
最初の2つのコマンドを2つの別個のコマンドとして持つことが重要でした。1回のマウント呼び出しで--rbind
と--make-rslave
を組み合わせないでください。
--make-rslave
がない場合、動作は望ましくありませんでした(そして、成功しませんでした):
umount -l
は、元の古いマウントポイントにも影響します。umount -R
は、元の古いマウントポイントの下にあるビジー(オープン)ファイルの影響を受けます。 (非常に予想外...)til-linux v2.2 (25-Apr-2013)以降、umount
コマンドは-R, --recursive
オプションをサポートします。
マニュアルページの内容は次のとおりです。
指定された各ディレクトリを再帰的にマウント解除します。チェーン内のアンマウント操作が何らかの理由で失敗した場合、各ディレクトリの再帰は停止します。マウントポイント間の関係は、
/proc/self/mountinfo
エントリによって決定されます。ファイルシステムはマウントポイントパスで指定する必要があります。デバイス名(またはUUID)による再帰的なアンマウントはサポートされていません。
--rbind
でマウントされたファイルシステムの場合、umount
がmount --make-rslave
について不平を言っている場合、マウントを解除する前にdevice is busy
を実行する必要がある場合があります。
それをありがとう。これをスクリプトで使用して、chrootツリー全体をアンマウントします(それに応じて$ MNTを設定してください)。
for dir in $(grep "$MNT" /proc/mounts | cut -f2 -d" " | sort -r)
do
umount $dir 2> /dev/null
(( $? )) && umount -n $dir
done