Wednesday, July 1, 2026

Setup Debian Trixie with btrfs as root FS and separate boot folder with ext4 in UEFI mode

 This is a final draft  been worked out through several sessions with Google AI Assistant . Same approach would work on Debian forky as well. All commands below are supposed to be issued with root privileges. In case of /boot/efi crash low level btrfs CLI won't help you to recover so creating boot as btrfs subvolume is not a critical part of btrfs flat system layout recovery would have to path via Phase 1 and Phase 2 see for instance Sparky-aptus-upgrade on Sparky Linux 2026 06 instance in UEFI mode

 Final disk layout with btrfs  flat topology

boris@debian13VM:~$ lsblk -f
NAME   FSTYPE  FSVER            LABEL                  UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sr0    iso9660 Joliet Extension d-live 13.5.0 kd amd64 2026-05-16-09-42-04-00                               
vda                                                                                                         
├─vda1 vfat    FAT32                                   8FCE-9FB4                                69M    11% /boot/efi
├─vda2 ext4    1.0                                     d61d53ab-cf84-46d9-81e3-03dc093713d0    1.4G    15% /boot
└─vda3 btrfs                                           86898dd4-44d9-4e7b-be5d-fa42a32561fa   54.8G    21% /.snapshots
                                                    /
boris@debian13VM:~$ sudo btrfs subvolume list /
[sudo] password for boris:  
ID 258 gen 597 top level 5 path @snapshots
ID 259 gen 542 top level 258 path @snapshots/16/snapshot
ID 260 gen 548 top level 258 path @snapshots/17/snapshot
ID 261 gen 557 top level 258 path @snapshots/18/snapshot
ID 262 gen 558 top level 258 path @snapshots/19/snapshot
ID 263 gen 560 top level 258 path @snapshots/20/snapshot
ID 264 gen 565 top level 258 path @snapshots/21/snapshot
ID 265 gen 577 top level 258 path @snapshots/22/snapshot
ID 266 gen 600 top level 5 path @root_active
ID 267 gen 578 top level 258 path @snapshots/23/snapshot
ID 268 gen 596 top level 258 path @snapshots/24/snapshot
boris@debian13VM:~$ mount | grep @root_active
/dev/vda3 on    /   type btrfs 
(rw,noatime,compress=zstd:3,discard=async,space_cache=v2,subvolid=266,subvol=/@root_active)
boris@debian13VM:~$ mount | grep @snapshots
/dev/vda3 on   /.snapshots   type btrfs (rw,noatime,compress=zstd:3,discard=async,space_cache=v2,subvolid=258,subvol=/@snapshots)

 

======================= 

Starting point 

======================= 

mkdir -p /mnt/btrfs_root
mount -o subvolid=5 /dev/vda3 /mnt/btrfs_root
mkdir -p /mnt/btrfs_root/btrfs_base
btrfs subvolume snapshot /mnt/btrfs_root/@rootfs                                /mnt/btrfs_root/btrfs_base/@root_active
mv /mnt/btrfs_root/btrfs_base/@root_active                                              /mnt/btrfs_root/@root_active
rmdir /mnt/btrfs_root/btrfs_base
umount /mnt/btrfs_root
=================================
mkdir -p /mnt/system-root
mount -o subvol=@root_active /dev/vda3 /mnt/system-root
mount /dev/vda2 /mnt/system-root/boot
mount /dev/vda1 /mnt/system-root/boot/efi
for i in /dev /dev/pts /proc /sys /run; do mount -B $i /mnt/system-root$i; done
=================================
Setup @root_active
======= Add row  
subvol=@root_active  ============
nano /mnt/system-root/etc/fstab

boris@debian13VM:~$ sudo cat /etc/fstab
# /etc/fstab: static file system information.
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# systemd generates mount units based on this file, see systemd.mount(5).
# Please run 'systemctl daemon-reload' after making changes here.
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/vda3 during installation
# UUID=86898dd4-44d9-4e7b-be5d-fa42a32561fa /               btrfs   defaults,subvol=@rootfs 0       0
UUID=86898dd4-44d9-4e7b-be5d-fa42a32561fa   /    btrfs  defaults,subvol=@root_active,compress=zstd,noatime  0   1
UUID=86898dd4-44d9-4e7b-be5d-fa42a32561fa   /.snapshots     btrfs  subvol=@snapshots,compress=zstd,noatime  0    0
# /boot was on /dev/vda2 during installation
UUID=d61d53ab-cf84-46d9-81e3-03dc093713d0 /boot           ext4    defaults        0       2
# /boot/efi was on /dev/vda1 during installation
UUID=8FCE-9FB4  /boot/efi       vfat    umask=0077      0       1
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0

 
=============================================== 
chroot /mnt/system-root /bin/bash  
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --recheck  
grub-install --target=x86_64-efi --efi-directory=/boot/efi --removable  
update-initramfs -u -k all  
update-grub
exit
===============================
for i in /run /sys /proc /dev/pts /dev; do umount /mnt/system-root$i; done
umount /mnt/system-root/boot/efi
umount /mnt/system-root/boot
sed -i 's/rootflags=subvol=@rootfs/rootflags=subvol=@root_active/g' /boot/grub/grub.cfg
reboot
===============================
sudo update-grub
sudo mkdir -p /mnt/btrfs_base
sudo mount -o subvolid=5 /dev/vda3 /mnt/btrfs_base
sudo btrfs subvolume create /mnt/btrfs_base/@snapshots
sudo snapper -c root create-config /
sudo btrfs subvolume delete /.snapshots
sudo mkdir /.snapshots
====== Add row 
 subvol=@snapshots ===============
sudo nano /etc/fstab

boris@debian13VM:~$ sudo cat /etc/fstab
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/vda3 during installation
# UUID=86898dd4-44d9-4e7b-be5d-fa42a32561fa    /               btrfs   defaults,subvol=@rootfs 0       0
UUID=86898dd4-44d9-4e7b-be5d-fa42a32561fa      /       btrfs  defaults,subvol=@root_active,compress=zstd,noatime  0    1
UUID=86898dd4-44d9-4e7b-be5d-fa42a32561fa   /.snapshots  btrfs  subvol=@snapshots, compress=zstd,noatime 0 0
# /boot was on /dev/vda2 during installation
UUID=d61d53ab-cf84-46d9-81e3-03dc093713d0 /boot           ext4    defaults        0       2
# /boot/efi was on /dev/vda1 during installation
UUID=8FCE-9FB4  /boot/efi       vfat    umask=0077      0       1
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0

================================================== 
sudo systemctl daemon-reload
sudo mount -a
sudo chmod 750 /.snapshots
sudo umount /mnt/btrfs_base
sudo snapper -c root create --description "First baseline snapshot" 

Kernel 7.0.13 has been back ported from Sid to Trixie  



No comments:

Post a Comment