I put an extra SSD in my computer and moved $HOME onto it. It went surprisingly smoothly, thanks to btrfs, and I’m writing it down here for Future Sean, because that guy can’t remember anything.

Here were the basic steps: first, make the destination partition on the drive. In my case, this was /dev/sda1. Then do some btrfs magic:

mkfs.btrfs -L drivelabel /dev/sda1
mkdir /media/drivelabel
mount -t btrfs /dev/sda1 /media/drivelabel
btrfs subvolume snapshot -r /media/home
btrfs send /media/home | btrfs receive /media/drivelabel
btrfs property set -f /media/drivelabel/home ro false

That last point bit me and required a couple of extra reboots. I had read about it, but it got lost in all the moving around. Finally, update /etc/fstab to mount the new subvolume. This can be with the label using the LABEL= argument, but for the UUID, call blkid -s UUID /dev/sda1. Don’t forget the subvolume:

UUID=bff4d27c-3fce-4d75-8b08-420b29fe50b8  /home btrfs subvol=/home,defaults,noatime,compress=zstd 0 0  

Reboot, and Bob’s your uncle. The part I haven’t gotten around to is deleting the old /@home and snapshot. Mainly, because that disk is only 17% full, and I don’t need the space, and it makes me feel a little better having it around. The only thing I lost through this was a little time, and about a dozen lines in my zsh history after the snapshot.

In oelden days, I’d have rsync’d home, but thar be monsters. It’s easily to do wrong. The Mistakes I made during this process only resulted in a couple of extra reboots, which was an improvement.

Oh: once you do that force-set of the write bit on the snapshot copy, it (apparently) breaks the link.