Table des matières

btrfs

Description

Tuto ⇒ http://debian-facile.org/doc:systeme:btrfs

Installation

apt install btrfs-tools

Commandes

Sous volume et snapshot

Pour créer un sous volume

btrfs subvolume create NOM_DU_SOUS-VOLUME

Pour faire un snapshot du sous volume

btrfs subvolume snapshot NOM_DU_SOUS-VOLUME NOM_SNAPSHOT

Pour afficher la liste des sous volume

btrfs subvolume list /chemin/du/montage

Pour affiche des infos sur un sous volumes ou un snaphot

btrfs subvolume show /chemin/du/sous-volume

Un snapshot est aussi un sous volume, on peut très bien supprimer son parent sans poser de problème

Maintenance

Faire un checkdisk sans modif

btrfsck /dev/sda1

Faire un checkdisk avec option de réparation

btrfs check --repair /dev/sda1

Vérifier le checksum des blocksd

btrfs scrub start /dev/sda1

Vous pouvez voir l’avancement avec la commande suivante

btrfs scrub status /dev/sda1

Pour arrêter le scrub

btrfs scrub cancel /dev/sda1

En cas de gros pépin

Hugo Mills on the btrfs mailing list wrote:
Let’s assume that you don’t have a physical device failure (which
is a different set of tools – mount -odegraded, btrfs dev del
missing).
First thing to do is to take a btrfs-image -c9 -t4 of the
filesystem, and keep a copy of the output to show josef. smile
Then start with -orecovery and -oro,recovery for pretty much
anything.
If those fail, then look in dmesg for errors relating to the log
tree – if that’s corrupt and can’t be read (or causes a crash), use
btrfs-zero-log.
If there’s problems with the chunk tree – the only one I’ve seen
recently was reporting something like “can’t map address” – then
chunk-recover may be of use.
After that, btrfsck is probably the next thing to try. If options
-s1, -s2, -s3 have any success, then btrfs-select-super will help by
replacing the superblock with one that works. If that’s not going to
be useful, fall back to btrfsck –repair.
Finally, btrfsck –repair –init-extent-tree may be necessary if
there’s a damaged extent tree. Finally, if you’ve got corruption in
the checksums, there’s –init-csum-tree.
Hugo.

Passer de ext4 à btrfs

Dans le cas d’une conversion d’une partition racine, il faudra booter sur un live système.

1ère vérification, repérer le disque, son UUID, sa config fstab

Avec mount

mount
/dev/sda2 on / type ext4 (rw,noatime,errors=remount-ro,data=ordered)

L’UUID

blkid /dev/sda2
/dev/sda2: UUID="3b3f3e41-c1cf-437f-a90f-80aeda99110d" TYPE="ext4" PARTUUID="8d9a85bd-2d6f-4412-b375-2bcb33859c26"

On doit le retrouver dans le /etc/fstab

vi /etc/fstab
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda2 during installation
UUID=3b3f3e41-c1cf-437f-a90f-80aeda99110d /               ext4    noatime,errors=remount-ro 0       1

Lancer la conversion

btrfs-convert /dev/sda2

Monter le disque pour vérifier que tout s’est bien passé

mount /dev/sda2 /mnt/mon_disque

Si vous constatez des problèmes

umount /mnt/mon_disque
btrfs-convert -r /dev/sda2

Si tout vous semble ok, supprimez la possibilité de revenir en ext4 afin de ne pas alourdir le système et gagner en performance

rm -fr /mnt/mon_disque/ext2_saved
btrfs subvolume delete /ext2_saved
btrfs balance start /mnt/mon_disque

Maintenant, il va falloir mettre à jour votre fstab sinon votre système ne redémarrera pas.

Options de montage

OPTION DE MONTAGE PROPRES À BTRFS RÔLE
autodefrag Autorise la défragmentation en arrière plan
compress=zlib La compression la plus importante. Par défaut
compress=lzo La compression la plus rapide
compress=no Pas de compression
degraded Utilisé dans le cas des RAID. Permet de monter le volume même si certains disques sont manquants
discard Utilise le TRIM pour les disques SSD
recovery Lance la réparation automatique après le montage. A utilise si le volume ne veut plus se monter. un fois monté réaliser un scrub pour réparer les erreurs. (Ne fonctionne qu’avec les volumes crées avec la version 3.2 ou +)
ssd Utilise l’optimisation pour disques SSD de Btrfs. C’est utilisé par défaut si votre système reconnaît le SSD. Cette option ne lance pas le TRIM !
subvol=/chemin/vers/subvolume Permet de monter un subvolume
subvolid=id Permet de monter un subvolume par son id. La racine a un id=0

