據英特爾稱,在固態硬碟上建立 Linux 檔案系統時,不要丟棄區塊,這一點很重要。該文件指出(2015 年 3 月)的預設行為mke2fs
是不丟棄區塊。然而,目前的mke2fs
手冊頁指出:
丟棄:嘗試在 mkfs 時丟棄區塊(最初丟棄區塊對於固態裝置和稀疏/精簡配置儲存很有用)。當設備通告丟棄也將資料清零時(丟棄之後和寫入之前的任何後續讀取都傳回零),則將所有尚未清除的 inode 表標記為清零。這顯著加快了檔案系統初始化的速度。這是預設設定。
當我手動格式化 SSD 時,我可以透過新增-E nodiscard
至mke2fs
命令列來防止格式化期間區塊丟棄,但由於分送安裝程式是自動的,因此不可能執行此操作。這是值得擔心的事嗎?
答案1
連結的文檔似乎有特定目的(Linux 核心 NVME 驅動程式開發和基準測試),並不代表對最終用戶的一般建議。
它聲稱 ext4 不會在 mkfs 時丟棄...
核心檔案系統:
- ext4 – 預設的擴充選項不是在檔案系統建立時丟棄區塊,保留它,並且不要像某些資訊會告訴您的那樣添加「丟棄」擴充選項。
- xfs – 對於 mkfs.xfs,新增 –K 選項,這樣就不會丟棄區塊。
……但確實如此。這是它所做的第一件事。
# mkfs.ext4 /dev/loop0
mke2fs 1.46.4 (18-Aug-2021)
Discarding device blocks: done
Creating filesystem [...]
因此,如果您不想丟棄所有數據,則需要主動阻止它,對於 xfs 使用mkfs.xfs -K
建議,對於 ext4 使用mkfs.ext4 -E nodiscard
.
# mkfs.ext4 -E nodiscard /dev/loop0
mke2fs 1.46.4 (18-Aug-2021)
Creating filesystem [...]
我不知道預設行為是否改變過。據我所知,它一直是默認的。在 -E 丟棄、nodiscard 選項出現之前,還有 -K 來保留資料(禁用預設丟棄),而沒有對應的選項來啟用丟棄(預設為停用)。
手冊頁曾經聲稱 nodiscard 是預設值,但我沒有看到它反映在提交歷史記錄中任何地方的程式碼中,所以也許它可以追溯到文檔錯誤。
mke2fs:棄用-K選項,引入discard/nodiscard
(實際上,在這次提交中,它同時聲明了discard和nodiscard都是預設的。)
如果 nodiscard 是預設值並且 fstrim 直到一週後才可能實現,那就太好了。 Linux 丟棄資料的速度有點快。格式化錯誤的設備,即使您立即發現錯誤,也已經來不及進行任何類型的資料復原了。
答案2
前期:不太買單。
該文件較舊,可能不再準確。
而且,這也可能是錯的。歷史上圍繞著這一點存在著許多誤解,編寫指南的人不一定與來自同一家公司為 Linux 核心做出貢獻的人是同一個人。情況確實很複雜——對一個 SSD 進行最佳化可能對另一個 SSD 來說是最糟糕的事情,而且晶片組製造商還沒有找到一種方法來傳達其控制器的偏好。
然而,NVMe 丟棄功能早已標準化(英特爾已經參與其中,實際上,占主導地位),這就是它的預期用途,所以如果它不“好”,我會感到有點驚訝。
總而言之,使用丟棄可以為 SSD 提供更多資訊 - 它如何處理這些資訊取決於 SSD。因此,如果您了解更多可能忽略的信息,情況會更糟:這實際上是 SSD 控制器韌體問題,而不是驅動程式問題。我敢打賭,英特爾對 Linux 資料中心的良好支援非常感興趣,早就解決了這個問題。