Where are my BTRFS subvolumes?

I just installed Ubuntu 18.04 server on a VPS using the Ubuntu installer (from a mounted ISO image). I selected BTRFS as my filesystem type during the manual partitioning phase of installation.

Now that the installation has completed, I do not see @ or @home like I normally would on the non-server install. I don't care about a @home subvolume here, but I do not want the top level volume mounted at /.

lsblk:

vda 252:0 0 25G 0 disk
|-vda1 252:1 0 1M 0 part
|-vda2 252:2 0 20G 0 part /
`-vda3 252:3 0 5G 0 part [SWAP]

The produces no results:

btrfs su li /

I tried this next:

btrfs filesystem show | awk '/ path /{print $NF}'
/dev/vda2

and:

# findmnt
TARGET SOURCE FSTYPE OPTIONS
/ /dev/vda2 btrfs rw,relatime,space_cache,subvolid=5,subvol=/

How can I create BTRFS subvolumes during installation of 18.04 server?

I would like to create @ (for /) and @varlog (for /var/log) and maybe others.

I would like to use Snapper for hourly snapshots. Is there a recommended way to set up Ubuntu server with BTRFS and Snapper?

9

2 Answers

You can move your / to a subvolume this way:

  1. Create a shapshot of your filesystem.

     btrfs sub snap / /@
  2. Mount the new subvolume to /mnt.

     mount -o subvol=@ /dev/vda2 /mnt
  3. 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
  4. Update /mnt/etc/fstab adding there subvol=@ as an option.

  5. 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=/@) 
  1. Now you can mount the top subvolume somewhere and delete its contents except /@.
12

Here is a solution which works on Ubuntu Server 20.04. It creates @ subvolume before the first boot and removes all files from / volume.

  1. Do the installation of Ubuntu 20.04 with BTRFS root partition, but don't reboot after the system installation.

  2. Switch to terminal (Alt+F2).

  3. 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.

  4. Create @ subvolume and move all files into it:

    cd /target
    btrfs subvolume create @
    ls | grep -v @ | xargs mv -t @
  5. 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 
  6. 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

  7. 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
  8. Finally, setup the bootloader (I assume /dev/sda)

    update-initramfs -u -k all
    grub-install --recheck /dev/sda
    update-grub
    exit
  9. Get back to your installer (Alt+F1) and reboot. Ubuntu should boot to your @ subvolume.

2

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like