BTRFS : Utilisation du remplaçant de l'Ext4

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search
BTRFS

Software version 0.19
Operating System Debian 7
Website BTRFS Website
Last Update 05/07/2012
Others Kernel used :
3.2.0-2-amd64

1 Introduction

BTRFS est le remplaçant tout trouvé du vieillissant filesystem ExtX. Pour ceux qui connaissent le filesystem ZFS, BTRFS s'en inspire fortement.

Btrfs, comme Ext4, est basé sur la notion d'extent. C'est une zone contiguë (pouvant atteindre plusieurs centaines de Mo, à la différence des clusters de quelques formats plus anciens) réservée chaque fois qu'un fichier est enregistré sur le disque dur. Cela permet en cas d'écriture en fin de fichier (append) ou de réécriture complète de celui-ci, d'ajouter souvent les nouvelles données directement dans l'extent plutôt que dans une autre zone du disque dur, ce qui augmenterait la fragmentation. Les gros fichiers sont ainsi stockés de façon plus efficace moyennant une occupation d'espace disque plus importante, mais dont le coût a considérablement diminué. Btrfs stocke les données des très petits fichiers directement dans l'extent du fichier répertoire, et non dans un extent séparé.

Btrfs gère une notion de « sous-volumes » autorisant, au sein du système de fichiers, d'avoir un arbre séparé (y compris la racine) contenant des répertoires et des fichiers, donnant la possibilité d'avoir diverses arborescences simultanément, et donc une plus grande indépendance par rapport au système principal. Cela permet aussi de mieux séparer les données et d'imposer différents quotas aux différents sous-volumes. L'utilisation la plus pratique de ce système concerne les instantanés (souvent appelés par le mot anglais « snapshots »). Un instantané offre la possibilité de « prendre une photographie » à un instant donné d'un système de fichiers afin de le sauvegarder. Cet instantané sous Btrfs est un sous-volume, ce qui permet de le modifier après coup. Avoir un instantané accessible en écriture présente un intérêt évident pour les bases de données en ligne à haute disponibilité.

Pour exploiter ces sous-volumes et ces instantanés, Btrfs utilise la technique classique du « Copy-on-write ». Si des données sont écrites sur un bloc mémoire alors ce dernier sera copié à un autre endroit du système de fichiers et les nouvelles données seront enregistrées sur la copie au lieu de l'être sur l'original. Ensuite les méta-données pointant sur le bloc sont modifiées automatiquement afin de prendre en compte les nouvelles données. On a ainsi un mécanisme transactionnel distinct de la journalisation présente dans Ext3. Avant chaque écriture, prendre un instantané du système permettrait, en cas de problème, de revenir à l'instantané, mais cela semble poser, sinon des problèmes de performances, du moins des questions : faut-il prendre un instantané à chaque écriture, ou pour un certain volume de données ? Cela pose aussi la question de la perte de temps à chaque création/destruction d'instantané. L'utilisation des instantanés pour cet usage n'est d'ailleurs pas mis en avant par les développeurs.

Btrfs possède ses techniques propres de protection des données : l'utilisation références arrière (back references - c'est-à-dire savoir, à partir d'un bloc de données, quelles méta-données pointent vers le bloc) permet d'identifier des corruptions du système. Si un fichier prétend appartenir à un ensemble de blocs et que ces blocs prétendent de leur côté relever d'un autre fichier, cela indique que la cohérence du système est altérée. Btrfs effectue de plus des sommes de contrôle sur toutes les données et sur les méta-données stockées afin de pouvoir détecter toutes sortes de corruptions à chaud, en réparer quelques unes, et ainsi proposer un meilleur niveau de fiabilité.

Il permet de redimensionner à chaud la taille du système de fichiers (y compris en le rétrécissant) tout en conservant une excellente protection des méta-données qui sont dupliquées en plusieurs endroits par sécurité. L'opération est simple : btrfsctl -r +2g /mnt ajoute 2 Gio à son système de fichiers. Cette fonction ne se veut pas redondante avec ce que propose le gestionnaire de volume logique de Linux mais prétend le compléter techniquement.

La vérification du système de fichiers par l'intermédiaire du programme btrfsck est tolérante aux erreurs et présentée comme extrêmement rapide par sa conception. L'utilisation des arbres B permet d'explorer la structure du disque à une vitesse essentiellement limitée par la vitesse de lecture du disque. Le prix à payer est une forte empreinte mémoire puisque btrfsck utilise trois fois plus de mémoire que e2fsck.

Btrfs respecte la hiérarchie des « couches » fonctionnelles de Linux. Par exemple, bien que proposant des fonctions le complétant, il essaye autant que possible de ne pas réécrire tout le système de gestion des volumes proposé en standard par LVM.

