2.7 KiB
title, description, published, date, tags, editor, dateCreated
| title | description | published | date | tags | editor | dateCreated |
|---|---|---|---|---|---|---|
| Restoring Root Filesystem from BtrFS Snapshot | Undo your grave mistakes quickly and efficiently. Yay! | true | 2022-04-30T20:10:46.302Z | btrfs, recovery, rootfs | markdown | 2021-10-20T05:15:59.558Z |
If you frigged up really bad, you likely cannot read this, which is ironic.
However, I'll write it down so it hopefully sinks in the ol' noggin.
Booting into snapshots
I configured the system to use snapper, a tool from OpenSUSE, which takes and manages BtrFS snapshots. Thanks to the grub-btrfs plugin, these root filesystem snapshots are accesable from the GRUB2 boot menu.
First, select whichever snapshot (they are neatly dated) by following the Gentoo snapshots option in the boot menu.
Making snapshots writable
By default, snapshots are read only. They should still boot neatly, but lots of things will not work (like NTP and most compiles).
Take a good look around - do you like this snapshot? is this a nice snapshot? would you like to settle down with this snapshot?
If so, run:
btrfs property set -ts / ro false
when / is the path the snapshot is currently mounted at (use findmnt -nt btrfs to find out).
Once a snapshot is writeable, consider it compromised - booting from it again if you change your mind may not be as smooth! {.is-warning}
Setting snapshot as new root
First, find the snapshot ID by runnnig findmnt -nt btrfs - which will give you something like this:
root@Takahe] ~ (takahe-root)
❯ findmnt -nt btrfs
/ /dev/nvme0n1p2[/.snapshots/232/snapshot] btrfs rw,noatime,compress=zstd:11,ssd,d
Now, grep the path in the square brackets from the output of btrfs snapshots list /:
[root@Takahe] ~ (takahe-root)
❯ btrfs subvolume list / | grep .snapshots/232/snapshot
ID 8624 gen 2199024063871 top level 2740 path .snapshots/232/snapshot
Noticed how I removed the leading /.
Now, take the ID of the snapshot, and set it as the new default:
[root@Takahe] ~ (takahe-root)
❯ btrfs subvolume set-default 8624 /
The BtrFS default is built into the filesystem - it overrides the value on
/etc/fstab. {.is-info}
Finally, update the bootloader to enable the default entry to boot into your snapshot:
grub-mkconfig -o /boot/grub/grub.cfg
This should be it - but you can double check if you're really keen by reading that file and looking for something like this in the kernel parameters:
linux /vmlinuz-5.14.10-gentoo-x86_64 root=UUID=d9699f1e-6825-4b38-9e3a-c228763b07cc ro rootflags=subvol=.snapshots/232/snapshot
See the rootflags? that's us, baby.
Happy compiling!