BTRFS

Setup

# install packages
paru -S btrfs-progs

# format partition with btrfs
mkfs.btrfs -L <drive-label> /dev/<parititon>

Usage

Sub-volume

sudo btrfs subvolume list /
sudo btrfs subvolume create <drive-path>/@<subvol-name> # create suvolume, need to mount after
sudo btrfs subvolume delete <mount-dir>
sudo btrfs property set <mount-dir> ro true # set to read-only, false to undo

Snapshot

sudo btrfs snapshot <subvol-name> <snapshot-name> #create snapshot
sudo btrfs snapshot -r <subvol-name> <snapshot-name> # create read-only snapshot
sudo btrfs send @home-ro | sudo btrfs receive /mnt/btrfs/
  • snapshots are simply copies of sub-volumes
  • a nested sub-volume will not get saved when snapshotting the parent

Filesystem

sudo btrfs filesystem show /
sudo btrfs filesystem usage /
sudo btrfs filesystem label /dev/sdx <label> # label unmounted volume
sudo btrfs filesystem label /path <label> # label mounted volume

Snapper

Setup

# snapper - snapshots
# grub-btrfs - auto update grub
# inotify-tools - automation tools for snapper
# btrfs-assistant - snapper gui 
paru -S snapper grub-btrfs inotify-tools btrfs-assistant 

# enable auto update grub and snapper timers
sudo systemctl enable snapper-timeline.timer snapper-cleanup.timer
sudo systemctl start snapper-timeline.timer snapper-cleanup.timer
sudo systemctl enable grub-btrfsd.service
sudo systemctl start grub-btrfsd.service

# creates snapper config for subvolume, defines snapshot and cleanup freq.
# creates subvolume at <mount-dir>/.snapshots 
snapper -c <subvol-name> create-config <mount-dir>
# each config file acts on the subvolume specified by \<mount-dir> 

# creates regular folder <mount-dir>/.snapshots/#
# creates snapshot read-only at <mount-dir>/.snapshots/#/@<snap-name>
snapper -c <subvol-name> --description 'initial'

# copies current snapshot to new read-only snapshot
# copies desired snapshot to new writeable snapshot
# sets default subvolume to copy of desired 
# only intended for / subvolume since new snapshot is set as default
sudo snapper -ambit classic rollback <snap> # rollback to snapshot

Usage

# snapper commands (reference) 
snapper ls # list snapshots
snapper status <snap_a>..<snap_b> # view differences
sudo snapper delete <snap> # delete snapshot
sudo snapper undochange <snap_a>..<snap_b> # revert from a to b
sudo mount /dev/<os-part> -o subvolid=<snap> /mnt # view contents
sudo snapper -ambit classic rollback <snap> # rollback to snapshot
# create a new subvolume
mv -v /core/games /core/gamnes-old
sudo btrfs subvolume create /core/games
sudo chown -Rv $USER: /core/games
cp -arv /core/games-old/. /core/games
rm -rf /core/games-old

# list 
sudo btrfs subvolume list /

OS Installation

BTRFS

During file system creation

# note down partition names
# first is <efi-part>
# second is <os-part>
# ex. sda1 sda2
# ex. nvme0n1p1 nvme0n1p2
lsblk -f

# format partitions
mkfs.fat -F 32 -n EFI /dev/<efi-part>
mkfs.btrfs -L os /dev/<os-part>

# mount root partition
mount /dev/<os-part> /mnt

# create subvolumes
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@.snapshots
btrfs subvolume create /mnt/@log
btrfs subvolume create /mnt/@pkg

# unmount root partition
umount /mnt

# mount subvolumes
# <mount-options>: noatime,compress=zstd:1 
# set higher compress level for slow drives ex. for HDD -> zstd:3
mount -o <mount-options>,subvol=@ /dev/<os-part> /mnt
mkdir -p /mnt/{boot,home,var/log,var/cache/pacman/pkg,.snapshots}

mount -o <mount-options>,subvol=@home /dev/<os-part> /mnt/home
mount -o <mount-options>,subvol=@.snapshots /dev/<os-part> /mnt/.snapshots
mount -o <mount-options>,subvol=@log /dev/<os-part> /mnt/var/log
mount -o <mount-options>,subvol=@pkg /dev/<os-part> /mnt/var/cache/pacman/pkg

# Mount EFI
mount /dev/<efi-part> /mnt/boot

Snapper

# https://www.youtube.com/watch?v=sm_fuBeaOqE&

# snapper - snapshots
# grub-btrfs - auto update grub
# inotify-tools - automation tools for snapper
# btrfs-assistant - snapper gui 
paru -S snapper grub-btrfs inotify-tools btrfs-assistant 

# install snap-pac (optional)
# auto create pre and post snapshots when isntalling Arch or AUR packages
# i prefer to do this manually for system updates or as needed
paru -S snap-pac

# update some settings
sudo vim /usr/share/snapper/config-templates
# add wheel to groups
# in limits for timeline cleanup
# set Min_Age="1800"
# set Hourly: 5, Daily: 7, Rest: 0

# clean up extra subvolumes
# sudo btrfs subvolume list /
# sudo btrfs subvolume delete /var/lib/portables
# sudo btrfs subvolume delete /var/lib/machines
# sudo mkdir -p /var/lib/portables
# sudo mkdir -p /var/lib/machines
# sudo btrfs subvolume list / # verify

# remove /.snapshots folder so create-config works
sudo umount /.snapshots
sudo rm -rf /.snapshots

# create snapper config for root
sudo snapper -c root create-config /

# delete volume created by create-config and re mount /.snapshots
sudo brfs subvolume delete /.snapshots
sudo mkdir /.snapshots
sudo mount -a
sudo btrfs subvolume list / # verify

# ensure config is correct
sudo vim /etc/snapper/configs/root

sudo chown -R :wheel /.snapshots/

# enable auto update grub and snapper timers
sudo systemctl enable snapper-timeline.timer snapper-cleanup.timer
sudo systemctl start snapper-timeline.timer snapper-cleanup.timer
sudo systemctl enable grub-btrfsd.service
sudo systemctl start grub-btrfsd.service

# create manual snapshot
snapper -c root create -d "base snapper"
sudo grub-mkconfig -o /boot/grub/grub.cfg

@ /
@home /home
@.snapshots /.snapshots
@log /var/log
@pkg /var/cache/pacman/pkg
@machines /home/jay/machines
@media /home/jay/media
@flatpak /var/lib/flatpak
@flatpak-home /home/jay/.var/app