Loop-Device
稀疏文件可以提高losetup的效率嗎?
所以我的設置是這樣的。
$ truncate -s 1T volume $ losetup -f --show volume /dev/loop0 $ mkfs.ext4 /dev/loop0 $ ls -sh volume 1.1G volume $ mount /dev/loop0 /mnt/loop
正如預期的那樣,現在我有一個 1.1TB 的捲。ext4 的成本將稀疏文件擴展為 1.1G,但這很好。現在添加一個文件。
$ dd if=/dev/urandom of=/mnt/loop/file bs=1M count=10240 $ ls -sh volume 12G volume
酷,現在我不想要這個文件了。
$ rm /mnt/loop/file $ ls -sh volume 12G volume
正如預期的那樣,可用空間仍在佔用空間,並
$ fallocate -d volume
釋放了 1gb。我的問題是,如何在不將捲擴展到完整大小的情況下將此處的可用空間歸零?
$ dd if=/dev/zero
會將其擴展為完整大小,並conv=sparse
使其在卷內創建一個無用的稀疏文件。TL;DR:有沒有辦法
losetup
忽略將空塊寫入空扇區,同時允許其他所有內容?
要在不再使用數據塊時自動丟棄它們,請使用
mount -o discard ...
. 或者您可以手動執行fstrim
.這個特性顯然是在 Linux 3.2 中添加到循環設備中的。 https://outflux.net/blog/archives/2012/02/15/discard-hole-punching-and-trim/
在一般情況下,
mount -o discard
不保證有效,因為某些類型的設備在忙時被允許忽略丟棄請求。不過,這與稀疏文件的大小無關。在這種一般情況下——例如,如果您還想向底層物理設備發送丟棄請求——最可靠的方法是
fstrim
定期執行。