Ssd

文件系統 (ext4) 如何“儲存”TRIM 資訊?

  • February 8, 2019

建議啟用每週執行一次的 TRIM cron 作業。當呼叫 fstrim 命令時,文件系統會將 TRIM 資訊發送到驅動器以丟棄已刪除的數據(我希望我做對了)

到目前為止這麼好,這個描述很多地方。

但是我找不到任何關於這些 TRIM 資訊如何/在哪裡“儲存”在 fstrim 命令之間的文件系統中的任何資訊?

並且可以以某種方式“清除”這些 TRIM 資訊,以便 SSD 不會獲得所有必須丟棄的頁面/塊的資訊嗎?

或者 fstrim 命令會比較文件系統和 SSD 的實際刪除數據嗎?

我不知道 ext4 是否真的將它儲存在任何地方。其他文件系統當然不會。

ext4 僅在目前會話中避免它已經修剪的內容 - 當它仍然安裝時。一旦您重新啟動或重新掛載文件系統,它就會再次修剪空白空間。

所以這可能是一個根本不儲存的記憶體結構。我沒有深入研究非常精細的原始碼來找出答案。

一個小測試:

# truncate -s 1G /dev/shm/foobar.img
# losetup --find --show /dev/shm/foobar.img
/dev/loop9
# mkfs.ext4 /dev/loop9
# mkdir /mnt/loop

給定一個 1G 的文件系統,讓我們掛載和修剪它:

# mount /dev/loop9 /mnt/loop/
# fstrim -v /mnt/loop
/mnt/loop: 973.4 MiB (1020678144 bytes) trimmed
# fstrim -v /mnt/loop
/mnt/loop: 0 B (0 bytes) trimmed

所以它首先修剪所有……畢竟,這已經很可疑了:mkfs 也已經修剪過(哎喲),所以它應該知道它仍然是空的和修剪過的,對吧?好吧,如果它知道,它不在乎:

# umount /mnt/loop
# mount /dev/loop9 /mnt/loop
# fstrim -v /mnt/loop
/mnt/loop: 973.4 MiB (1020678144 bytes) trimmed

因此,重新安裝後,它只會再次修剪所有可用空間。

創建和刪除文件時,也不是精確的:

# dd bs=1M count=10 if=/dev/zero of=/mnt/loop/zerofile
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0124641 s, 841 MB/s
# sync
# rm /mnt/loop/zerofile
# fstrim -v /mnt/loop
/mnt/loop: 117.5 MiB (123203584 bytes) trimmed

因此,寫入 10M 會導致重新修剪 117M。它只是沒有任何意義。

只有 SSD 本身真正知道目前修剪了什麼,什麼沒有,當被要求修剪已經修剪的區域時,它應該什麼都不做。所以沒有傷害,也不需要真正將這些資訊儲存在文件系統中。

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