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 folcalisan 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 systemes de fichiers classiques ext3 et ext4.

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 puisque Btrfs va écrire les modifications sur le disque. 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étadonnné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 redimentionnement 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 formater la partition /dev/sdX1 taper :

mkfs.btrfs -L label /dev/sdX1

Il peut être 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 vérifiez 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
btrfs balance start /point-de-montage

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 système du volume et Metadata aux métadonnées associées aux différents fichiers (sommes de contrôles 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 système 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 système 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écessaire.

Installation de / (root) dans un volume btrfs

Depuis Wheezy, Debian gère le btrfs lors du processus d'installation. Il y a trois méthodes au moins pour installer Debian sur un système de fichiers btrfs :

  • Utiliser le btrfs comme un système de fichiers classique et installer Debian à la racine du volume.
    • C'est la méthode la plus simple, mais c'est dommage. L’intérêt de btrfs c'est de répartir ses données dans différents subvolumes de façon à pouvoir en réaliser des snapshots. Mettre / à la racine du btrfs ne permet pas cela.
    • Le processus d'installation est le même que pour un autre système de fichiers. Il faudra cependant revoir les options de montages dans le fstab.
    • Il sera éventuellement possible de déplacer tous les fichiers de / dans un subvolume par la suite (avec un cp -Ra par exemple). MAIS ATTENTION !!! Il faudra apporter des modifications au grub.cfg sinon le système ne bootera plus automatiquement. Cet aspect sera traité par la suite.
  • Utiliser un méthode d'installation via chroot. La méthode est flexible donc l'installation du système de base directement dans un subvolume sera aisé.
    • C'est la méthode la plus élégante, puisqu'elle est très flexible.
    • Je ne vais pas détailler cette méthode ici, il y a des tutoriels bien faits (par exemple ici). Sachez juste qu'il suffit au moment du montage des partitions d'ajouter dans les options de montage subvol=chemin/vers/le/subvolume/racine pour utiliser le subvolume comme racine.
    • Grub sait maintenant bien gérer le btrfs même à l'intérieur d'un subvolume. Par contre, dans le cas d'un multi-boot, os-prober ne va pas fouiller dans tous les subvolumes, donc votre nouveau système ne saura pas trouvé par la commande update-grub d'un autre système. Je propose une méthode plus bas.
    • La méthode d'installation via chroot est utilisée par Arch et Gentoo entre autre. Il est donc simple d'installer ces distributions dans un subvolume.
  • Utiliser le mode d'installation expert pour installer Debian dans un subvolume.
    • La méthode est moins élégante que la précédente et c'est pour ça que je vais la détailler. :-P
    • Il est possible d'utiliser un cd d'installation de Wheezy, même si, encore une fois, il vaut mieux avoir un kernel à jour. Rien ne vous empêche d'activer les dépots de testing ou sid après installation.

Installation dans un subvolume à l'aide du cd d'installation Debian

On se place ici dans le cas où vous avez un système déjà bootable (par exemple Debian sur une partition ext4 qui boote avec Grub). Je suppose que vous avez de l'espace sur votre disque pour créer une partition de 20Go environs en btrfs. (le but étant de tester)

Si vous utilisez un disque vierge, c'est pareil au niveau de l'installation, par contre Grub ne gère pas les disques Btrfs sans table de partition (mkfs.btrfs /dev/sda). Il vous faut créer un table des partitions avec un MBR et juste une partition primaire sur tout le disque (ou avec un swap aussi si vous voulez).

Donc :
  • Pour un disque bootable il faut une table des partitions (MBR, GPT..) et donc le volume btrfs sera du type /dev/sdaX
  • Pour un disque de donnée vous pouvez vous passer de la table de partitions, le volume btrfs sera de type /dev/sda, mais le disque ne sera pas bootable seul. Rien ne vous empêche cependant de booter depuis un autre disque. Par contre l'installateur de Debian ne fonctionnera pas sur ce type de disque, il faudra passer pas la méthode chroot.

Dans le cas où il y aurais déjà des données ou un système d'exploitation dans le volume btrfs cette méthode marche aussi.

Rebootez sur le CD ou l'USB d'installation.

Allez dans les Options Avancées et choisissez l'Installation Expert (graphique ou pas)

Faites l'installation comme normalement jusqu'au partitionnement.

Choisir la langue
Configurer le clavier
Détecter et monter le CD
Charger des composants d'installation à partir du CD
Détecter le réseau
Configurer le réseau
Créer les utilisateurs et choisir les mots de passe
Configurer l'horloge
Détecter les Disques

Une fois les disques détectés :

Exécuter un shell (ligne de commande)

On monte le volume btrfs dans /mnt

mount -t btrfs -o ..options.. /dev/sdaX /mnt

On va créer les subvolumes où l'on désire installer Debian :

cd /mnt
btrfs subvolume create debian
cd debian
btrfs subvolume create root
btrfs subvolume create home

Si vous êtes adepte d'un /usr séparé ajoutez le subvolume correspondant. Après c'est une histoire d'organisation.

Étant donné que les snapshots ne sont pas récursifs il peut être intéressant de mettre /proc et /var dans des subvolumes afin de limiter la taille des snapshots.

On monte les subvolumes dans /target :

cd /
mkdir -p /target
mount -t btrfs -o ..options..,subvol=debian/root /dev/sdaX /target
mkdir /target/home
mount -t btrfs -o ..options..,subvol=debian/home /dev/sdaX /target/home
(umount /mnt)
cat /proc/self/mountinfo
exit

La dernière commande devrais vous donner la liste des volumes montés y compris les subvolumes.

Et on se lance pour l'installation du système de base (qui va s'installer dans /target donc…)

