我想要準備一個 24TB 的磁碟,能夠在一個目錄中包含大量的目錄和文件(請不要告訴我改變這個策略,它是一個軟體使用的結構,對我們來說是一個黑盒子所以我們無法改變這種方法)。據我充分研究,ext4 文件系統有能力在一個目錄中儲存數十億個文件,但應該使用一些特殊的標誌和參數來準備。這是我根據我的研究使用的:
sudo mke2fs -T news /dev/sdb1
sudo tune2fs -O dir_index /dev/sdb1
sudo tune2fs -O large_dir /dev/sdb1
sudo tune2fs -O dir_nlink /dev/sdb1
sudo mkdir /hdd
sudo gedit /etc/fstab
- add following to the end of the file:
/dev/sdb1 /hdd ext4 defaults,noatime 0 0
sudo mount /hdd
為了測試結構,我準備了 bash 腳本,在單一目錄中建立目錄和檔案。像這樣的東西:
for ((i = 1000000; i <= 200000000; i++))
do
sudo mkdir "/hdd/largedir/$i" -p
sudo cp "sample-file.jpg" "/hdd/largedir/$i"
if (( $i % 1000 == 0 ));
then
echo "$i created";
fi;
done
經過幾個小時的工作後,當我檢查系統時,它會列印以下錯誤:
Structure needs cleaning
在我的測試中,它不是為所有文件和目錄列印此錯誤。例如,我可以建立名為「10000」的目錄,但無法建立名為「1000」的目錄。我還使用以下命令更改了哈希演算法:
sudo tune2fs -E "hash_alg=tea" /dev/sdb1
並重新啟動並重新安裝系統,但問題仍然存在。有誰知道問題是什麼以及為什麼檔案系統上會出現這種情況? ext4 檔案系統是否不夠強大,無法擁有如此大的結構?我在一些頁面上讀到有關使用 xfs 而不是 ext4 來處理大量文件的內容。這是真的嗎?
可以看到,在文件操作過程中,系統沒有出現斷電、當機的情況。當一切正常的時候我沒想到會有這樣的行為。
-- 已編輯以取得更多資訊:--
磁碟的inode資訊如下:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 421216256 183643803 237572453 44% /hdd
空間資訊如下:
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 26T 3.1T 21T 13% /hdd
我檢查了檔案系統,它是 ext4(如各種工具所示)。例如,gparted 將分割區檔案系統顯示為 ext4。關於功能,我的 ubuntu 18.04 LTS 上預設未啟用上述功能。我在先前的測試中遇到了幾個錯誤,最後達到了這個目的。
答案1
使用該命令,sudo mke2fs -T news /dev/sdb1
您不一定要建立 ext4 檔案系統,而是建立一個外部2文件系統。
假設您的 Ubuntu 18.04 具有/etc/mke2fs.conf
與我的 Debian 10 基本相同的文件,那麼dir_index
已經啟用作為使用現代 .NET 創建的所有 ext2/3/4 文件系統的當前基本功能集mke2fs
。並且dir_nlink
預設啟用外部4文件系統類型。
手冊mke2fs.conf(5)
頁說:「如果使用者和mke2fs.conf
檔案都沒有指定預設檔案系統類型,mke2fs
則將使用預設檔案系統類型外部3如果透過命令列選項請求日誌,或者外部2如果不。
根據該/etc/mke2fs.conf
文件,該-T news
選項只指定了inode_ratio = 4096
選項,沒有其他任何內容。因此,除非您使用mkfs.ext4
表單而不是普通表單mke2fs
,否則您可能會得到一個外部2專為平均大小為 4 kB 或更小的檔案而客製化的檔案系統。
Debian 沒有fs_type =
在[defaults]
部分中指定mke2fs.conf
,而且您沒有包含命令-j
的選項mke2fs
,因此如果 Ubuntu 的選項mke2fs.conf
與 Debian 的選項相同(通常如此),您的命令可能會為您提供 24 TB外部2文件系統,這可能還沒有經過任何人的特別測試。
手冊ext4(5)
頁說64bit
文件系統功能將根據需要自動設置,這可能解釋了為什麼這些工具沒有報告任何錯誤。它也表示dir_index
ext2 檔案系統會忽略該功能。
根據過去使用多 TBext3
檔案系統的經驗,我預期檔案系統的建立和檢查時間會很大。對於您的用例,該功能的存在或不存在dir_index
可能會影響或破壞您的應用程式效能。
您能否將實際tune2fs -l /dev/sdb1
輸出編輯為您原來的問題,以便我們無需猜測可能發生或可能未發生的情況?
「結構需要清理」似乎是與EUCLEAN
核心錯誤代碼相對應的預設文本,這表明檔案系統已損壞,需要進行檔案系統檢查。在這種大小的檔案系統上,這將需要相當多的時間和 RAM。當然,在檢查檔案系統時需要將其卸載。
答案2
實際上,經過大量測試後,我發現 ext4 似乎沒有能力做這樣的事情(在一個目錄中保存數十億個檔案)。根據我對如何在 Linux 中執行此操作的研究,結果(實際上也是我的實際測試)表明,對於這種情況,我應該使用 XFS 而不是 ext4,因為 ext4 確實是為了完成此任務而構建的。