--- title: Restoring Root Filesystem from BtrFS Snapshot description: Undo your grave mistakes quickly and efficiently. Yay! published: true date: 2022-04-30T20:10:46.302Z tags: btrfs, recovery, rootfs editor: markdown dateCreated: 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!