L'algorithme de compression léger et rapide Snappy de Google est ajouté en janvier 2012 permettant d’accélérer les accès aux données par rapport à la compression LZO (de l'ordre de 10%) et à la non compression (de l'ordre de 15 %).

Il est suivi de l'algorithme de compression LZ4, en Février 2012, qui améliore encore les performances par rapport à Snappy (de l'ordre de 20-30%).

2 Installation

Nous allons devoir installer les outils BTRFS :

Command aptitude
aptitude install btrfs-tools parted

3 Utilisation

Dans mes cas d'utilisations ci dessous, beaucoup d'exemples seront par rapport à une configuration de ce type :

Command fdisk
> fdisk -l
 
Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0007f48a
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     5859327     2928640   83  Linux
/dev/sda2         5859328     7813119      976896   82  Linux swap / Solaris
/dev/sda3         7813120     9910271     1048576   83  Linux/dev/sda4         9910272    16201727     3145728   83  Linux

sda3 et sda4 sont des partitions sur lesquelles nous allons jouer.

3.1 Créer une partition sous Btrfs

J'ai ici une partition (sda4) de 3G. Je vais donc la formater en BTRFS :

Command mkfs.btrfs
> mkfs.btrfs /dev/sda4
 
WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using
 
fs created label (null) on /dev/sda4
	nodesize 4096 leafsize 4096 sectorsize 4096 size 3.00GB
Btrfs Btrfs v0.19

Note : Il est fortement recommandé de créer une partition BTRFS sur du LVM pour un agrandissement à chaud futur !

Ma partition est prête à être montée :

Command mount
mount -t btrfs /dev/sda4 /mnt/

Et nous pouvons voir que la partition est correctement montée :

Command mount
> mount | grep sda4
/dev/sda4 on /mnt type btrfs (rw,relatime,space_cache)

3.2 Les sous volumes

Tout comme le ZFS, il est possible de créer des sous volumes. C'est à dire que dans une partition formatée (voyez ça comme un VG sous LVM), il est possible de créer des sous volumes (LV sous LVM) mais dont l'utilisation permet une grande souplesse des données.

Créons notre premier sous volume :

Command btrfs
btrfs subvolume create /mnt/volume1

Un sous-volume est matérialisée au niveau de l’arborescence par un répertoire présent à la racine du point de montage du volume.

Command btrfs
btrfs subvolume list /mnt/
ID 145 top level 3 path volume1

Le numéro 145 identifie de manière unique notre sous volume. Le chemin volume1 est également indiqué. Le chemin volume1, qui est aussi le nom du sous-volume, est relatif à la racine de montage de notre volume btrfs.

Pour monter un sous-volume au même emplacement :

Command mount
mount -o subvol=volume1 /dev/sda4 /mnt/

On peut également monter votre sous-volume à partir de son identifiant :

Command mount
mount -o subvolid=145 /dev/sda4 /mnt

3.3 Convertir une partition extX en btrfs

Il est possible de convertir une partition ext3 ou ext4 par exemple en btrfs ! Dans ce cas, c'est sda3 que je vais convertir, elle est déjà en ext4. Nous utiliserons donc la commande btrfs-convert :

Command btrfs-convert
> btrfs-convert /dev/sda3
creating btrfs metadata.
creating ext2fs image file.
cleaning up system chunk.
conversion complete.

Et voilà, c'est tout :-). C'est simple hein ! Je peux donc la monter :

Command mount
mount -t btrfs /dev/sda3 /mnt/

Et vérifier que tout est bon :

Command mount
> mount | grep sda3
/dev/sda3 on /mnt type btrfs (rw,relatime,space_cache)

3.4 Agrandir une partition

3.4.1 Méthode 1 : agrandissement du filesystem

Pour augmenter la taille d'une partition à chaud, c'est très simple tant qu'on est sur du LVM ou si nous avons la partition qui physiquement dispose d'au moins la taille souhaitée. Sinon il faudra faire une opération à froid pour agrandir la partition, puis le filesystem.
La différence avec un filesystem de type ext, c'est que nous pouvons spécifier que la taille de la partition puisse prendre une taille x sans pour autant prendre la totalité (comme le resize2fs).

Command btrfs
> btrfs filesystem resize +1G /mnt/
Resize '/mnt/' of '+1G'

3.4.2 Méthode 2 : ajout d'un device

Nous avons une autre possibilité dans le cas ou notre volume courant viendrait à se faire trop petit...nous pouvons ajouter un device à un volume existant. Nous alors tout d'abord obtenir un état des volumes btrfs présent sur notre système :

Command btrfs
> btrfs filesystem show
failed to read /dev/sr0
Label: none  uuid: 9fd825a0-3bee-44b6-88e9-b8e4bc554e82
	Total devices 1 FS bytes used 92.00KB
	devid    1 size 3.00GB used 343.12MB path /dev/sda4 
