Installation d’une Debian dans un sous-volume btrfs


Salut tout le monde. 🙂 Voici un petit article qui explique brièvement comment installer Debian dans un sous-volume btrfs. L’idée est donc d’avoir la racine de notre OS « ailleurs » qu’à celle du système de fichiers. De cette façon, il sera simple de faire des instantanés de tout notre OS et de pouvoir effectuer facilement des restaurations en cas de problème.

Mise en place du système

Pour commencer, je vous invite à télécharger un Live CD de Debian Archlinux, puis de démarrer dessus. Je préfère utiliser celui d’Arch, car il possède déjà de base pas mal de commandes bien pratiques qui permettent de rendre la tâche plus aisée.

Voici une procédure permettant l’installation. Toutes ces commandes sont à écrire une fois Archlinux correctement initialisé :

1.1 > loadkeys fr-bepo
1.2 > mkfs.btrfs /dev/sda
1.3 > mount -t btrfs -o compress=lzo /dev/sda /mnt
1.4 > btrfs subvolume create /mnt/host
1.5 > mount -t btrfs -o compress=lzo,subvol=host /dev/sda /mnt/host 
1.6 > pacman -Sy debootstrap
1.7 > debootstrap --arch amd64 --variant minbase jessie /mnt/host http://ftp.fr.debian.org/debian
1.8 > mount -t proc none /mnt/host/proc
1.9 > mount -o bind /dev /mnt/host/dev
1.10 > genfstab -U /mnt/host > /mnt/host/etc/fstab 
1.11 > chroot /mnt/host /bin/bash
1.12 > passwd
1.13 > export PATH=$PATH:/bin:/sbin:/usr/sbin
1.14 > apt-get update
1.15 > apt-get install linux-image-amd64 grub2 btrfs-tools
1.16 > exit
1.17 > reboot

La première chose à faire est de configurer la disposition du clavier pour éviter les frustrations (commande 1.1). ^^ » Puis nous formatons directement le volume qui contiendra notre système (1.2). À présent, nous avons à configurer notre volume btrfs pour contenir le sous-volume qui accueillera la racine de l’OS (commande 1.3 à 1.5). On notera d’ailleurs que j’utilise la compression lzo pour les volumes, c’est facultatif. Ici, il peut être intéressant de créer d’autres sous-volumes pour éviter de faire de futurs snapshots sur des éléments indésirables, ou pour gérer leurs révisions de façon séparées. Par exemple pour moi, cette vm me servira d’hyperviseur lxc. J’aurais donc des snapshots pour chaque répertoire de /var/lib/lxc/. De cette façon, effectuer une restauration de l’hôte n’impactera pas mes conteneurs, et il en va de même pour la réciproque. Une fois le système de fichier correctement configuré, on a plus qu’à y installer Debian via l’utilitaire debootstrap prévu à cet effet (1.7).

À présent, il est temps de configurer le fstab de notre futur OS, pour ce faire, on peut déjà commencé par monter manuellement /proc et /dev dans la racine du système de fichier utilisé par l’OS (1.8 et 1.9), puis d’utiliser la commande genfstab pour nous générer une partie de notre fstab (1.10). Il faudra le mettre à jour pour qu’au final, il ressemble à ça :

UUID=b2187236-694a-40a0-a9ca-10f0838b0ca7	/ 	btrfs rw,relatime,compress=lzo,space_cache,subvol=host 0 0        btrfs 	rw,relatime,compress=lzo,space_cache,subvol=host 0 0    rw,relatime,compress=lzo,space_cache,subvol=host	0 0
UUID=b2187236-694a-40a0-a9ca-10f0838b0ca7	/mnt/volume 	btrfs rw,relatime,compress=lzo,space_cache 0 0   btrfs 	rw,relatime,compress=lzo,space_cache 0 0    rw,relatime,compress=lzo,space_cache	0 0
proc						/proc		proc	defaults

Bien entendu, il faudra conserver l’UUID correspondant à votre disque, mais je vous invite à faire deux modifications : enlever l’option subvolumid de l’entrée /, et d’ajouter un point de montage sur /mnt/volume correspondant à la racine du volume btrfs. En ne conservant qu’une notion de nom de sous-volume au niveau du fstab, il nous sera permis de changer celui-ci sans avoir à rééditer le fichier (ce qui aurait été nécessaire dans le premier cas, car l’id du sous-volume aurait changé).

