だから私の設定はこんな感じです。
$ 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
ボリューム内に無駄なスパースファイルが作成されます。
losetup
重要な要約:空のブロックで空のセクタへの書き込みを無視し、他のすべてを許可する方法はありますか?
ベストアンサー1
データブロックが使用されなくなったときに自動的に削除するには、を使用しますmount -o discard ...
。または手動で実行することもできますfstrim
。
この機能はLinux 3.2のループデバイスに追加されているようです。 https://outflux.net/blog/archives/2012/02/15/discard-hole-punching-and-trim/
通常、mount -o discard
一部のタイプのデバイスは、使用中に削除要求を無視する可能性があるため、動作は保証されません。ただし、これはスパースファイルのサイズには影響しません。
この一般的な場合(たとえば、基本物理デバイスに削除要求を送信したい場合など)、最も信頼できる方法はfstrim
定期的に実行することです。