Loop-Device

稀疏文件可以提高losetup的效率嗎?

  • August 23, 2018

所以我的設置是這樣的。

$ 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定期執行。

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