snapper - filesystem snapshot management

Aug 25, 2020 18:21 · 400 words · 2 minute read btrfs fedora howto

Excerpt from man: Snapper is a command-line program for filesystem snapshot management. It can create, delete and compare snapshots and undo changes done between snapshots.

Snapper never modifies the content of snapshots. Thus snapper creates read-only snapshots if supported by the kernel. Supported filesystems are btrfs as well as snapshots of LVM logical volumes with thin-provisioning.

This is my notes. Use at your own risk.

Usage

snapper list
snapper restore <number>

Set default subvolume

  1. List subvolume on filsystem.

    btrfs sub list /
    
    ID 256 gen 15137 top level 5 path home
    ID 257 gen 11927 top level 5 path root
    
  2. Set default subvolume for the mounted filesystem to the root subvolume.

    btrfs sub set-default 257 /
    
  3. Remove subvolume from /etc/fstab since it’s now default.

    sed -i 's/subvol=root,//' /etc/fstab
    
  4. Update grub to use the default volume. Use SUSE_BTRFS_SNAPSHOT_BOOTING grub config to avoid adding root subvolume to the grub kernel parameters.

    grep -q SUSE /etc/sysconfig/grub || \
        echo SUSE_BTRFS_SNAPSHOT_BOOTING=true | \
        sudo tee -a /etc/sysconfig/grub
    
  5. Update grub config. This updates grub configuration on an EFI system.

    grub2-mkconfig > /boot/efi/EFI/fedora/grub.cfg
    

Install and configure snapper

  1. Install snapper.

    dnf install snapper
    
  2. Add default snapper configuration.

    snapper create-config /
    
  3. Keep number of NUMBER snapshots to 3.

    sed -Ei 's/(NUMBER_LIMIT)=(.*)/\1="3"/' /etc/snapper/configs/root
    
  4. Keep number of IMPORTANT snapshots to 3

    sed -Ei 's/(NUMBER_LIMIT_IMPORTANT)=(.*)/\1="3"/' /etc/snapper/configs/root
    
  5. Keep number of TIMELINE snapshot to one each day for 7 days.

    sed -Ei 's/(TIMELINE_LIMIT_HOURLY)=(.*)/\1="0"/' /etc/snapper/configs/root
    sed -Ei 's/(TIMELINE_LIMIT_DAILY)=(.*)/\1="7"/' /etc/snapper/configs/root
    sed -Ei 's/(TIMELINE_LIMIT_WEEKLY)=(.*)/\1="7"/' /etc/snapper/configs/root
    sed -Ei 's/(TIMELINE_LIMIT_MONTHLY)=(.*)/\1="0"/' /etc/snapper/configs/root
    sed -Ei 's/(TIMELINE_LIMIT_YEARLY)=(.*)/\1="0"/' /etc/snapper/configs/root
    
  6. Enable snapper.

    systemctl enable snapper-boot.timer --now
    systemctl enable snapper-cleanup.timer --now
    systemctl enable snapper-timeline.timer --now
    

Example output

snapper --iso list
 # | Type   | Pre # | Date                | User | Cleanup  | Description           | Userdata     
---+--------+-------+---------------------+------+----------+-----------------------+--------------
0  | single |       |                     | root |          | current               |              
2  | single |       | 2020-08-25 17:10:57 | root | number   | rollback backup       | important=yes
4  | single |       | 2020-08-25 17:13:49 | root | number   | rollback backup of #3 | important=yes
5* | single |       | 2020-08-25 17:13:49 | root |          |                       |              
6  | single |       | 2020-08-25 17:31:16 | root | number   | boot                  |              
7  | single |       | 2020-08-25 18:00:56 | root | timeline | timeline              |              
8  | single |       | 2020-08-25 18:11:41 | root | number   | boot                  |              
9  | single |       | 2020-08-25 19:00:48 | root | timeline | timeline              |              

Highlighted current running snapshot.