Thursday, August 6, 2026

Fedora Server 44 OverlayFS BTRFS setup (Assisted by Google AI)

 Review 

OverlayFS is primarily used automatically by the system to mount read-only Btrfs system snapshots as writable environments. This allows you to safely boot into a broken system snapshot from GRUB, run tests, or perform a system restoration while keeping the actual snapshot pristine.

Original disk layout

boris@Server44D:~$ lsblk -f
NAME   FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sr0                                                                            
zram0  swap   1     zram0 bf5880ed-22bf-4df2-b8e8-64b8fdc465ae                [SWAP]
vda                                                                            
├─vda1 vfat   FAT32       7E26-5D1C                            1014.1M     1% /boot/efi
└─vda2 btrfs              a93f8d3f-daa0-49b0-a00e-82fcdcc76154   65.5G                                                                                                                                              10% /home
                                        /.snapshots
                                        /

$ sudo dnf install btrfs-assistant snapper gawk inotify-tools libdnf5-plugin-actions git make -y
$ sudo dnf install python3-btrfsutil dracut-live -y

========================
Trick Snapper Method
========================
$ sudo umount /.snapshots
$ sudo rmdir    /.snapshots
$ sudo snapper -c root create-config  /
$ sudo mount  /.snapshots

Create the missing directory: 

$ sudo mkdir -p /boot/grub
$ sudo dnf install grub2-tools 

# Fix binary compatibility wrapper
$ sudo ln -sf /usr/bin/grub2-script-check /usr/bin/grub-script-check

$ cd grub-btrfs
================
UNDER grub-config
================
$ nano config
GRUB_BTRFS_MKCONFIG="/usr/bin/grub2-mkconfig"
GRUB_BTRFS_GRUB_DIRNAME="/boot/grub2"
GRUB_BTRFS_SCRIPT_CHECK="grub2-script-check"
========================================

# Compile package targets
$ sudo make install 
 
===============================
sudo nano /etc/btrfs-assistant.conf
===============================
[Subvol-Mapping]
root = "snapshots,@,a93f8d3f-daa0-49b0-a00e-82fcdcc76154"
 
[Backup-Mapping]
/ = "@"
================================
sudo nano /etc/snapper/configs/root
================================
SUBVOLUME="/" 
===============================
sudo nano /etc/default/grub-btrfs/config
===============================
GRUB_BTRFS_SNAPSHOT_KERNEL_PARAMETERS="'rd.live.overlay.overlayfs=1 rw'"
==============================
$ sudo dracut --add "dmsquash-live overlayfs" --force --no-hostonly --regenerate-all
$ sudo rm -f /boot/grub2/grub-btrfs.new /tmp/grub-btrfs.*
$ sudo /etc/grub.d/41_snapshots-btrfs
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now grub-btrfsd

DNF5 TRANSACTION SNAPSHOT AUTOMATION ENGINE
================================================
sudo mkdir -p /etc/dnf/libdnf5-plugins/actions.d/
sudo nano /etc/dnf/libdnf5-plugins/actions.d/snapper.actions
Append lines
pre_transaction::::/usr/bin/bash /usr/local/bin/dnf5-snapper-helper pre
post_transaction::::/usr/bin/bash /usr/local/bin/dnf5-snapper-helper post
================================================
sudo nano /usr/local/bin/dnf5-snapper-helper
================================================
#!/bin/bash
STATE_FILE="/etc/snapper/configs/root.dnf_pre_id"
 
case "$1" in
    pre)
        # Capture raw snapshot digit without whitespace or newlines
        /usr/bin/snapper -c root create -t pre -p -d "DNF Transaction" -c number | tr -d '\n' > "$STATE_FILE"
        ;;
    post)
        if [ -s "$STATE_FILE" ]; then
            PRE_ID=$(cat "$STATE_FILE")
            /usr/bin/snapper -c root create -t post --pre-num "$PRE_ID" -d "DNF Transaction Complete" -c number
            rm -f "$STATE_FILE"
        fi
        ;;
esac
===============================================
sudo chmod +x /usr/local/bin/dnf5-snapper-helper
 
































RW instance to recover via Btrfs-Assistant
 
ssh boris@192.168.0.106
boris@192.168.0.106's password:  
Web console: https://Server44D:9090/ or https://192.168.0.106:9090/

Last login: Thu Aug  6 16:13:49 2026 from 192.168.0.81
boris@Server44D:~$ mount | grep -E 'on / type'
/dev/vda2 on / type btrfs (rw,relatime,seclabel,compress=zstd:1,discard=async,space_cache=v2,subvolid=267,subvol=/snapshots/6/snapshot)
 
