web-dev-qa-db-ja.com

rbindマウント後の再帰的なumount

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)

おそらく解決策はレイジーアンマウントを実行することですが、これは私にとってかなり危険に思えます。

私が見逃したこれを行うより良い方法はありますか?

13
natecornell

クレジットは 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

メルシー、ジル!

10
natecornell

これは私にとって正しく機能しました 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でマウントされたファイルシステムの場合、umountmount --make-rslaveについて不平を言っている場合、マウントを解除する前にdevice is busyを実行する必要がある場合があります。

4
Paul Tobias

それをありがとう。これをスクリプトで使用して、chrootツリー全体をアンマウントします(それに応じて$ MNTを設定してください)。

for dir in $(grep "$MNT" /proc/mounts | cut -f2 -d" " | sort -r)
do
    umount $dir 2> /dev/null
    (( $? )) && umount -n $dir
done
0
Justin Sane