Projet

Général

Profil

BtrFs » Historique » Version 2

« Précédent - Version 2/9 (diff) - Suivant » - Version actuelle
Fabien Dupont, 09/05/2013 13:58


BtrFs

Présentation

BtrFs (se prononce « Butter FS ») est un filesystem de type CoW (« Copy on Write »). C'est à dire que deux données identiques (même CRC32) ne sont écrites qu'une seule fois sur le filesystem jusqu'à ce qu'une des deux soit modifiées.

Exemple :

$ cat toto > fichier1        # « toto » est écrit quelque part sur le disque dur
$ cat toto > fichier2        # fichier2 devient un pointeur vers fichier1
$ sed -ie 's/o/a/g' fichier2 # « tata » est écrit quelque part sur le disque dur
                             # et fichier2 n'est plus un pointeur vers fichier1

De plus, BtrFs est différents des systèmes de fichiers « classiques » (ext2/3/4) car il offre les fonctionnalités suivantes :

  • possibilité d'écrire le filesystem sur plusieurs disques : raid1, raid0, raid10 et depuis le kernel 3.9, raid5 ou raid6.
  • sous-volumes : il n'y a pas de notion de partitions mais un répertoire peut devenir la racine d'un nouveau volume.
  • snapshots : une image peut être créée et utilisée pour sauvegarder ou restaurer l'état d'un filesystem (ou d'un sous-volume) à un instant T.

Création d'un filesystem BtrFs sous debian

Le paquet « btrfs-tools » offre les outils permettant la création et la gestion d'un filesystem BtrFs.

# apt-get install btrfs-tools

Single

Les données et les métadonnées sont écrites sur un seul disque.

# mkfs.btrfs -d single /dev/sdb

raid0

Les données sont « stripées » sur deux disques. Il faut donc un minimum de 2 disques.

# mkfs.btrfs -d raid0 -m raid0 /dev/sdb /dev/sdc

Par exemple pour un fichier contenant « abcdefgh », on aura sur les disques :

+-----+   +-----+
| sdb |   | sdc |
+-----+   +-----+
|  a  |   |  b  |
|  c  |   |  d  |
|  e  |   |  f  |
|  g  |   |  h  |
+-----+   +-----+

Pros :

  • Performance accrue en lecture, un fichier est lue sur deux disques, débit doublé.
  • Plusieurs disques sont vus en un seul volume.

Cons :

  • Sécurité des données faible, si un seul disque tombe en panne, l'ensemble des données est perdue.

raid1

Les données sont « mirrorées » sur deux disques. Il faut donc un minimum de 2 disques.

# mkfs.btrfs -d raid1 -m raid1 /dev/sdb /dev/sdc

Par exemple pour un fichier contenant « abcdefgh », on aura sur les disques :

+-----+   +-----+
| sdb |   | sdc |
+-----+   +-----+
|  a  |   |  a  |
|  b  |   |  b  |
|  c  |   |  c  |
|  d  |   |  d  |
|  e  |   |  e  |
|  f  |   |  f  |
|  g  |   |  g  |
|  h  |   |  h  |
+-----+   +-----+

Pros :

  • Sécurité des données forte, N-1 disques peuvent tomber en panne avant de perdre les données.

Cons :

  • Pour N disques de taille T, on n'a que T octets à disposition.

raid10

Les données sont « mirrorées » sur N/2 disques puis « stripées » entre les 2 N/2 disques. Il faut donc un minimum de 4 disques.

# mkfs.btrfs -d raid10 -m raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde

Par exemple pour un fichier contenant « abcdefgh », on aura sur les disques :

        <-------raid0------->
<-----raid1----->   <-----raid1----->
+-----+   +-----+   +-----+   +-----+
| sdb |   | sdc |   | sdd |   | sde |
+-----+   +-----+   +-----+   +-----+
|  a  |   |  a  |   |  b  |   |  b  |
|  c  |   |  c  |   |  d  |   |  d  |
|  e  |   |  e  |   |  f  |   |  f  |
|  g  |   |  g  |   |  h  |   |  h  |
+-----+   +-----+   +-----+   +-----+

Pros :

  • Sécurité des données forte, N-1 disques dans chaque morceau du raid0 peuvent tomber en panne avant de perdre les données.
  • Performance accrue en lecture, un fichier est lue sur deux disques, débit doublé.
  • Plusieurs disques sont vus en un seul volume.

Cons :

  • Pour N disques de taille T, on n'a que (N×T)/2 octets à disposition.

raid5 (kernel >= 3.9)

Les données sont « stripées » sur N-1 disques puis la parité d'un « stripe » est écrite sur le dernier disque. Il faut donc un minimum de 3 disques.

# mkfs.btrfs -d raid5 -m raid5 /dev/sdb /dev/sdc /dev/sdd

Par exemple pour un fichier contenant « abcdefgh », on aura sur les disques :

+-----+   +-----+   +-----+
| sdb |   | sdc |   | sdd |
+-----+   +-----+   +-----+
|  a  |   |  b  |   |  p1 |
|  p2 |   |  c  |   |  d  |
|  e  |   |  p3 |   |  f  |
|  g  |   |  h  |   |  p4 |
+-----+   +-----+   +-----+

Pros :

  • Sécurité des données forte, 1 disque peut tomber en panne avant de perdre les données.
  • Plusieurs disques sont vus en un seul volume.

Cons :

  • Pour N disques de taille T, on n'a que (N-1)×T octets à disposition.

raid6 (kernel >= 3.9)

Les données sont « stripées » sur N-2 disques puis la parité d'un « stripe » est « mirrorée » sur 2 disques. Il faut donc un minimum de 4 disques.

# mkfs.btrfs -d raid6 -m raid6 /dev/sdb /dev/sdc /dev/sdd

Par exemple pour un fichier contenant « abcdefgh », on aura sur les disques :

+-----+   +-----+   +-----+   +-----+
| sdb |   | sdc |   | sdd |   | sde |
+-----+   +-----+   +-----+   +-----+
|  a  |   |  b  |   |  p1 |   |  p1 |
|  p2 |   |  c  |   |  d  |   |  p2 |
|  p3 |   |  p3 |   |  e  |   |  f  |
|  g  |   |  p4 |   |  p4 |   |  h  |
+-----+   +-----+   +-----+   +-----+

Pros :

  • Sécurité des données forte, 2 disques peut tomber en panne avant de perdre les données.
  • Plusieurs disques sont vus en un seul volume.

Cons :

  • Pour N disques de taille T, on n'a que (N-2)×T octets à disposition.

Administration d'un volume BtrFs

Sous-volumes (subvolumes)

Un sous-volume n'est pas équivalent à LVM. C'est une racine sous la racine.

Un sous-volume peut contenir une hierarchie de fichiers ou bien une image (« snapshot ») d'un autre sous-volume à un instant T.

Par exemple, dans un même volume, on peut avoir :

+-+- root (sous volume par défaut)
| +-- /bin
| +-- /usr
| +-- ...
|
+-+- home
| +-- /home
|
+-+- snapshot_root1
| +-- /bin
| +-- /usr
| +-- ...
|
.
.

Création d'un sous-volume

Par exemple, pour créer un sous-volume /mnt/home dans le volume BtrFs monté dans /mnt :

# btrfs subvolume create /mnt/home

/!\ /mnt/home ne doit pas exister. Il apparaîtra tel un répertoire, du point de vue de l'utilisateur mais ce n'en n'est pas un.

Création d'un snapshot dans un sous-volume :

Par exemple, pour créer un snapshot de /mnt/home :

# ls -l /mnt/home/fab
/mnt/home/fab:
total 0
# btrfs subvolume snapshot /mnt/home /mnt/snapshot_of_home
# touch /mnt/home/fab/toto
# ls -l /mnt/home/fab /mnt/snapshot_of_home/fab
/mnt/home/fab:
total 0
-rw-r--r-- 1 root root 0 May  9 13:49 toto

/mnt/snapshot_of_home/fab:
total 0

On voit bien que le snapshot contient l'état de /mnt/home avant la création du fichier toto.

Monter un sous-volume

Pour monter un sous-volume précédement créé :

# btrfs subvolume list /mnt
ID 261 gen 37 top level 5 path home
ID 262 gen 41 top level 5 path snapshot_of_home
# mount /dev/sdb1 /home -o subvolume=home
#  df -HTP | grep sdb1
/dev/sdb1      btrfs     8.0T  6.7G  8.0T   1% /home
/dev/sdb1      btrfs     8.0T  6.7G  8.0T   1% /mnt
# mkdir /home/fab
# chown fab:fab /home/fab
# ls -ld /mnt/home/fab /home/fab
drwxr-xr-x 1 fab fab 8 May  9 13:49 /mnt/home/fab
drwxr-xr-x 1 fab fab 8 May  9 13:49 /home/fab