logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

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 → ODT PDF Export

Ceci est une ancienne révision du document !


BTRFS

Principes de base

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.

Sous volumes - Subvolumes

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 :

  • C'est un sous-système de fichiers, il peut donc être monté, par exemple via la commande mount ou dans /etc/fstab.
  • Il permet l'utilisation des snapshots.

Instantanés - Snapshots

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.

RAID logiciel 0 1 (5/6) 10

Opérations à chaud

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.

Limites

Btrfs a cependant certaines limites :

  • Il n'a pas de fonction de cryptage des données. Il est cependant possible de crée un volume btrfs dans un partition créée avec dm-crypt.
  • Il gère pas les fichier de swap. il est cependant possible de contourner le problème au prix de la performance 2)
  • Les snapshots ne sont pas récursifs. C'est-à-dire que si on réalise un snapshot d'un subvolume comportant des subvolumes-enfants, dans le snaphot les subvolumes-enfants apparaitrons comme des dossiers vides.
Ce tuto présente des commandes qui, mal utilisées peuvent mener à la perte de vos données.
Sauvegardez vos données !!
Btrfs est en cours de développement. Bien que le format du système de fichier soit considéré comme stable par les développeurs 3), les outils qui permettent de le manipuler sont eux en développement.
Il est dont important d'utiliser un kernel à jour (>= 3.12) et la version la plus à jour de btrfs-tools ( 3.12-1 à ce jour)

Installation

Btrfs est inclus 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

Commandes de Base

Création d'un nouveau système de fichiers

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.

Le partitionnement

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 :

  • Il n'est pas possible d'utiliser d'autres systèmes de fichiers sur différents points de montage.
  • Il n'est pas possible d'utiliser de swap sur ce disque.
  • Il n'est pas possible de booter sur ce disque en UEFI.

Pour effacer la table des partitions et utiliser tout le disque /dev/sdX comme un volume Btrfs :

mkfs.btrfs /dev/sdX

Convertir un système ext3 / ext4

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

Options de montage

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.

Pour un SSD

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”.

Pour un HDD

Par exemple

mount /dev/sdX1 -o rw,noatime,compress=zlib,autodefrag

En utilisant /etc/fstab

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

Outils d'audit

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.

Les Subvolumes

Pour créer un subvolume :

btrfs subvolume create NOM

Monter un subvolume

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.

Snapshots

Pour réaliser un snapshot du subvolume NOM :

btrfs subvolume snapshot NOM SNAP

La compression

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

Maintenance

Scrub

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

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.

RAID 0 1 (5/6) et 10

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.

Installation de / (root) dans un volume btrfs

Installation dans un subvolume

Backups incrémentales

Sur un même volume physique

snapper

Manuellement

Entre deux volumes physiques

On a deux disques formatés en btrfs /dev/sda monté en /mnt/sda et /dev/sdb monté en /mnt/sdb.

Mise à jour initiale

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-envoyerhome@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
homehome
home@envoyehome@envoye
Maintenant pour la mise a jour incrémentale :

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@envoyehome@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

Ce qui est très intéressant parce que les différences ne se font pas au niveau des fichiers mais des clunks, ainsi si vous modifiez le une partie seulement d'un gros fichier, seuls les clunks correspondant aux modifications seront envoyés… du coup ça va beaucoup plus vite.
Mais cela veut aussi dire qu'il est important que le subvolume home@envoye soit présent et identique sur les deux disques et en lecture seule.
 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@envoyehome@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.

Entre deux machines via ssh

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.

Il est crucial que les subvolumes home@envoye soient identiques sur le serveur et le client. Sinon la trasaction échouera. Je conseille de vérifier que le transfer s'est bien passé comparant les md5sums. Inconvénient : c'est long et ça utilise le processeur.
Il n'y a pas, à ma connaissance, de systeme de checksum accessible à l'utilisateur intégré à btrfs. J'utilise donc un script qui compare les md5sums des ls chez le client et le serveur. Sur le client :
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.

doc/systeme/btrfs.1394678106.txt.gz · Dernière modification: 13/03/2014 03:35 par martinux_qc

Pied de page des forums

Propulsé par FluxBB