Ok, so I found no way to convert it, and decided to do a full resinstall (as painful as it can be) because I needed to convert it to a proper @ and @home btrfs (filesystem) setup to use timeshift (goal : have very regular instant automated “backups” of the whole system).
I also create a dedicated subvolume for snapshots.
NB: dumping here the list of operations, not sourced not explained correctly, at least as a beginning, mainly to remember it for next time and in the hope it will help someone else… don’t trust me 100% and don’t trust this not to be outdated ![]()
So here is what I did:
- make Yunohost backup
- backup some config files (
bash_aliases,/root/.config/htop, list of installed packaged…) - flash this 64bit Yunohost image to the Raspberry Pi Installer YunoHost | Yunohost Documentation. The partition setup is boot + / (ext4 filesystem).
- boot a first time with it. Update it. Install
btrfs-progs(unless it won’t boot with btrfs. Not needed if you don’t use it) andzstdpackage if you want zstd compression. - in the additional space, create a btrfs partition.
Alternativement, usebtrfs-convertand then move folder in appropriate subvolumes (created later ↓). - create appropriate subvolumes :
- mount btrfs partition (let’s say in
btrfs/, a directory that you create first) :sudo mount /dev/sda3 btrfs/.
In my case it’s was partition/dev/sda3(it should be the third one, but on a different sdX or whatever depending on what kind of device interface you use). sudo btrfs subvolume create btrfs/@sudo btrfs subvolume create btrfs/@home-
sudo btrfs subvolume create btrfs/@/@snapshots- optional
- mount btrfs partition (let’s say in
- copy ext4 partition to btrfs one
- mount ext4 partition (let’s say in
ext4/, a directory that you create first) :sudo mount /dev/sda2 ext4/. -
sudo rsync -avhP ext4/ btrfs/@/to copy everything from root (in ext4) to @ (root) subvolume -
sudo cp -a btrfs/@/home/. btrfs/@home/migrate home content to@homesubvolume (making a copy just in case) -
sudo rm -r btrfs/@/home/(cleaning the mess)
- mount ext4 partition (let’s say in
-
sudo sync && syncto make sure everything is written to disk -
sudo umount ext4: it’s no longer needed. - change the
/etc/fstabto boot with the new setup:- get the btrfs new partition UUID :
ls -l /dev/disk/by-uuid/(can be done graphically in gparted too). - change your
fstabfile:
- get the btrfs new partition UUID :
proc /proc proc defaults 0 0
PARTUUID=SomeShortUUID /boot vfat defaults 0 2
PARTUUID=SomeVeryLongUUID / btrfs defaults,subvol=@,compress-force=zstd:2,discard=async,relatime 0 1
PARTUUID=SomeVeryLongUUID /home btrfs defaults,subvol=@home,compress-force=zstd:2,discard=async,relatime 0 2
PARTUUID=SomeVeryLongUUID /@snapshots btrfs defaults,subvol=@snapshots,compress-force=zstd:2,discard=async,relatime 0 2
Only the subvol= option is mandatory, the rest are settings to enable compression (with a pretty balanced compression vs CPU overhead setting) and speed/writing optimisation for SSDs.
-
In order to boot (it won’t work straight away with btrfs), we need to change the kernel parameters in
/boot/firmware/cmdline.txt:- mount the boot partition in
boot/:sudo mount /dev/sda1 boot/. - edit
/boot/firmware/cmdline.txt- Change
rootfstype=ext4torootfstype=btrfs - change
root=PARTUUID=SomeShortUUIDto the right UUID. You can use label or /dev/… if you prefer, as in the fstab file. Androotflags=subvol=@(it will mount the root subvolume) -
fsck.repairshould be equal tono, it doesn’t work with btrfs (btrfs as its own repair mechanism) - remove
quietif you wish (more logs provided)
- Change
- add initramfs btrfs module (at startup)
echo "btrfs" >> btrfs/etc/initramfs-tools/modules - you need to update the initramfs image to reflect these changes ! We will need to chroot in the filesystem (make it like it was your main system, do run this without chrooting first)
- in
/etc/default/raspberrypi-kerneluncommentINITRD=Yes - Mount it
sudo mount -o subvol=@ /dev/sda3 chroot_mnt_point/(create chroot_mnt_point directory first) - Mount /boot in the root folder :
mount /dev/sda1 chroot_mount_pt/@/boot/ - mount for future chroot:
for i in /dev /dev/pts /proc /sys /run /lib; do sudo mount --bind $i chroot_mnt_point$i; done(note the lack of/because already contained in $i) - chroot:
sudo chroot chroot_mnt_point/ - then
update-initramfs -c -k all- it should be generating stuffGenerating /boot/initrd.img-KernelNumber. You should then see it/them in chroot_mnt_point/boot (and not in you main /boot, that would mean you didn’t chroot and affected your computer, not your raspberry pi…). - In my case this doesn’t seem to work correctly.
Alternatively, I followed boot - btrfs root filesystem on raspbian - Raspberry Pi Stack Exchange and btrfs support in kernel, yes or maybe? - Raspberry Pi Forums and foundmkinitramfs -o /boot/initramfs-btrfs.gz $(uname -r)as a way to generate a working btrfs kernel image (I guess ?) in /boot. And in /boot/config.txt at the end I instead addinitramfs initramfs-btrfs.gzNow after booting into the old ext4 filesystem (I kept a copy) to check,dmesg | grep -i trfs(note the lack of “b”, because in my case it was uppercase) gives me the information that btrfs is loaded !- TODO : find a way to execute this after each kernel update, unless… will it break or just ignore the upgrade ?
- in
- In my case I couldn’t make the chroot work (because of a
/bin/bash exec()error, which seems to be related to the fact I’m using an x86 computer to chroot into ARM environnement ?).
So I did not touch/boot/cmdline.txtfirst, but booted the Rasberry Pi, connected with ssh, and then did the chroot, cmdline.txt and initramfs modules changes and ranupdate-initramfs -c -k alland themkinitramfsstuff shown above.
- mount the boot partition in
-
Reboot. It should work and be still accessible by SSH and so on.
-
Restore your backups.
-
And… nothing to report in my case !

-
Enjoy ! (Install Yunohost as usual and so on…)
Also documenting here these commands, to be edited later on to include them (it’s for btrfs-convert scenario):
sudo cp -P lib @/lib
sudo cp -P sbin @/sbin
sudo cp -P sbin @/sbin
sudo mv home/* @home/ && sudo rm -r home/ # not /home !!!
for i in var boot etc opt media mnt srv tmp usr root ; do sudo mv $i @/$i; done # Be very careful not to point to **/**dev, /somethingElse… because it would be you current PC system !!!