Installer le système de base

Normalement l'installateur va se plaindre que vous n’êtes pas passés par l'étape “Partitionner les disques” Choisissez “Revenir en arrière” jusqu’à qu'il lâche l'affaire et installe le système de base (2 fois).

Et voilà ! le système s'installe et le reste de l'installation peut se faire normalement.

GRUB

Grub est maintenant capable d'ajouter lui même les options de montage dans grub.cfg. Donc si vous installez un système tout neuf il n'y aura pas de soucis, il s'occupera de détecter que le /boot est dans un subvolume, écrira dans le MBR et tout ira bien.

Grub est même capable de booter depuis un /boot compressé en lzo ou zlib !
Ce n'est pas le cas de Syslinux. Pour utiliser syslinux il vous faudra empêcher la compression de /boot :
cd /subvolume/racine/
mv /boot /boot-old
mkdir /boot
chattr -c /boot
mv /boot-old/* /boot/
rm -R /boot-old

Ceci dit je vais quand même expliquer ici comment configurer le grub.cfg, pour tous les autres cas et au cas où vous fassiez un erreur.

ATTENTION assurez vous d'avoir une solution de secours AVANT d'installer votre système.
Personne n'est à l'abri d'une faute de frappe.
Et une faute de frappe peut rendre votre système non-bootable.
Donc munissez vous d'un LiveCD ou d'un LiveUSB afin de pouvoir avoir accès à votre grub.cfg en cas de pb.

Avant de vous lancer soyez sur que vous avez bien lu les tutoriels suivants :

Dans le cas ou vous voudriez que votre “vieux” système continue de booter depuis le mbr et que son grub.cfg s'occupe de faire booter le “nouveau” système sur btrfs :

Toujours dans l'installateur Debian installez grub. Mais n'installez pas le programme de démarrage GRUB sur le secteur d'amorçage !

vous pourrez désinstaller grub une fois que vous aurez booté le “nouveau” système.
Vous pouvez aussi continuer sans programme d’amorçage et utiliser le modèle de fichier 40_custom donné ci dessous à vos risques et périls
//Installer le programme de démarrage GRUB sur le secteur d'amorçage ?//
-> **Non**
puis..
//Périphérique où sera installé le programme de démarrage//
Laissez le champ vide

De cette façon on va pouvoir utiliser directement la partie concernant le boot du “nouveau” système du grub.cfg dans le “vieux” grub.cfg.

Terminer l'installation

Redémarrez votre “vieux” système

Ouvrez le grub.cfg du nouveau système :

mount /dev/sdaX -o ..options.. /mnt
cd /mnt/debian/root/boot/grub
mousepad grub.cfg

Copiez la partie après ### BEGIN …

menuentry 'Debian GNU/Linux, avec Linux 3.2.0-4-amd64' --class debian --class gnu-linux --class gnu --class os {
	load_video
	insmod gzio
	insmod part_gpt
	insmod btrfs
	set root='**(hd0,gpt3)**'
	search --no-floppy --fs-uuid --set=root **9201243d-1559-4b27-8973-070aeefa1079**
	echo	'Chargement de Linux 3.2.0-4-amd64 ...'
	linux	**__/debian/root__/boot/vmlinuz-3.2.0-4-amd64** root=UUID=**9201243d-1559-4b27-8973-070aeefa1079** ro **rootflags=subvol=__debian/root__**  quiet
	echo	'Chargement du disque mémoire initial ...'
	initrd	**__/debian/root__/boot/initrd.img-3.2.0-4-amd64**
}

Si vous n'avez pas installé Grub et n'avez donc pas de grub.cfg vous pouvez utiliser le schéma ci dessus en prenant soin de modifier les parties en gras

Vous noterez donc qu'il faut indiquer le chemin à vmlinuz et initrd depuis la racine du volume btrfs (parties soulignées),
ainsi qu'une option de boot
 rootflags=subvol=//chemin-vers-la-racine//

Ouvrez 40_custom de votre “vieux” système et collez y le menuentry précédent. Attention à ne pas effacer les premières lignes !

nano /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry 'Debian GNU/Linux, avec Linux 3.2.0-4-amd64' --class debian --class gnu-linux --class gnu --class os {
	load_video
	insmod gzio
	insmod part_gpt
	insmod btrfs
	set root='**(hd0,gpt3)**'
	search --no-floppy --fs-uuid --set=root **9201243d-1559-4b27-8973-070aeefa1079**
	echo	'Chargement de Linux 3.2.0-4-amd64 ...'
	linux	**__/debian/root__/boot/vmlinuz-3.2.0-4-amd64** root=UUID=**9201243d-1559-4b27-8973-070aeefa1079** ro **rootflags=subvol=__debian/root__**  quiet
	echo	'Chargement du disque mémoire initial ...'
	initrd	**__/debian/root__/boot/initrd.img-3.2.0-4-amd64**
}
chmod +x /etc/grub.d/40_custom
update-grub
Profitez en pour éditer le fstab du nouveau système :
nano /mnt/debian/root/etc/fstab
UUID=a69d9182-f4c7-4276-b35d-7d5f9bd50a57      /      btrfs      rw,noatime,ssd,discard,autodefrag,**subvol=debian/root**      0      0
UUID=a69d9182-f4c7-4276-b35d-7d5f9bd50a57      /home      btrfs      rw,noatime,ssd,discard,autodefrag,**subvol=debian/home**      0      0
swap...
tmpfs	/tmp tmpfs default	0	0

#Je vous conseille de monter le volume btrfs à la racine quelque part afin d'y avoir acces facilement
UUID=a69d9182-f4c7-4276-b35d-7d5f9bd50a57      /home/btrfs      btrfs      rw,noatime,ssd,discard,autodefrag,**nodev,nosuid,noexec**     0      0

Et voilà ! Au redémarrage vous aurez une entrée “Debian GNU/Linux, avec Linux 3.2.0-4-amd64” dans votre menu Grub et ça devrais booter !!

Backups incrémentales

L'intéret d'avoir la racine de son OS dans un subvolume est que l'on peut en faire des snapshots et booter dans ces snapshots en utilisant la methode ci dessus. Par exemple :

cp 40_custom 41_debian2
chmod +x 41_debian2

et changer les subvolumes dans le menuentry.

C'est pratique pour :

  • Essayer un autre gestionnaire de fenêtre sans abimer la config actuelle.
  • Essayer systemd (puisque c'est d'actualité)
  • Faire des bêtises avec rm …
  • Assurer ses arrières quand on est sous sid…
  • Ai-je besoin d'énumérer toutes les raisons de casser son système ?? :-P

Pour celà je vais présenter 2 méthodes, une qui sera basée sur des scripts et cron et l'autre sur snapper qui est dans les dépots

Sur un même volume physique

Dans ce cas on veut faire des snapshot et les garder dans la même partition. Ça protège des erreurs de manupulation mais pas des pannes de disques.

Snapper

Snapper est un programme qui gère les snapshots et qui a été développé par OpenSuse.

 apt-get install snapper
man snapper

Pour des snapshots automatiques de la racine :

snapper -c root create-config /

Ceci va créer un subvolume /.snapshot à la racine et les snapshots seront placés dedans. Les snaphots se font toutes les heures

Vous pouvez éditer /etc/snapper/configs/root pour changer le nombre de snaphsots que snapper va garder au fil du temps.

# limits for timeline cleanup
TIMELINE_MIN_AGE="1800"
TIMELINE_LIMIT_HOURLY="10"
TIMELINE_LIMIT_DAILY="10"
TIMELINE_LIMIT_MONTHLY="10"
TIMELINE_LIMIT_YEARLY="10"

La configuration par défaut garde les 10 derniers snapshots (pris toutes les heures), 10 snapshots par jour, 10 snapshots par mois et 10 snapshots par an… Changez ces paramêtre selon vos besoins.

Sachant que la taille d'un snapshot sur le disque corespond aux modifications sur les fichiers entre le snapshot et son subvolume parent. Je vous laisse donc imaginer la place pris sur le disque d'un snapshot qui a un an !
Notez encore une fois que les snapshots ne sont pas récursifs !
Si vous avez /home dans un subvolume, alors votre /home ne sera pas snapshotté. recréez alors une configuration pour home
snapper -c home create-config /home

Voici ce que vous aurez une semaine après :

snapper list
Type   | #   | Pré # | Date                           | Utilisateur | Nettoyage | Description | Données utilisateur
-------+-----+-------+--------------------------------+-------------+-----------+-------------+--------------------
single | 0   |       |                                | root        |           | current     |                    
single | 475 |       | jeu. 06 mars 2014 00:17:01 CET | root        | timeline  | timeline    |                    
single | 488 |       | ven. 07 mars 2014 00:17:01 CET | root        | timeline  | timeline    |                    
single | 501 |       | sam. 08 mars 2014 00:17:01 CET | root        | timeline  | timeline    |                    
single | 507 |       | dim. 09 mars 2014 00:17:01 CET | root        | timeline  | timeline    |                    
single | 519 |       | lun. 10 mars 2014 00:17:01 CET | root        | timeline  | timeline    |                    
single | 531 |       | mar. 11 mars 2014 00:17:01 CET | root        | timeline  | timeline    |                    
single | 538 |       | mer. 12 mars 2014 09:17:01 CET | root        | timeline  | timeline    |                    
single | 548 |       | mer. 12 mars 2014 19:17:01 CET | root        | timeline  | timeline    |                    
single | 549 |       | mer. 12 mars 2014 20:17:01 CET | root        | timeline  | timeline    |                    
single | 550 |       | mer. 12 mars 2014 21:17:01 CET | root        | timeline  | timeline    |                    
single | 551 |       | mer. 12 mars 2014 22:17:01 CET | root        | timeline  | timeline    |                    
single | 552 |       | mer. 12 mars 2014 23:17:01 CET | root        | timeline  | timeline    |                    
single | 553 |       | jeu. 13 mars 2014 12:17:01 CET | root        | timeline  | timeline    |                    
single | 554 |       | jeu. 13 mars 2014 13:17:02 CET | root        | timeline  | timeline    |                    
single | 555 |       | jeu. 13 mars 2014 14:17:01 CET | root        | timeline  | timeline    |                    
single | 556 |       | jeu. 13 mars 2014 16:17:01 CET | root        | timeline  | timeline    |                    
single | 557 |       | jeu. 13 mars 2014 17:17:01 CET | root        | timeline  | timeline    |                    
single | 558 |       | jeu. 13 mars 2014 18:17:01 CET | root        | timeline  | timeline    |                    
single | 559 |       | jeu. 13 mars 2014 19:17:01 CET | root        | timeline  | timeline    |                    
single | 560 |       | jeu. 13 mars 2014 20:17:01 CET | root        | timeline  | timeline    |                    
single | 561 |       | jeu. 13 mars 2014 21:17:01 CET | root        | timeline  | timeline    |                    
single | 562 |       | jeu. 13 mars 2014 22:17:01 CET | root        | timeline  | timeline    |                    

Manuellement

Le principe de base est simple : un script bash et cron.

btrfs subvolume snapshot /home/btrfs/debian/home /home/btrfs/snapshots/home-backup-$(date)

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 transaction échouera. Je conseille de vérifier que le transfert 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 système 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.1394750746.txt.gz · Dernière modification: 13/03/2014 23:45 par louispolaire

Pied de page des forums

Propulsé par FluxBB