Where are my BTRFS subvolumes?
You can move your /
to a subvolume this way:
-
Create a shapshot of your filesystem.
btrfs sub snap / /@
-
Mount the new subvolume to
/mnt
.mount -o subvol=@ /dev/vda2 /mnt
-
Chroot to the subvolume and update grub.
cd /mnt mount -o bind /dev dev mount -o bind /sys sys mount -o bind /proc proc chroot /mnt update-grub exit
-
Update
/mnt/etc/fstab
adding theresubvol=@
as an option. -
Reboot. You will boot to the subvolume. Make sure that it is the case by
mount | grep vda2
It should show something like
/dev/vda2 on / type btrfs (rw,relatime,space_cache,subvolid=257,subvol=/@)
- Now you can mount the top subvolume somewhere and delete its contents except
/@
.
Here is a solution which works on Ubuntu Server 20.04. It creates @
subvolume before the first boot and removes all files from /
volume.
-
Do the installation of Ubuntu 20.04 with BTRFS root partition, but don't reboot after the system installation.
-
Switch to terminal (Alt+F2).
-
Switch to root user and umount all devices other than the BTRFS partition:
sudo -i umount /target/boot/efi umount -l /target/run umount /target/cdrom
If you have other mount points (i.e.
/home
) umount them too. -
Create
@
subvolume and move all files into it:cd /target btrfs subvolume create @ ls | grep -v @ | xargs mv -t @
-
umount your BTRFS partition and mount it again pointing this time to the
@
subvolume. It is also a good time to define some extra mounting options (in my example there are some recommended options for SSD devices). I assume BTRFS volume is under/dev/sda2
(adjust accrdingly)cd / umount /target mount -o subvol=@,ssd,noatime,space_cache,commit=120,compress=zstd:2 /dev/sda2 /target
-
Now it's time to complete the system by mounting all necessary devices and then switch to it with
chroot
(I assume your boot partition is/dev/sda1
)mount /dev/sda1 /target/boot/efi mount --bind /proc /target/proc mount --bind /dev /target/dev mount --bind /sys /target/sys chroot /target
If you've created some other partitions (i.e.
/home
) mount them here too -
Open
fstab
in editor:vi /etc/fstab
and update the line with BTRFS partition, i.e.:
UUID=xxx / btrfs default,subvol=@,ssd,noatime,space_cache,commit=120,compress=zstd:2 0 0
-
Finally, setup the bootloader (I assume
/dev/sda
)update-initramfs -u -k all grub-install --recheck /dev/sda update-grub exit
-
Get back to your installer (Alt+F1) and reboot. Ubuntu should boot to your
@
subvolume.