Mount
為什麼帶有活動工作目錄的掛載“忙”?
如果我移動或刪除程序仍在使用的文件或目錄,Linux 似乎並不介意。那麼,如果我嘗試解除安裝某個程序正在用作工作目錄的設備,它為什麼會抱怨呢?
例子:
$ mkdir -p a b $ sudo mount --bind a b $ sh -c 'cd b; sleep 10' & [1] 215679 $ sudo umount b umount: /home/laktak/b: target is busy. $ [1]+ Done sh -c 'cd b; sleep 10' $ sudo umount b $
相對於:
$ mkdir c $ sh -c 'cd c; sleep 10; pwd; cd ..' & [1] 220382 $ rmdir c $ $ pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory chdir: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory $ [1]+ Done sh -c 'cd c; sleep 10; pwd; cd ..'
這裡有一個明顯的區別:在 ext2/3/4 文件系統上,通過文件名“刪除”文件意味著對 inode 的引用,即文件數據附加到的資料結構被刪除(文件名你see in
ls
只是對該 inode 的引用)。僅當最後一個此類引用消失時,文件才被視為“已刪除”(如果您有興趣,可以查看“硬連結”的概念)。但是,如果您打開一個文件,該行為也會創建對該 inode 的引用,因此只要文件處於打開狀態,它實際上並沒有被“刪除”,並且打開文件的程序仍然可以使用它。對於打開的目錄也是如此。只要您仍然
cd
在目錄中,該目錄仍然存在,即使您從另一個 shell 實例中刪除了它。但是,它已經處於“降級”狀態,並且不再可以從其他程序訪問,即使從仍然存在的 shell 實例中,您也無法在該目錄中創建新文件。(請注意,我無法重現您在第二個範例中顯示的行為:當我在bash
4.3中執行相同的程式碼時,pwd
即使在從主 shell 實例中刪除目錄名稱後也會正確列印目錄名稱)。另一方面,解除安裝設備用於切斷與所包含文件的所有連接,並刷新所做的所有更改,因此當有人仍在“那裡”時,作業系統將拒絕這樣做。