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 /@.

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.