Linux

何時在 ext 文件系統中釋放文件?

  • February 7, 2017

介紹

直到最近,我還認為在 ext 文件系統上,inode 具有引用計數器,用於計算文件被目錄條目或文件描述符引用的次數。

然後,我了解到引用計數器只計算引用它的目錄條目的數量。為了證明這一點,我使用ls -l. 正如我所料,它是 1,因為我沒有創建任何額外的硬連結。然後我用影片播放器打開影片文件並再次執行相同的命令。令我驚訝的是,引用計數仍然是 1。因此,我偽造失敗了。

但是,在刪除其唯一的目錄條目後,我絕對可以繼續觀看影片。打開大影片文件並刪除其目錄條目時,文件系統上的可用儲存空間量不會改變。它僅在播放器到達影片末尾並關閉文件描述符或播放器自行終止(取決於所使用的影片播放器)時才會更改(根據影片文件的大小)。

問題

在 ext 文件系統上釋放文件的確切條件是什麼?我對它在 ext2、ext3 和 ext4 中的處理方式很感興趣。根據使用的核心或作業系統的其他部分是否存在差異?

您混淆了兩個不同的計數器:文件系統連結計數器和文件描述符引用計數器。

  1. 文件系統連結計數器計算文件系統本身中有多少指向 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
  1. 文件描述符引用計數器計算文件被程序打開的次數,或者更正式地說,有多少文件描述符引用該 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

當兩個計數器都為零時,從文件系統中刪除一個文件。

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