NetBSD discard - hpaluch/hpaluch.github.io GitHub Wiki
NetBSD TRIM/DISCARD support
There is one command with 2 aliases:
blkdiscardwill discard data by default (so be careful)fdiscardwill dry-run by default and must be enabled with (-R)
Problems:
- not supported on
virtio-blk(ldX) devices
Here is what happened (under KVM):
cd /usr/INSTALL # lot of .tgz and tar.xz files there
echo *z | xargs -n1 fdiscard -Rv
debug.tar.xz: stat size is 474039544
going to fdiscard(2) on debug.tar.xz from byte 0 for 474039544 bytes, 33554432 at a time
fdiscard: fdiscard: Operation not supported
gnusrc.tgz: stat size is 342844311
going to fdiscard(2) on gnusrc.tgz from byte 0 for 342844311 bytes, 33554432 at a time
fdiscard: fdiscard: Operation not supported
Alternative - zero-out and tell qemu-img to search and remove zeores
- trying that:
# in NetBSD guest
cd /usr/INSTALL
file src.tgz
src.tgz: gzip compressed data, max compression, ...
nb260727-ref# fdiscard -Rvz src.tgz
src.tgz: stat size is 326881328
going to zero out on src.tgz from byte 0 for 326881328 bytes, 33554432 at a time
..........
nb260727-ref# file src.tgz
src.tgz: data
nb260727-ref# dd if=src.tgz count=1 | hexdump -C
1+0 records in
1+0 records out
512 bytes transferred in 0.001 secs (512000 bytes/sec)
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000200
( OK: zero out all tarballs)
nb260727-ref# echo *z | xargs -n1 fdiscard -Rvz
debug.tar.xz: stat size is 474039544
going to zero out on debug.tar.xz from byte 0 for 474039544 bytes, 33554432 at a time
...............
nb260727-ref# sync
nb260727-ref# rm *z
Now we will try to free zeroed-out space on KVM Host:
( note: VM must be shut-off!!! )
kvm# cd /var/lib/libvirt/images
kvm# ls -ohs nb260727-ref.qcow2
16G -rw-------. 1 root 51G Aug 1 13:12 nb260727-ref.qcow2
kvm# qemu-img convert -p -f qcow2 -O qcow2 nb260727-ref.qcow2 new-nb260727-ref.qcow2
(100.00/100%)
kvm# ls -ohs *nb260727-ref.qcow2
16G -rw-------. 1 root 51G Aug 1 13:12 nb260727-ref.qcow2
15G -rw-r--r--. 1 root 15G Aug 1 13:16 new-nb260727-ref.qcow2
kvm# mv nb260727-ref.qcow2 nb260727-ref.qcow2.old
kvm# mv new-nb260727-ref.qcow2 nb260727-ref.qcow2
kvm# virsh pool-refresh default
Pool default refreshed
Clumsy, but better than nothing...
More wild example - discard all build files (work folders) from pkgsrc builds:
( run in NetBSD guest )
# TODO: skip 0bytes file (causes error unable to determine size.)
doas find ~/pkgsrc/*/*/work -type f -exec fdiscard -Rz {} \;
sync
doas rm -rf ~/pkgsrc/*/*/work
nb260727-ref$ df -h /
Filesystem Size Used Avail %Cap Mounted on
/dev/ld0a 45G 10G 32G 24% /
doas halt -p
And repeat:
kvm# cd /var/lib/libvirt/images
kvm# ls -ohs nb260727-ref.qcow2
15G -rw-r--r--. 1 root 15G Aug 1 13:31 nb260727-ref.qcow2
kvm# ls -ohs nb260727-ref.qcow2
15G -rw-r--r--. 1 root 15G Aug 1 13:31 nb260727-ref.qcow2
# qemu-img convert -p -f qcow2 -O qcow2 nb260727-ref.qcow2 new-nb260727-ref.qcow2
(100.00/100%)
kvm# ls -ohs *nb260727-ref.qcow2
15G -rw-r--r--. 1 root 15G Aug 1 13:31 nb260727-ref.qcow2
11G -rw-r--r--. 1 root 11G Aug 1 13:32 new-nb260727-ref.qcow2
kvm# mv nb260727-ref.qcow2 nb260727-ref.qcow2.old
kvm# mv new-nb260727-ref.qcow2 nb260727-ref.qcow2