Is it possible to convert btrfs to ext4 without losing data? I'm experiencing a very low speed on read/write operations on btrfs.
I'm just going on the available tools, not experience or documentation. You might want to test this with a partition (even just an image) you don't mind losing if it all goes wrong. Don't attempt this without taking a backup.
btrfs-convert has a roll-back function to undo a conversion. I'm not sure if this works for partitions that weren't converted to
Start by unmounting the filesystem. If it's essential to the system, boot into a LiveCD.
sudo apt-get install btrfs-tools
Roll back the conversion
sudo btrfs-convert -r /dev/sdXn
I did this using a system with multiboot distros (Ubuntu on ext4, Xubuntu on btrfs). Running Ubuntu, I have taken the Xubuntu btrfs home partition, and archived it using fsarchiver. I was then able to restore it, again using fsarchiver, to a different partition and specify ext4 filesystem type. That seemed to work okay.
Still in Ubuntu, I mounted the Xubuntu root partition on /mnt, and edited /mnt/@/etc/fstab to change the mount for /home to point to the new ext4 partition, changing both the UUID and the fs type, and deleting the subvolume data. I saved the file, and rebooted into Xubuntu.
There was an error in booting, and booting halted. The error was that I had another partition I wanted to mount to my ~/Documents directory which failed. I selected to manually fix the problem. It turns out that my root partition mounted okay as ext4, but when I did a list command I got
#ls /home @home
So the original btrfs subvolume structure was still there in the ext4 filesystem. I issued the command
mount --bind /home/@home /home
I then pressed ctrl-D to continue booting, and Xubuntu continued booting and everything came up fine. I haven't done it yet, as I'm still on this initial boot, but I'm certain I could put that bind command in my fstab file. Or perhaps I could have left the subvolume info in the fstab entry, I don't know.
What I will do instead, however (this is off-topic), is take a more mature instance of a /home (ext4) partition for Xubuntu from another computer and use that instead. I've already proven that this will work.
The solution that works in all cases, is of course to copy everything from the root partition to a directory on another partition (assuming you have one with enough free space), reformat
ext4, copy back. I just did that, and hit a few issues so I thought I'd write a little howto:
- Boot on a rescue USB key, mount both partitions (let's say
/mntfor the real root partition, and
/destfor the partition serving as a temporary destination)
- Beware that you should mount the BTRFS subvolumes too (I didn't do that, and I lost all of
/root...). The best way is probably to do the usual
mount --bind /dev /mnt/dev; mount --bind /sys /mnt/sys; mount --bind /proc /mnt/proc; chroot /mnt) and then
mount -a -t btrfsso that the subvolumes described in
/etc/fstabare all mounted.
- Exit the chroot or use another TTY (Ctrl+Alt+F2), and launch the copy, like
cp -a /mnt /dest
- Reformat the partition:
mount /dev/*the_root_device* /mnt
- Copy back the data with
cp -a /dest/mnt/* /mnt
And now (in the chroot) don't forget to
/etc/fstabto remove all subvolumes, change the filesystem type from
ext4, and update the
UUID(see the output of
blkid, or switch to a label like
tune2fs -L rootfs /dev/*the_root_device*)
mkinitrd, and recreate the bootloader (I use another distro so I don't have the exact command for this step on ubuntu). Cross fingers and reboot. Finally, remember to clean up the /mnt copy in the temporary destination.