Linux
何時在 ext 文件系統中釋放文件?
介紹
直到最近,我還認為在 ext 文件系統上,inode 具有引用計數器,用於計算文件被目錄條目或文件描述符引用的次數。
然後,我了解到引用計數器只計算引用它的目錄條目的數量。為了證明這一點,我使用
ls -l
. 正如我所料,它是 1,因為我沒有創建任何額外的硬連結。然後我用影片播放器打開影片文件並再次執行相同的命令。令我驚訝的是,引用計數仍然是 1。因此,我偽造失敗了。但是,在刪除其唯一的目錄條目後,我絕對可以繼續觀看影片。打開大影片文件並刪除其目錄條目時,文件系統上的可用儲存空間量不會改變。它僅在播放器到達影片末尾並關閉文件描述符或播放器自行終止(取決於所使用的影片播放器)時才會更改(根據影片文件的大小)。
問題
在 ext 文件系統上釋放文件的確切條件是什麼?我對它在 ext2、ext3 和 ext4 中的處理方式很感興趣。根據使用的核心或作業系統的其他部分是否存在差異?
您混淆了兩個不同的計數器:文件系統連結計數器和文件描述符引用計數器。
- 文件系統連結計數器計算文件系統本身中有多少指向 inode 的連結。inode 是包含文件元數據的結構。在 ext* 文件系統中,此計數器儲存在文件系統本身中。
您可以使用
ls -l
. 此外,您可以使用ls -i
來獲取文件的inode 號。例如,嘗試使用ln
和驗證所有連結是否具有相同的 inode 號來增加指向文件的連結。andcoz@tseenfoo:~/refcount> ls -li total 40 2248813 -rw-r--r-- 1 andcoz users 40960 7 feb 21.34 test andcoz@tseenfoo:~/refcount> ln test test2 andcoz@tseenfoo:~/refcount> ln test test3 andcoz@tseenfoo:~/refcount> ls -li total 120 2248813 -rw-r--r-- 3 andcoz users 40960 7 feb 21.34 test 2248813 -rw-r--r-- 3 andcoz users 40960 7 feb 21.34 test2 2248813 -rw-r--r-- 3 andcoz users 40960 7 feb 21.34 test3
- 文件描述符引用計數器計算文件被程序打開的次數,或者更正式地說,有多少文件描述符引用該 inode。此資訊儲存在核心記憶體中。
fuser
您可以使用命令獲得該值的近似值。此命令列出所有打開文件的程序。請注意,單個程序可以多次打開同一個文件,因此 fuser 列表大小較小,或者通常等於引用計數器。andcoz@tseenfoo:~/refcount> tail -f test & [3] 4226 andcoz@tseenfoo:~/refcount> fuser test /home/andcoz/refcount/test: 4226 andcoz@tseenfoo:~/refcount> tail -f test2 & [4] 4354 andcoz@tseenfoo:~/refcount> fuser test /home/andcoz/refcount/test: 4226 4354
當兩個計數器都為零時,從文件系統中刪除一個文件。