Skip to content

Instantly share code, notes, and snippets.

@dlitz
Last active May 11, 2022 01:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dlitz/d25128dbc40e7b9f7578c77a3210234b to your computer and use it in GitHub Desktop.
Save dlitz/d25128dbc40e7b9f7578c77a3210234b to your computer and use it in GitHub Desktop.
btrfstune -m breaks btrfs scrub
#!/bin/bash
# dlitz 2022
# This tests 'btrfstune -m' (change metadata_uuid) followed by 'btrfs scrub'.
# Apparently, changing the metadata_uuid causes btrfs scrub to spew
# uncorrectable errors, even on an empty filesystem.
# Changing the metadata_uuid back to the old value makes 'btrfs scrub' happy
# again.
set -eu
verbose() {
printf >&2 '#'
printf >&2 ' %q' "$@"
printf >&2 '\n'
"$@"
}
shverbose() {
printf >&2 '# %s\n' "$1"
eval "$1"
}
#verbose lsb_release -a
#shverbose 'dpkg -s btrfs-progs | grep ^Version'
verbose uname -srvmo
verbose mkfs.btrfs --version
tmp_dir=$(mktemp -d)
cd "$tmp_dir"
image="./fsimage.bin"
mountpoint="./mnt"
# create filesystem image
verbose truncate -s 8G "$image"
# Set up loop device
shverbose 'loopdev=$(losetup --find --show "$image" | tee /dev/fd/2)'
verbose mkfs.btrfs --quiet "$loopdev"
verbose mkdir "$mountpoint"
verbose mount -t btrfs "$loopdev" "$mountpoint"
verbose btrfs scrub start -B "$mountpoint"
verbose umount "$mountpoint"
shverbose 'old_uuid=$(blkid -o value -s UUID "$loopdev" | tee /dev/fd/2)'
verbose btrfstune -m "$loopdev"
shverbose 'new_uuid=$(blkid -o value -s UUID "$loopdev" | tee /dev/fd/2)'
verbose mount -t btrfs "$loopdev" "$mountpoint"
verbose btrfs scrub start -B "$mountpoint" || true
umount "$mountpoint"
shverbose "btrfstune -M \"\$old_uuid\" $loopdev"
verbose mount -t btrfs "$loopdev" "$mountpoint"
verbose btrfs scrub start -B "$mountpoint" || true
umount "$mountpoint"
# cleanup
rmdir "$mountpoint"
losetup -d "$loopdev"
rm -f "$image"
cd /
rmdir "$tmp_dir"
echo "# "
# uname -srvmo
Linux 5.17.0-1-amd64 #1 SMP PREEMPT Debian 5.17.3-1 (2022-04-18) x86_64 GNU/Linux
# mkfs.btrfs --version
mkfs.btrfs, part of btrfs-progs v5.17
# truncate -s 8G ./fsimage.bin
# loopdev=$(losetup --find --show "$image" | tee /dev/fd/2)
/dev/loop5
# mkfs.btrfs --quiet /dev/loop5
NOTE: several default settings have changed in version 5.15, please make sure
this does not affect your deployments:
- DUP for metadata (-m dup)
- enabled no-holes (-O no-holes)
- enabled free-space-tree (-R free-space-tree)
# mkdir ./mnt
# mount -t btrfs /dev/loop5 ./mnt
# btrfs scrub start -B ./mnt
scrub done for 3ba6ccff-a888-400a-9d89-19eed3bea7ae
Scrub started: Tue May 10 18:50:18 2022
Status: finished
Duration: 0:00:00
Total to scrub: 536.00MiB
Rate: 0.00B/s
Error summary: no errors found
# umount ./mnt
# old_uuid=$(blkid -o value -s UUID "$loopdev" | tee /dev/fd/2)
3ba6ccff-a888-400a-9d89-19eed3bea7ae
# btrfstune -m /dev/loop5
# new_uuid=$(blkid -o value -s UUID "$loopdev" | tee /dev/fd/2)
2e8822a7-560e-46f1-ba57-a7ff52dd5162
# mount -t btrfs /dev/loop5 ./mnt
# btrfs scrub start -B ./mnt
ERROR: there are uncorrectable errors
scrub done for 2e8822a7-560e-46f1-ba57-a7ff52dd5162
Scrub started: Tue May 10 18:50:18 2022
Status: finished
Duration: 0:00:00
Total to scrub: 536.00MiB
Rate: 0.00B/s
Error summary: verify=18
Corrected: 0
Uncorrectable: 18
Unverified: 0
# btrfstune -M "$old_uuid" /dev/loop5
# mount -t btrfs /dev/loop5 ./mnt
# btrfs scrub start -B ./mnt
scrub done for 3ba6ccff-a888-400a-9d89-19eed3bea7ae
Scrub started: Tue May 10 18:50:19 2022
Status: finished
Duration: 0:00:00
Total to scrub: 536.00MiB
Rate: 0.00B/s
Error summary: no errors found
#
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment