![哪些 Linux 檔案系統支援預先分配整個檔案以減少 Torrent/Gnutella 檔案碎片?](https://rvso.com/image/231082/%E5%93%AA%E4%BA%9B%20Linux%20%E6%AA%94%E6%A1%88%E7%B3%BB%E7%B5%B1%E6%94%AF%E6%8F%B4%E9%A0%90%E5%85%88%E5%88%86%E9%85%8D%E6%95%B4%E5%80%8B%E6%AA%94%E6%A1%88%E4%BB%A5%E6%B8%9B%E5%B0%91%20Torrent%2FGnutella%20%E6%AA%94%E6%A1%88%E7%A2%8E%E7%89%87%EF%BC%9F.png)
據我了解,至少在 Linux ext3 檔案系統中,當建立一個大檔案時,在資料實際寫入檔案的該部分之前,這些區塊實際上不會分配到磁碟上。當程式分配記憶體時,Linux 會執行類似的操作,其中分配是惰性的,並且在將資料寫入頁面之前實際上不會分配頁面,但這是另一個主題。
當 Bittorrent 和 Gnutella 等檔案共用程式寫入檔案時,它們會在檔案的隨機區域寫入小塊。 Linux 檔案系統將檔案的這些部分放在磁碟上,從而產生大量碎片。當像這樣同時寫入多個文件時,問題尤其嚴重。即使在文件共享程式中選擇預分配文件似乎也沒有幫助。通常只能以 10MB/秒的速度讀取這些文件,並會產生大量碎片。 filefrag 實用程式可用於檢視檔案有多少個片段。像 /var/log/messsages 這樣的檔案是測試的好地方。
對於 ext3,我假設大多數其他 Linux 文件系統也是如此,實際上必須將一些資料寫入整個文件,以便從頭到尾真正擁有一個完全分配的文件,並且碎片最少。
我可以嘗試在 Linux 中安裝 NTFS 卷,但一定有更好的方法!有 ext4、btrfs、xfs、jfs、ReiserFS、ExFAT,甚至 FAT32 可供考慮!這些預先分配檔案中的任何一個,或至少有一個 API 允許執行此操作,而無需先將資料寫入整個檔案?
答案1
到 2024 年,以下 Linux 檔案系統支援檔案預先分配posix_fallocate()
:
本機檔案系統:
- bcachefs(目前處於高度實驗階段,不建議一般使用)
- BTFS
- 外部4/外部3
- F2FS
- NTFS3(
prealloc
必須指定安裝選項才能啟用此功能) - FAT/FAT32
- XFS
網路檔案系統:
- GFS2
- 網路檔案系統
- OCFS2
- CIFS/桑巴
重要考慮因素:
- 應用程式必須使用此功能
- 如果您的檔案系統已經[高度]碎片且沒有足夠大小的孔,則預先分配可能不會產生最佳結果。
- 假設有足夠的可用空間來正確對齊檔案:
- 在 Linux 下,只有 XFS 可以完全進行碎片整理(意味著您也可以對可用空間進行碎片整理)
- 在 Windows 中,您顯然可以對 NTFS/VFAT 進行完全碎片整理。