Pour un ssd par exemple

mount /dev/sda2 -o rw,noatime,ssd,discard,autodefrag,compress=lzo,space_cache,inode_cache /mnt/mon_disque

Pour hdd

mount /dev/sda2 -o rw,noatime,compress=lzo,autodefrag

Dans un fichier fstab, refaite la commande blkid et mettez à jour votre fstab

UUID=a69d9182-f4c7-4276-b35d-7d5f9bd50a57      /      btrfs      rw,noatime,ssd,discard,autodefrag,compress=lzo      0      0

FIXME

Mettre à jour grub

mount /dev/sda2 /mnt
mount /dev/sda1 /mnt/boot/efi
for fs in proc sys dev dev/pts; do mount --bind /$fs /mnt/$fs; done
chroot /mnt
update-initramfs -u -k all
update-grub

La suite peut aider mais pas nécessaire normalement.

With Grub Legacy we need to modify root=UUID value in menu.lst file to btrfs partition’s manually. I used the following lines for Grub’s menu.lst file.

title       Linux 2.6.32.67
uuid        89591593-766e-4565-9d5c-017fb0e33298
kernel      /vmlinuz-2.6.32.67 root=UUID=a90c79b1-5883-44cc-9e74-752db9ca764d ro
initrd      /initrd.img-2.6.32.67

In this example, a90c79b1-5883-44cc-9e74-752db9ca764d is the UUID of btrfs partition and 89591593-766e-4565-9d5c-017fb0e33298 is UUID of /boot partition.

Also, I used following lines for my /etc/fstab file.

/dev/sda3       /boot       ext4     defaults       0       0   
/dev/sda1       /           btrfs    defaults        0       1

As you can see, I just wrote a path (/dev/sda1) instead of UUID as described in the referenced site.

Update initrd images Because some scripts and hooking are added to initramfs, initrd images in /boot directory should be updated.

I could not update them with command (i.e. update-initramfs -u -k all) described in the referenced site. It was guessed due to the kernel version difference between Live USB and my original installation. I designated the kernel version as a parameter like below and it worked.

update-initramfs -u -k 2.6.32.67

Si votre grub est coincé au redémarrage

grub>ls #pour lister les partition
set root=(hd0,gpt2) # faite TAB en cours de frappe montre pas mal d'info sur la partition à choisir)
linux /vmlinuz root=/dev/sda2 ro
initrd /initrd.img
boot

ensuite, pour réparer grub

update-grub

Scripts tiers

# btrfs-list: a wrapper to btrfs-progs to show a nice overview of your btrfs subvolumes and snapshots, a la 'zfs list'
#
# Check for the latest version at:
# https://github.com/speed47/btrfs-list
# git clone https://github.com/speed47/btrfs-list.git
# or wget https://raw.githubusercontent.com/speed47/btrfs-list/master/btrfs-list -O btrfs-list
# or curl -L https://raw.githubusercontent.com/speed47/btrfs-list/master/btrfs-list -o btrfs-list

io disk

– source: https://kinvolk.io/docs/flatcar-container-linux/latest/setup/debug/btrfs-troubleshooting/

Disable copy-on-write

Copy-On-write isn’t ideal for workloads that create or modify many small files, such as databases. Without disabling COW, you can heavily fragment the file system as explained above.

The best strategy for successfully running a database in a container is to disable COW on directory/volume that is mounted into the container.

The COW setting is stored as a file attribute and is modified with a utility called chattr. To disable COW for a MySQL container’s volume, run:

chattr -R +C /var/lib/mysql

The directory /var/lib/mysql is now ready to be used by a Docker container without COW. Let’s break down the command:

-R indicates that want to recursively change the file attribute +C means we want to set the NOCOW attribute on the file/directory

To verify, we can run:

$ lsattr /var/lib/
---------------- /var/lib/portage
---------------- /var/lib/gentoo
---------------- /var/lib/iptables
---------------- /var/lib/ip6tables
---------------- /var/lib/arpd
---------------- /var/lib/ipset
---------------- /var/lib/dbus
---------------- /var/lib/systemd
---------------- /var/lib/polkit-1
---------------- /var/lib/dhcpcd
---------------- /var/lib/ntp
---------------- /var/lib/nfs
---------------- /var/lib/etcd
---------------- /var/lib/docker
---------------- /var/lib/update_engine
---------------C /var/lib/mysql