Chroot

執行 chroot 後如何正確解除安裝掛載的目錄?

  • May 6, 2015

通常,我將一些目錄掛載到 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

但是,完成後,我無法解除安裝那些已安裝的目錄,並且有一條消息要獲取使用目錄的正在執行的程序列表,這給了我一堆程序列表。那麼,如何正確解除安裝這些目錄呢?

查找阻止文件系統解除安裝的正常方法是列出打開文件的程序(或文件描述符,或其目前目錄等):

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),這會導致文件系統根本沒有掛載點(因此無法再打開其上的文件),但只要有打開的文件或其他引用,它仍會被掛載。

引用自:https://unix.stackexchange.com/questions/200320