boris@Server44D:~$ lsblk -f
NAME   FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sr0                                                                            
zram0  swap   1     zram0 c17f6e59-5d8d-40b8-aba7-95e143ca5e91                [SWAP]
vda                                                                            
├─vda1 vfat   FAT32       7E26-5D1C                            1014.1M     1% /boot/efi
└─vda2 btrfs              a93f8d3f-daa0-49b0-a00e-82fcdcc76154   65.5G                             10% /home
                                                 /.snapshots
                                                 /run/rootfsbase
                                                 /

============================== 
Main instance report
==============================
boris@Server44D:~$ uname -a
Linux Server44D 7.1.6-201.fc44.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Aug  4 00:23:39 UTC 2026 x86_64 GNU/Linux
boris@Server44D:~$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/vda2      btrfs      74G  7.2G   66G  10% /
devtmpfs       devtmpfs  7.5G     0  7.5G   0% /dev
tmpfs          tmpfs     7.6G   12K  7.6G   1% /dev/shm
efivarfs       efivarfs  256K   85K  166K  34% /sys/firmware/efi/efivars
tmpfs          tmpfs     3.1G  1.5M  3.1G   1% /run
none           tmpfs     1.0M     0  1.0M   0% /run/credentials/systemd-journald.service
none           tmpfs     1.0M     0  1.0M   0% /run/credentials/systemd-resolved.service
/dev/vda2      btrfs      74G  7.2G   66G  10% /.snapshots
/dev/vda2      btrfs      74G  7.2G   66G  10% /home
tmpfs          tmpfs     7.6G  4.0K  7.6G   1% /tmp
/dev/vda1      vfat     1022M  7.9M 1015M   1% /boot/efi
tmpfs          tmpfs     1.6G   84K  1.6G   1% /run/user/1000
 
boris@Server44D:~$ sudo .local/bin/btrview  
                a93f8d3f-daa0-49b0-a00e-82fcdcc76154 | 10% full                   
Subvolume Tree:                        Snapshot Tree:                             
<FS_TREE>                              @_backup_2026-08-06T13:23:55.046Z          
├── snapshots on: /.snapshots          ├── snapshot                               
│   ├── snapshot                       │   └── @_backup_2026-08-06T13:32:22.385Z  
│   ├── snapshot                       │       └── snapshot                       
│   ├── snapshot                       │           └── @ on: /                    
│   ├── snapshot                       │               ├── snapshot               
│   ├── snapshot                       │               ├── snapshot               
│   ├── snapshot                       │               └── snapshot               
│   ├── snapshot                       ├── snapshot                               
│   ├── snapshot                       ├── snapshot                               
│   └── snapshot                       ├── snapshot                               
├── @ on: /                            └── snapshot                               
│   ├── portables                      <FS_TREE>                                  
│   └── .snapshots on: /.snapshots     snapshots on: /.snapshots                  
├── @home on: /home                    @home on: /home                            
├── @_backup_2026-08-06T13:23:55.046Z  portables                                  
└── @_backup_2026-08-06T13:32:22.385Z  .snapshots on: /.snapshots  
 
boris@Server44D:~$ sudo btrfs subvolume list /
ID 256 gen 390 top level 5 path snapshots
ID 257 gen 406 top level 5 path @home
ID 258 gen 285 top level 5 path @_backup_2026-08-06T13:23:55.046Z
ID 259 gen 71 top level 268 path var/lib/portables
ID 260 gen 246 top level 268 path .snapshots
ID 261 gen 222 top level 256 path snapshots/1/snapshot
ID 262 gen 242 top level 256 path snapshots/2/snapshot
ID 263 gen 255 top level 256 path snapshots/3/snapshot
ID 264 gen 257 top level 256 path snapshots/4/snapshot
ID 265 gen 282 top level 256 path snapshots/5/snapshot
ID 266 gen 309 top level 5 path @_backup_2026-08-06T13:32:22.385Z
ID 267 gen 364 top level 256 path snapshots/6/snapshot
ID 268 gen 403 top level 5 path @
ID 269 gen 336 top level 256 path snapshots/7/snapshot
ID 270 gen 387 top level 256 path snapshots/8/snapshot
ID 271 gen 389 top level 256 path snapshots/9/snapshot

 
boris@Server44D:~$ findmnt -t btrfs
TARGET    SOURCE                FSTYPE OPTIONS
/         /dev/vda2[/@]         btrfs  rw,relatime,seclabel,compress=zstd:1,discard=async,space_cache=v2,subvolid=268,subvol=/@
├─/.snapshots
│         /dev/vda2[/snapshots] btrfs  rw,relatime,seclabel,compress=zstd:1,discard=async,space_cache=v2,subvolid=256,subvol=/snapshots
└─/home   /dev/vda2[/@home]     btrfs  rw,relatime,seclabel,compress=zstd:1,discard=async,space_cache=v2,subvolid=257,subvol=/@home


No comments:

Post a Comment