Label: none  uuid: 0773e361-0342-4960-8f8e-5a26db8bc93e
	Total devices 1 FS bytes used 49.40MB
	devid    1 size 1.00GB used 1.00GB path /dev/sda3 
Btrfs Btrfs v0.19

Si je regarde mes partitions montées :

Command df
> df -h
[...]
/dev/sda3                                               1.0G   50M  640M   8% /mnt

J'ai ma sda3 qui fait 1G. Nous allons lui rajouter sda4 :

Command btrfs
btrfs device add /dev/sda4 /mnt/

Vérifions que /mnt a bien été agrandit :

Command df
> df -h
[...]
/dev/sda3                                               4.0G   50M  3.7G   2% /mnt

3.4.3 Méthode 3 : Raid 0

Il existe une solution comme le RAID 0, mais avec la répartition les données et réplication des métadonnées du système de fichiers sur tous les disques :

Command btrfs
> btrfs filesystem balance /mnt
> btrfs filesystem df /mnt/
Data, RAID0: total=3.71GB, used=256.00KB System,
RAID1: total=8.00MB, used=8.00KB
System: total=4.00MB, used=0.00
Metadata, RAID1: total=344.34MB, used=32.00KB

Les données sont en RAID0 entre les différentes partitions alors que le système et les méta-données sont RAID1. Cela signifie que même si vous perdez l’une des partitions du système, vous serez toujours capable de monter la partition restante. Par contre, les données n’étant pas répliquées mais réparties, vous aurez perdu celles présentes sur la partition disparue.

3.5 Réduire une partition

Pour réduire une partition à chaud, c'est vraiment très simple, il suffit de spécifier la taille, puis le point de montage sur lequel on veut retirer la taille :

Command btrfs
> btrfs filesystem resize -1G /mnt/
Resize '/mnt/' of '-1G'

Et voilà :-)

3.6 Raid 1

Il est possible de faire du Raid 1 software. Je vous rappelle qu'il faut des disques de la même taille, ou ce sera la taille du disque le plus petit qui sera utilisée. Nous allons commencer par initialiser notre Raid :

Command mkfs.btrfs
mkfs.btrfs -m raid1 -d raid1 /dev/sda3 /dev/sda4

Ensuite vous pouvez monter sda3 ou sda4, la réplication est effectuée :-)

3.7 Compression

3.7.1 A froid

Il est possible d'avoir un filesystem compressé. Pour cela, rien de plus simple :

Command mount
mount -t btrfs -o compress=lzo /dev/sda3 /mnt/

Si nous ajoutons l’option compress-force, la compression sur des fichiers que btrfs sera plus importante. De base, btrfs compresse mal, car pour des fichiers de taille importante cela peut entrainer beaucoup d'I/O. Le comportement de l’algorithme de compression à la volée de btrfs essaie donc d’épargner le processeur lorsqu’il détermine selon ses premières opérations si un fichier peut difficilement être compressé :

Command mount
mount -o compress=zlib,compress-force /dev/sda3 /mnt/

3.7.2 A Chaud

Si vous souhaitez pratiquer la même opération d’activation de la compression directement depuis un système de fichiers btrfs monté, nous pouvons utiliser la commande suivante qui activera l’option de compression et compressera les données déjà présentes sur le disque :

Command btrfs
btrfs filesystem defragment -czlib /mnt

3.8 Snapshot

Il existe plusieurs outils complémentaires qui permettent de gérer les snapshot tel que Snapper ou encore yum-plugin-fs-snapshot sous Fedora/RedHat. Mais pour le moment, nous allons voir comment gérer les snapshot à la sauce btrfs standard.

Nous créons depuis un volume l’instantané qui va nous permettre de faire des modifications sur cette arborescence de fichiers :

Command btrfs
btrfs subvolume nsnapshot /mnt /mnt/snapshot

Nous démontons maintenant le volume courant pour monter à la place notre instantané dans lequel nous créons un nouveau fichier :

Command mount
umount /mnt/
mount -o subvol=snapshot /dev/sda4 /mnt/

3.8.1 Revert

Si nous souhaitons annuler nos modifications, cela va être très simple, nous allons démonter notre snapshot et remonter l'ancien :

Command
umount /mnt
mount /dev/sda4 /mnt

3.8.2 Merge

Si nous souhaitons fusionner les données, nous devons récupérer l’identifiant de notre sous volume. Puis l’ordre set-default, suivi par l’identifiant du sous-volume suivi du point de montage du volume original permet de déclarer un nouveau volume par défaut :

Command
btrfs
> btrfs subvolume list /mnt
ID 146 top level 5 path snapshot
> btrfs subvolume set-default 146 /mnt

4 References

http://fr.wikipedia.org/wiki/Btrfs
http://www.funtoo.org/wiki/BTRFS_Fun
http://www.rashardkelly.com/extending-a-btrfs-filesystem-2/