Btrfs
I tried to have a root filesystem into btrfs for a Gandi server, unsuccessfully for now. Here are my steps if it can be useful to others.
WARNING: this is EXPERIMENTAL and could cause DATA LOSS.
Create the server
On https://v4.gandi.net, create a new server [1] with e.g. 1 proc, 256 Mio RAM, 1 system disk, Ubuntu 18.04 LTS.
Update the packages:
apt update && apt upgrade -y
On https://v4.gandi.net, stop the server, open the page about the system disk, clone the system disk with another name, and attach this cloned disk to the server, start the server.
Convert to btrfs
- Mostly from [2]
The package btrfs-progs currently does not contain btrfs-convert (this Debian bug) because the risk of data loss is too great. Then we need to compile btrfs-progs.
Install dependencies:
apt install gcc g++ libblkid-dev liblzo2-dev zlib1g-dev libzstd-dev asciidoc xmlto libattr1-dev libext2fs-dev pkg-config python3-dev python3-setuptools
Download and compile btrfs-progs (changelog, releases):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v4.20.1.tar.gz tar xfz btrfs-progs-v4.20.1.tar.gz cd btrfs-progs-v4.20.1 ./configure --with-convert=ext2 make make install cd .. rm -rf btrfs-progs-v4.20.1 btrfs-progs-v4.20.1.tar.gz
Display the active root filesystem, and you will be able to deduce what is the cloned filesystem:
ls /dev/xvd* mount|grep xvd blkid -o value -s TYPE /dev/xvda1 # and the same for others
Let’s say /dev/xvdb1 is the clone filesystem, we convert it to btrfs:
fsck.ext4 -f /dev/xvdb1 btrfs-convert -p /dev/xvdb1
Here, I obtained the following error:
root@test:~# btrfs-convert -p /dev/xvda1 create btrfs filesystem: blocksize: 4096 nodesize: 16384 features: extref, skinny-metadata (default) creating ext2 image file creating btrfs metadata Unable to find block group for 0 27081] Unable to find block group for 0 Unable to find block group for 0 ctree.c:2245: split_leaf: BUG_ON `1` triggered, value 1 btrfs-convert(+0x11b5a)[0x559c159c1b5a] btrfs-convert(+0x1589b)[0x559c159c589b] btrfs-convert(btrfs_search_slot+0x269)[0x559c159c6401] btrfs-convert(btrfs_insert_empty_items+0x92)[0x559c159c7b3c] btrfs-convert(btrfs_record_file_extent+0x1bc)[0x559c159d46b4] btrfs-convert(record_file_blocks+0x14a)[0x559c159bfe92] btrfs-convert(+0x10349)[0x559c159c0349] btrfs-convert(+0x1135f)[0x559c159c135f] btrfs-convert(main+0x1f59)[0x559c159bdefb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x7f4c11c3bb97] btrfs-convert(_start+0x2a)[0x559c159bb5ca] Aborted
According to [3] and [4], it can be worked around:
btrfs-convert -d -p /dev/xvdb1
Then, mount the filesystem and delete the old ext4 snapshot:
mount /dev/xvdb1 /mnt btrfs subvolume delete /mnt/ext2_saved
Promote as root filesystem
Not successful after a first try with [5] and I abandonned here, see also [6].