Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ceci est une ancienne révision du document !
Btrfs est un système de fichiers pour Linux qui a pour but d'implémenter des fonctionnalités avancées tout en se focalisant sur la résistance aux pannes, les réparations et une administration simple. Sans entrer dans des détails techniques, voici quelques spécificités de BTRFS comparé aux systèmes de fichiers classiques ext3 ext3.
Au sein d'un système de fichiers BTRFS, un “sous-volume” (subvolume) est représenté comme un dossier classique. Il présente cependant les avantages suivants :
Un instantané (snapshot) est un subvolume qui a été créé comme une “photographie” d'un autre subvolume à un moment donné. L'avantage d'un snapshot est que même si les données sont disponible deux fois sur le système de fichiers, les données ne sont pas dédoublées sur le disque. Seules les modifications faites au subvolume original ou au snapshot seront écrites sur le disque. Ainsi au moment de la création d'un snapshot, la taille sur le disque du snapshot est quasi-nulle. Ce n'est qu'au fil des modifications que sa taille sur le disque va augmenter. Ceci est par exemple très utile pour créer des branches d'un système ou pour les sauvegardes.
La plupart des opérations se font à chaud : le redimensionnement du système de fichiers, l'ajout d'un disque, le changement de type de redondance (RAID), l'équilibrage des données et métadonnées sur les différents disques (balance), la vérification et correction du système de fichiers, la défragmentation, la compression… Ceci est très pratique car en se dédouanant de la limitation des tables de partitions classiques, on évite les manipulations risquées et longues des redimensionnement de partitions.
Btrfs a cependant certaines limites :
Btrfs est inclu dans le kernel de base, Cependant il est vivement recommandé d'utiliser un kernel le plus à jour possible (et >= 3.12)
Les outils de gestion doivent être installés.
apt-get install btrfs-tools
Pour formatter la partition /dev/sdX1 taper :
mkfs.btrfs -L label /dev/sdX1
Il peut etre utile d'ajouter l'option -f si la partition n'est pas vide.
Btrfs peut occuper tout un disque et remplacer la table de partition. Les subvolumes peuvent être utilisés pour remplacer les partitions. Il y a cependant des limites à cette utilisation :
Pour effacer la table des partitions et utiliser tout le disque /dev/sdX comme un volume Btrfs :
mkfs.btrfs /dev/sdX
Il est possible de convertir un système ext3 ou ext4 en btrfs. Si on a une partition /dev/sdX1 en ext4
umount /dev/sdX1 fsck.ext3 -f /dev/sdX1 btrfs-convert /dev/sdX1 mount /dev/sdX1 /point-de-montage
Remontez manuellement la partition et verifiez que tous les fichiers sont là. Si la partition se chargeait via /etc/fstab modifiez le (cf Section sur fstab). À la racine de la partition /dev/sdX1 vous trouverez un subvolume “ext2_saved” qui comporte une image de l'ancien système de fichiers.
Si tout va bien et que vous avez tous vos fichiers on supprime cette image et le subvolume qui la contient :
rm /point-de-montage///ext2_saved/* btrfs subvolume delete /ext2_saved
Si tout ne va pas bien, qu;il y a eu un problème ou que vous avez les jetons :P :
umount /dev/sdX1 btrfs-convert -r /dev/SdX1
En des différentes options disponibles lors de la création du système de fichiers, le nombreuses options de montage pour Btrfs peuvent drastiquement changer ses performances.
Par exemple
mount /dev/sdX1 -o rw,noatime,ssd,discard,autodefrag,compress=lzo,space_cache,inode_cache /mnt
les options les plus importantes pour un ssd sont “ssd” et “discard”.
Par exemple
mount /dev/sdX1 -o rw,noatime,compress=zlib,autodefrag
Je vous conseille d'utiliser les UUID. Si vous utilisez plusieurs disques pour le même volume peu importe lequel vous montez. Les options dump et pass dans les deux derniers champs doivent être égal à 0.
Exemple de ligne dans /etc/fstab :
UUID=a69d9182-f4c7-4276-b35d-7d5f9bd50a57 /mnt btrfs rw,noatime,ssd,discard,autodefrag 0 0
Pour voir l'espace utilisé dans le volume btrfs monté dans /mnt :
btrfs filesystem df /mnt
Data, single: total=27.00GiB, used=24.28GiB System, DUP: total=32.00MiB, used=4.00KiB Metadata, DUP: total=2.50GiB, used=1.70GiB
il y a 3 lignes : Data correspond aux données, System aux fichiers systeme du volume et Metadata aux métadonnées associées aux différents fichiers (sommes de controles etc…) la somme des used= correspond à l'espace utilisé sur le disque. Vous noterez la différence avec la commande df -h.
Pour avoir des informations sur le disque, l'UUID du volume etc :
btrfs filesystem show /mnt
Label: none uuid: a69d9182-f4c7-4276-b35d-7d5f9bd50a57 Total devices 1 FS bytes used 25.98GiB devid 1 size 115.43GiB used 32.06GiB path /dev/sdb6 Btrfs v3.12
Dans le cas d'un volume en RAID (ici RAID 10) on peut voir la répartition des données sur les différents disques :
Label: stockage uuid: ca7fc4a0-3bf6-4d86-b4b9-3ef025af5d31 Total devices 4 FS bytes used 350.62GiB devid 1 size 931.51GiB used 182.04GiB path /dev/sdd devid 2 size 931.51GiB used 182.03GiB path /dev/sda devid 3 size 931.51GiB used 182.03GiB path /dev/sdb devid 4 size 931.51GiB used 182.03GiB path /dev/sdc Btrfs v3.12
On peut aussi voir si le disque a fait des erreurs
btrfs device stats /dev/sdX
[/dev/sdX].write_io_errs 0 [/dev/sdX].read_io_errs 0 [/dev/sdX].flush_io_errs 0 [/dev/sdX].corruption_errs 0 [/dev/sdX].generation_errs 0
Ici tout va bien.
Pour créer un subvolume :
btrfs subvolume create NOM
Pour monter un subvolume présent dans /dev/sdX :
mount /dev/sdX -o ..options..,subvol=NOM /point-de-montage
Dans /etc/fstab il suffit de rajouter également l'option de montage subvol=chemin vers le subvolume. Par exemple si on a un subvolume “SUB” dans un dossier “DOS” a la racine du volume Btrfs on rajoutera subvol=DOS/SUB aux options de montage.
Pour réaliser un snapshot du subvolume NOM :
btrfs subvolume snapshot NOM SNAP
Btrfs peut compresser le système de fichiers ce qui veut dire que tous les fichiers dans le volume sont compressés. Il y a dont une réduction de la taille des fichiers sur le disque mais aussi un gain de performances, spécialement dans le cas de la compression lzo.
Pour autoriser la compression sur un volume on ajoute l'option de montage compress=lzo ou compress=zlib
Pour compresser un volume non compressé ou changer le type de compression (à chaud bien sur !):
btrfs filesystem defragment -r -v -clzo /point-de-montage
Scrub permet de vérifier à chaud le système de fichiers. Les données et métadonnées sont lues et les sommes de contrôle sont vérifiées, les données corrompues sont identifiées et réparées.
btrfs scrub start /point-de-montage
On peut changer la commande start avec cancel pour stopper la vérif, pause, et status pour voir l'état d'une vérif en cours.
Balance réalloue les données dans le système de fichier. C'est particulièrement utile lorsqu'on a un systeme de fichiers en RAID et qu'un disque est ajouté ou retiré. Les copies manquantes sont ainsi régénérées.
btrfs balance start /point-de-montage
Idem que pour scrub pour les commandes start, cancel et status.
Si on dispose de plusieurs disques il est possible d'activer la redondance logicielle des données. Si vous voulez plus d'information sur le RAID : https://fr.wikipedia.org/wiki/RAID_%28informatique%29
Par exemple si on a deux disques /dev/sda et /dev/sdb
On crée un systeme de fichier sur ces deux disques :
mkfs.btrfs /dev/sda /dev/sdb
On monte le volume :
mount /dev/sda /mnt
Si on décide d'augmenter la taille de ce volume (à chaud) en ajoutant un disque /dev/sdc :
btrfs device add /dev/sdc
puis on réalloue les données en utilisant les 3 disques.
btrfs balance start /mnt
Par défaut Btrfs utilise RAID0, pour passer en RAID1 :
btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt
Il est aussi possible de supprimer des disques si nécéssaire.
On a deux disques formatés en btrfs /dev/sda monté en /mnt/sda et /dev/sdb monté en /mnt/sdb.
On veut sauvegarder le subvolume home qui se trouve dans /mnt/sda/home et l'envoyer dans /mnt/sdb.
On réalise un snapshot de home en lecture seule
btrfs subvolume snapshot -r /mnt/sda/home /mnt/sda/home@a-envoyer
On l'envoie sur /mnt/sdb
btrfs send /mnt/sda/home@a-envoyer | btrfs receive /mnt/sdb/
On a maintenant la configuration suivante :
/dev/sda | /dev/sdb |
---|---|
home | |
home@a-envoyer | home@a-envoyer |
On renomme les snapshots pour l'étape suivante et on réalise un snapshot de home@a-envoyer qui ne soit pas en lecture seule :
mv /mnt/sda/home@a-envoyer /mnt/sda/home@envoye mv /mnt /sdb/home@a-envoyer /mnt/sdb/home@envoye btrfs subvolume snapshot /mnt/sdb/home@envoye /mnt/sdb/home
On a ainsi deux subvolumes home qui sont identiques sur sda et sdb.
/dev/sda | /dev/sdb |
---|---|
home | home |
home@envoye | home@envoye |
Après avoir fait des modification dans /mnt/sda/home on réalise un nouveau snapshot en lecture seule :
btrfs subvolume snapshot -r home home@a-envoyer
On a donc :
/dev/sda | /dev/sdb |
---|---|
home (modifié) | home |
home@envoye | home@envoye |
home@a-envoyer (modifié) |
On signifie à btrf send qu'il ne faut envoyer que les différences entre home@envoye et home@a-envoyer
btrfs send -p /mnt/sda/home@envoye /mnt/sda/home@a-envoyer | btrfs receive /mnt/sdb/
On a maintenant :
/dev/sda | /dev/sdb |
---|---|
home (modifié) | home |
home@envoye | home@envoye |
home@a-envoyer (modifié) | home@a-envoyer(modifié) |
Il ne reste plus qu'a faire le ménage pour se préparer à répéter cette itération :
btrfs subvolume delete /mnt/sda/home@envoye mv /mnt/sda/home@a-envoyer /mnt/sda/home@envoye btrfs subvolume delete /mnt/sdb/home@envoye mv /mnt/sdb/home@a-envoyer /mnt/sdb/home@envoye btrfs subvolume delete /mnt/sdb/home btrfs subvolume snapshot /mnt/sdb/home@a-envoyer /mnt/sdb/home
Ce qui nous donne :
/dev/sda | /dev/sdb |
---|---|
home (modifié) | home (modifié) |
home@envoye (modifié) | home@envoye (modifié) |
On est prêt à recommencer dès que /mnt/sda/home sera modifié ! Je vous conseille un petit script et une tache cron pour automatiser tout ça.
Les principes de bases sont les mêmes. Dans ce cas /mnt/sdb se trouve sur le serveur root@stockage.local
Pour la mise a jour initiale :
btrfs send /mnt/sda/home@a-envoyer | ssh root@stockage.local /sbin/btrfs receive /mnt/sdb
Pour la mise a jour incrémentale :
btrfs send -p /mnt/sda/home@envoye /mnt/sda/home@a-envoyer | ssh root@stockage.local /sbin/btrfs receive /mnt/sdb
Note : pour la lisibilité du tuto je me connecte en root sur le serveur, ce n'est pas la meilleure idée.
export LANG=C cd /mnt/sda/home@envoye ls -lnARs > /tmp/md5 md5sum /tmp/md5
Sur le Serveur:
ssh root@stockage.local "LANG=C cd /mnt/sdb/home@envoye && ls -lnARs" > /tmp/md5 md5sum /tmp/md5
Si les deux md5sum ne sont pas identiques alors il faut refaire une mise à jour complète.