Disk-Usage

通過用 999 個硬連結和 1 個文件替換 1000 個相同的 1 字節文件,我可以在 ext4 上節省多少空間?

  • February 26, 2021

我有一個ext4格式化的磁碟,其中包含數千個自動生成且需要的文件。其中幾千個只有一個字節長,有些是兩個字節。兩組小文件中的所有文件都是相同的。

通過定位這些(例如 1000 個)長度為 1 字節的文件,刪除每個文件並硬連結到單個代表性文件,我可以節省多少空間?

像這樣:

# ls -l
-rw-r----- 1 john john 1 Feb 25 10:29 a
-rw-r----- 1 john john 1 Feb 25 10:29 b
-rw-r----- 1 john john 1 Feb 25 10:29 c
# du -kcs ?
4   a
4   b
4   c
12  total

嘗試鞏固:

# rm b c
# ln a b
# ln a c
ll
total 12
-rw-r----- 3 john john 1 Feb 25 10:29 a
-rw-r----- 3 john john 1 Feb 25 10:29 b
-rw-r----- 3 john john 1 Feb 25 10:29 c
# du -kcs ?
4   a
4   total

(請注意,du它甚至沒有列出bc我覺得很好奇)。

問:如果分配塊大小為 4 KiB,真的那麼容易嗎?在我的 1000 個文件場景中可以節省 999*4 KiB 嗎?

或者,是否ext4有能力透明地“合併尾部”,或將小文件儲存在“目錄 inode”中(我隱約記得有些文件系統可以做到這一點)?

(我知道文件分配塊可能會有所不同,並且類似的命令tune2fs -l /dev/sda1可以告訴我。)

儲存文件分為三個部分:用於儲存文件內容的塊、用於儲存文件元數據的 inode 以及指向該 inode 的目錄條目(或多個條目)。

當您創建多個單獨的文件時,在最常見的情況下,您支付的費用與文件數量一樣多。

使用內聯數據(如果您的文件系統是使用適當的選項創建的),如果文件足夠小,您可以保存用於儲存文件內容的塊,但您仍然需要每個文件一個 inode 和每個文件至少一個目錄條目。

使用硬連結,您可以保存用於儲存文件內容inode 的塊:只有一個 inode、一個文件數據實例(無論是 inode 內聯還是單獨的),以及與連結一樣多的目錄條目。

鑑於您無論如何都需要儲存目錄條目,硬連結實際上是免費的。其他任何事情都將涉及更多儲存;究竟多少取決於您的文件系統的特定設置。

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