La dernière étape consiste à la configuration et à l’installation des derniers paquets au niveau de notre nouveau système. On commencera par faire un chroot pour changer notre contexte du Live CD, à celui de notre nouveau système (commande 1.11). On pourra ensuite définir un mot de passe pour le compte root (1.12) et mettre à jour la variable d’environnement $PATH pour qu’elle ressemble plus à ce que l’on peut trouver sur un système Debian (1.13). Enfin, il nous restera plus qu’à installer une image du kernel, et Grub qui devrait être capable de se configurer automatiquement et d’être en mesure de booter le système. Le programme btrfs-tools servira à encore avoir accès à la commande btrfs, qui n’est pas présente par défaut.

Testons tout ça une fois notre premier redémarrage d’effectué :

2.1 > btrfs subvolume show /
/
	Name: 			host
	uuid: 			93c4231a-c61c-d246-9bbf-4b9cfcc4d8bd
	Parent uuid: 		-
	Creation time: 		2017-04-09 10:10:29
	Object ID: 		258
	Generation (Gen): 	4466
	Gen at creation: 	8
	Parent: 		5
	Top Level: 		5
	Flags: 			-
	Snapshot(s):

Réalisation des instantanés et restauration

3.1 > btrfs subvolume snapshot -r / /mnt/volume/host-snap1
Create a readonly snapshot of '/' in '/mnt/volume/host-snap1'

3.2 > btrfs subvolume list /
ID 258 gen 4469 top level 5 path host
[…]
ID 272 gen 4500 top level 5 path host-snap1

3.3 >  ls -lah /mnt/volume/
total 16K
drwxr-xr-x 1 root root 378 Apr 14 13:22 .
drwxr-xr-x 1 root root  42 Apr 14 13:17 ..
drwxr-xr-x 1 root root 186 Apr 14 13:21 host
drwxr-xr-x 1 root root 186 Apr 14 13:21 host-snap1
[…]

La commande 3.1 créé notre instantané de / à l’emplacement /mnt/volume/host-snap1. Ce qui signifie, à l’emplacement /host-snap1 du volume btrfs. La seconde commande (3.2) permet de confirmer la bonne création de celui-ci : on voit bien la création d’un nouveau sous-volume dont l’id est le 272. À présent, toutes les modifications que l’on fera sur / n’impacterons pas /mnt/volume/host-snap1. Enfin, la commande 3.3 n’est là que pour nous montrer à quel point la gestion interne de btrfs est transparente, car notre instantané peu s’utiliser de la même façon que n’importe quel dossier.

Vu que démonter / n’est pas très faisable sur un système en cours d’utilisation, pour restaurer un instantané à ce niveau, on aura d’autres choix que de le faire de façon « externe » (c’est-à-dire depuis un autre OS). La plus simple des façons est donc de remonter notre Live CD d’Archlinux et d’y effectuer les commandes suivantes :

4.1 > mount -t btrfs /dev/sda /mnt
4.2 > btrfs subvolume delete /mnt/host
Delete subvolume (no-commit): '/mnt/host'
4.3 > btrfs subvolume snapshot /mnt/host-snap1 /mnt/host
Create a snapshot of '/mnt/host-snap1' in '/mnt/host'
4.4 > reboot

Comme pour la première fois, on monte notre système de fichier (4.1). Ensuite, on supprime le sous-volume que l’on utilisait précédemment (4.2), puis nous en créons un nouveau, en lecture-écriture cette fois, de notre backup vers le point de montage /mnt/host sur lequel on redémarrera les fois futures. Après un reboot et un retrait du CD, nous pouvons constaté le succès du rollback :

5.1 > btrfs subvolume list /
ID 272 gen 4500 top level 5 path host-snap1
ID 273 gen 4534 top level 5 path host

5.2 > btrfs subvolume show /
/
	Name: 			host
	uuid: 			0a63e313-9561-794c-8bf7-adc34a361d29
	Parent uuid: 		9bd74b18-3405-174a-b413-961086c9a712
	Creation time: 		2017-04-14 13:45:16
	Object ID: 		273
	Generation (Gen): 	4535
	Gen at creation: 	4500
	Parent: 		5
	Top Level: 		5
	Flags: 			-
	Snapshot(s):

L’object ID du sous-volume monté à la racine est bien le 273, qui n’est autre qu’un sous-volume en lecture/écriture de 272, représentant un instantané de 258, qui n’existe plus, car on l’a supprimé.


Crédit image :