NetBSD discard - hpaluch/hpaluch.github.io GitHub Wiki

NetBSD TRIM/DISCARD support

There is one command with 2 aliases:

  1. blkdiscard will discard data by default (so be careful)
  2. fdiscard will 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