Mount

為什麼帶有活動工作目錄的掛載“忙”?

  • November 25, 2020

如果我移動或刪除程序仍在使用的文件或目錄,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 inls只是對該 inode 的引用)。僅當最後一個此類引用消失時,文件才被視為“已刪除”(如果您有興趣,可以查看“硬連結”的概念)。但是,如果您打開一個文件,該行為也會創建對該 inode 的引用,因此只要文件處於打開狀態,它實際上並沒有被“刪除”,並且打開文件的程序仍然可以使用它。

對於打開的目錄也是如此。只要您仍然cd在目錄中,該目錄仍然存在,即使您從另一個 shell 實例中刪除了它。但是,它已經處於“降級”狀態,並且不再可以從其他程序訪問,即使從仍然存在的 shell 實例中,您也無法在該目錄中創建新文件。(請注意,我無法重現您在第二個範例中顯示的行為:當我在bash4.3中執行相同的程式碼時,pwd即使在從主 shell 實例中刪除目錄名稱後也會正確列印目錄名稱)。

另一方面,解除安裝設備用於切斷與所包含文件的所有連接,並刷新所做的所有更改,因此當有人仍在“那裡”時,作業系統將拒絕這樣做。

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