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
但是,完成後,我無法解除安裝那些已安裝的目錄,並且有一條消息要獲取使用目錄的正在執行的程序列表,這給了我一堆程序列表。那麼,如何正確解除安裝這些目錄呢?
查找阻止文件系統解除安裝的正常方法是列出打開文件的程序(或文件描述符,或其目前目錄等):
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
),這會導致文件系統根本沒有掛載點(因此無法再打開其上的文件),但只要有打開的文件或其他引用,它仍會被掛載。