URL: https://linuxfr.org/news/btrfs-snapshot-et-rollback-sur-votre-systeme-gnu-linux Title: [Btrfs] Snapshot et rollback sur votre systĂšme GNU/Linux Authors: Marc Quinton Anonyme, bubarđŸŠ„, gipoisson, Davy Defaud, ZeroHeure, palm123, BenoĂźt Sibaud, AR7, Florent Zara et patrick_g Date: 2016ćčŽ12月28æ—„T09:27:49+01:00 License: CC By-SA Tags: btrfs, opensuse, scientific_linux, debian, ubuntu, fedora et tutoriel Score: 50 Mise en place d’un mĂ©canisme de _snapshot/rollback_ sur systĂšme d’exploitation GNU/Linux avec le systĂšme de fichiers Btrfs. Cet article fait suite Ă  des travaux de mise en place, sur les systĂšmes que je gĂšre, d’un mĂ©canisme d’instantanĂ©s (_snapshots_) et de retour en arriĂšre (_rollback_) sur la partition racine. Tout ce qui suit s’applique en principe Ă  une distribution Debian ou dĂ©rivĂ©es, mais doit ĂȘtre adaptable aux autres distributions GNU/Linux. Sur les distributions Fedora ce sont les gestionnaires de paquets YUM et DNF qui intĂšgrent nativement les instantanĂ©s Btrfs permettant de faire des mises Ă  jour avec possibilitĂ© de retour en arriĂšre, assurant ainsi une grande stabilitĂ© et tranquillitĂ© d’exploitation pour l’administrateur systĂšme. ---- [Documentation de Btrfs](https://btrfs.wiki.kernel.org/index.php/Main_Page#Documentation) [Wiki Btrfs sur Archlinux](https://wiki.archlinux.org/index.php/Btrfs) [Snapper](http://snapper.io/) ---- Il s’agit pour moi de ma premiĂšre expĂ©rience en qualitĂ© de rĂ©dacteur d’article, aussi je vous rĂ©clame toute votre indulgence. Je ferai au mieux pour apporter une information complĂšte et claire. Voici le [commentaire](http://linuxfr.org/users/dzecniv/journaux/gnu-guix-et-guix-sd-0-12-0-la-distro-et-le-gestionnaire-de-paquets-au-paradigme-fonctionnel#comment-1686790) Ă  l’origine de cet article, portant sur le mĂȘme sujet. Ayant cherchĂ© pendant un certain temps Ă  mettre en place une solution fonctionnelle permettant un retour en arriĂšre (_rollback_) suite Ă  une mise Ă  jour systĂšme dĂ©faillante, j’ai le plaisir de vous faire dĂ©couvrir la recette magique. Nous verrons que la procĂ©dure est plus ou moins complexe suivant la distribution. Suite Ă  une conclusion personnelle, je vous donnerai, pour terminer, une liste de liens. Je remercie vivement tous les corĂ©dacteurs de cet article. Description =========== L’exploitation d’une machine GNU/Linux dans une entreprise ou Ă  titre privĂ© demande de rĂ©aliser des interventions rĂ©guliĂšres : mises Ă  jour systĂšme et applicatives. GĂ©nĂ©ralement, on s’appuie sur un gestionnaire de paquets. Beaucoup connaissent ici la fameuse commande `apt-get install `. Souvent, l’installation d’un paquet, bien qu’étant complexe dans les mĂ©canismes internes, se dĂ©roule normalement sans incident. Cela d’autant plus que l’on s’appuie sur une distribution intĂ©grant un processus de contrĂŽle et validation des mises Ă  jour de paquets. Il arrive, au contraire, que ce qui fonctionne habituellement de maniĂšre transparente, conduise Ă  un incident sur le service ou le serveur. On se retrouve alors trĂšs embarrassĂ© et avec au mieux la possibilitĂ© de restaurer le systĂšme (grĂące aux sauvegardes effectuĂ©es en amont), au pire une cohorte d’utilisateurs mĂ©contents en attente de la restauration du service. La procĂ©dure de restauration n’est pas toujours explicite et peut ĂȘtre complexe. Le temps pour le faire assez long, ce qui engendre une interruption de service consĂ©quente. Pour remĂ©dier Ă  ces Ă©ventuelles difficultĂ©s, il faudrait pouvoir disposer d’une image du systĂšme créée Ă  la demande ou rĂ©guliĂšrement. Ces images sont appelĂ©es ici _snapshots_. Ce sont des instantanĂ©s du systĂšme de fichiers pris Ă  un instant donnĂ©. IdĂ©alement ces _snapshots_ devront couvrir l’ensemble des donnĂ©es liĂ©es Ă  l’application et au systĂšme d’exploitation. On pourra exclure les donnĂ©es utilisateurs (`/home`) si elles rĂ©sident sur le mĂȘme serveur, de mĂȘme que les donnĂ©es applicatives (bases de donnĂ©es, etc.). Le terme _rollback_ est repris du monde des bases de donnĂ©es relationnelles. Une transaction complexe sera validĂ©e dans son ensemble si l’ensemble des transactions Ă©lĂ©mentaires aboutissent. Si une seule Ă©choue, l’ensemble de la transaction est annulĂ©e : on parle de retour en arriĂšre ou _rollback_. IdĂ©alement, il faudrait pouvoir bĂ©nĂ©ficier des mĂȘmes services quand on exploite un systĂšme GNU/Linux. Pour cela, on pourra s’appuyer sur un systĂšme de fichiers bĂ©nĂ©ficiant d’instantanĂ©s. Les candidats sont : [LVM](https://fr.wikipedia.org/wiki/Gestion_par_volumes_logiques), [Btrfs](https://fr.wikipedia.org/wiki/Btrfs), [XFS](https://fr.wikipedia.org/wiki/XFS)... Paradoxalement, ces mĂ©canismes sont disponibles en environnement virtualisĂ© (VirtualBox) ou via la para‐virtualisation (Docker, LXC) et sont trĂšs faciles Ă  mettre en Ɠuvre, alors qu’il faut parfois batailler pour avoir des fonctionnalitĂ©s similaires si l’on travaille avec les gestionnaires de paquets usuels. Comme l’indique [une rĂ©ponse](https://linuxfr.org/nodes/110890/comments/1686804) au commentaire Ă  l’origine de l’article, certaines distributions proposent une solution basĂ©e sur _snapper_ ; en l’occurrence, la distribution mentionnĂ©e dans la rĂ©ponse est Arch Linux. [_snapper_](https://en.opensuse.org/Portal:Snapper) est un outil venant d’openSUSE dont une des fonctionnalitĂ©s est la crĂ©ation d’instantanĂ©s Ă  l’aide des gestionnaires de paquets YaST et zypp. Cela signifie que les distributions openSUSE et dĂ©rivĂ©es intĂšgrent nativement la gestion des instantanĂ©s sur les systĂšmes de fichiers Btrfs et [LVM](https://lizards.opensuse.org/2012/07/25/snapper-lvm/). D’autres distributions ont fait des efforts pour porter _snapper_ Ă  leurs infrastructures respectives. Outre Arch Linux susmentionnĂ©e, il y a des paquets _snapper_ créés automatiquement par les dĂ©veloppeurs openSUSE [pour d’autres distributions](https://build.opensuse.org/project/show?project=filesystems%3Asnapper), Ă  savoir CentOS, Debian, Fedora, RHEL, SLE, Scientific Linux et Xubuntu. PrĂ©requis techniques ==================== Il faut disposer d’une machine avec un systĂšme d’exploitation GNU/Linux comportant : - une partition racine au format Btrfs ainsi que l’utilitaire associĂ© (paquet `btrfs-tools`) ; - un espace disque suffisant pour gĂ©rer des instantanĂ©s. Sachez qu’il est possible de [convertir](https://btrfs.wiki.kernel.org/index.php/Conversion_from_Ext3) une partition au format ext3 ou ext4 vers le format Btrfs avec la commande `btrfs-convert`. Introduction Ă  Btrfs ==================== Avant de vous lancer dans l’exploitation de volumes Btrfs, sachez que certains bogues liĂ©s Ă  la gestion des [[RAID]] 5 et 6 [persistent](https://btrfs.wiki.kernel.org/index.php/Status). Il est gĂ©nĂ©ralement conseillĂ© de n’utiliser Btrfs que dans certains cas : sauvegarde ou en excluant les RAID 5 et 6. Pour le reste, Btrfs apporte des fonctionnalitĂ©s simples Ă  utiliser dont il serait dommage de se priver : haute disponibilitĂ© par la mise en Ɠuvre de fonctions de maintenance Ă  chaud (en ligne). FonctionnalitĂ©s de Btrfs ------------------------ - Btrfs s’appuie sur la notion de volumes et sous‐volumes ; - le volume principal est une partition et sera formatĂ© avec la commande `mkfs.btrfs` ; - les sous‐volumes seront gĂ©rĂ©s par la commande `btrs subvolume create ` ; - un sous‐volume peut ĂȘtre créé dans le volume principal ou dans un sous‐volume ; - un instantanĂ© est un sous‐volume avec des caractĂ©ristiques particuliĂšres : volume [COW](https://fr.wikipedia.org/wiki/Copy-on-write "Copy‐on‐Write — Copie sur Ă©criture") + attributs lecture seule ou lecture‐écriture, etc. ; - Btrfs gĂšre la notion de volume par dĂ©faut : `btrfs subvolume [set-default|get-default]` ; - il est possible de monter un sous‐volume par son nom ou son identifiant ; c’est ce mĂ©canisme qui est utilisĂ© au moment du dĂ©marrage du systĂšme (GRUB et fstab). On pourra se reporter au [guide de prise en main](https://btrfs.wiki.kernel.org/index.php/Getting_started) de Btrfs pour les dĂ©tails de mise en Ɠuvre. L’objet premier de cet article est de montrer les mĂ©canismes de mise en Ɠuvre de _snapshot/rollback_ sur systĂšme d’exploitation GNU/Linux. Petite prĂ©cision : la commande `btrfs` accepte des arguments dont la longueur importe peu, en effet les trois commandes ci‐dessous sont identiques : ```bash btrfs subvolume list / btrfs sub l / btrfs su l / ``` Il est juste nĂ©cessaire que les arguments passĂ©s Ă  la commande `btrfs` soient suffisamment discriminants. Mise en Ɠuvre manuelle ====================== Dans un premier temps, je vous montrerai une mise en Ɠuvre d’un instantanĂ© permettant le redĂ©marrage d’un systĂšme GNU/Linux depuis un Ă©tat antĂ©rieur rĂ©putĂ© fonctionnel. Par la suite, on verra qu’il est possible d’automatiser la procĂ©dure, en particulier avec des outils tels que _snapper_ ou des greffons complĂ©mentaires aux gestionnaires de paquets GNU/Linux. L’idĂ©e consiste Ă  : 1. rĂ©aliser un instantanĂ© de la racine ; 1. effectuer les modifications ; dans le cas prĂ©sent, il suffira de crĂ©er des fichiers sur le compte _root_ pour la dĂ©monstration ; 1. procĂ©der au retour en arriĂšre avec la commande `btrfs subvolume set-defaut`. Pour vous faire la main, vous ferez les manipulations dans une machine virtuelle. Vous avez l’embarras du choix. Il vous suffit d’installer une distribution GNU/Linux en mode console avec le minimum de paquets et d’effectuer un instantanĂ© une fois le systĂšme d’exploitation installĂ©. Rien de nouveau sur ce sujet. Je me connecte sur le serveur, je passe super‐utilisteur (_root_) et je vais observer le rĂ©pertoire du compte super‐utilisteur `/root` : - initialement, le rĂ©pertoire `/root` est vide ; - on crĂ©e un fichier indiquant qu’on est avant le _snapshot_ (`before-snapshot`) ; - pour finir, on liste les sous‐volumes Btrfs : ```bash cd /root touch before-snapshot ls before-snapshot btrfs subvolume list / ID 257 gen 43 top level 5 path @ ``` Voyons comment est gĂ©rĂ© l’accĂšs au volume Btrfs sur notre machine : ```bash mount | grep btrfs /dev/sda5 on / type btrfs (rw,relatime,space_cache,subvolid=257,subvol=/@) /dev/sda7 on /home type btrfs (rw,relatime,space_cache,subvolid=257,subvol=/@home) ``` - on voit que la partition racine possĂšde le _subvolid_ 257 et un nom de volume `/@` ; - la partition `/home` est montĂ©e dans une seconde partition indĂ©pendante ; habituellement, si l’on ne prĂ©cise rien, l’installateur Debian créé un sous‐volume du mĂȘme nom rattachĂ© au volume principal. ```bash cat /etc/fstab ... UUID=c4eedff5-784a-4cda-9da1-dd192befc889 / btrfs defaults,subvol=@ 0 1 ... ``` - ici, nous avons la racine rattachĂ©e au volume par dĂ©faut (`/@`) ; pas de spĂ©cification de volume ID ; - le reste importe peu, si ce n’est que la partition `/boot` est indĂ©pendante. Nous allons donc crĂ©er un instantanĂ© de la partition racine que l’on va placer dans le rĂ©pertoire `/.snapshot` : ```bash mkdir /.snapshots btrfs subvol snapshot / /.snapshots/01 Create a snapshot of '/' in '/.snapshots/01' ``` On vĂ©rifie que nous avons maintenant un volume principal et un sous‐volume (`ID 261`, chemin d’accĂšs `/.snapshots/01`). Cet instantanĂ© est en lecture‐écriture ; il faudrait utiliser l’option `-r` pour le passer en mode lecture seule : ```bash btrfs subvol list / ID 257 gen 85 top level 5 path @ ID 261 gen 85 top level 257 path .snapshots/01 ``` VĂ©rifions qu’on a bien la prĂ©sence des fichiers « signature » dans chaque rĂ©pertoire `/root` : ```bash touch /root/after-snapshot ls -al /root/*snap* /.snapshots/01/root/*snap* -rw-r--r-- 1 root root 0 dĂ©c. 29 13:17 /root/after-snapshot -rw-r--r-- 1 root root 0 dĂ©c. 28 11:58 /root/before-snapshot -rw-r--r-- 1 root root 0 dĂ©c. 28 11:58 /.snapshots/01/root/before-snapshot ``` Changement du volume par dĂ©faut ------------------------------- Afin de redĂ©marrer la machine sur l’instantanĂ© (Ă©tat prĂ©cĂ©dent), on va changer le volume par dĂ©faut et redĂ©marrer la machine : ```bash btrfs subvol get-default / ID 5 (FS_TREE) btrfs subvolume list / ID 257 gen 86 top level 5 path @ ID 261 gen 85 top level 257 path .snapshots/01 btrfs subvolume set-default 261 / btrfs subvol get-default / ID 261 gen 85 top level 257 path .snapshots/01 ``` On relance la machine et on observe ce qu’il s’est passĂ© : ```bash cd /root ls -al /root/*snap* /.snapshots/01/root/*snap* -rw-r--r-- 1 root root 0 dĂ©c. 29 13:17 /root/after-snapshot -rw-r--r-- 1 root root 0 dĂ©c. 28 11:58 /root/before-snapshot -rw-r--r-- 1 root root 0 dĂ©c. 28 11:58 /.snapshots/01/root/before-snapshot mount | grep btrfs /dev/sda5 on / type btrfs (rw,relatime,space_cache,subvolid=257,subvol=/@) /dev/sda7 on /home type btrfs (rw,relatime,space_cache,subvolid=257,subvol=/@home) ``` Malheureusement, on peut constater que la machine n’a pas redĂ©marrĂ© sur le bon instantanĂ© (Ubuntu seulement). Le _volume ID_ de l’instantanĂ© devrait ĂȘtre **261**. Cas particulier d’Ubuntu ======================== Quand on installe la racine d’Ubuntu sur une partition Btrfs, l’installateur crĂ©e automatiquement et de maniĂšre transparente un sous‐volume `@` et dĂ©marre sur `/@/`. Quant Ă  la partition `/home`, elle est localisĂ©e dans le sous‐volume `/@home/`. Cela permet de gĂ©rer dans un seul volume Btrfs, l’ensemble des sous‐volumes nĂ©cessaires au fonctionnement d’un systĂšme GNU/Linux. Cela a pour corollaire qu’Ubuntu ne dĂ©marre pas sur le volume par dĂ©faut, mais bien sur le sous‐volume `/@/`. Par ailleurs, le volume racine de ce sous‐volume porte toujours l’ID 5 (`toplevel 5`) : ```bash root@ubuntu:/# btrfs sub list / ID 257 gen 132 top level 5 path @ ID 261 gen 139 top level 257 path @/.snapshots/01 ``` Pour contrĂŽler le sous‐volume sur lequel Ubuntu dĂ©marre, on pourra donc au choix supprimer le montage de la racine sur le volume `/@` et s’appuyer sur le volume par dĂ©faut, ou renommer le rĂ©pertoire `/@` en un autre sous‐volume et transfĂ©rer l’instantanĂ© `01` vers `/@` : ```bash # liste des sous‐volumes ; root@ubuntu:/# btrfs sub list / ID 257 gen 132 top level 5 path @ ID 261 gen 139 top level 257 path @/.snapshots/01 # je monte le volume racine (id=5) root@ubuntu:/# mount -o subvolid=5 /dev/sda5 /mnt root@ubuntu:/# ls -alt /mnt/ total 16 drwxr-xr-x 1 root root 244 dĂ©c. 29 13:08 .. drwxr-xr-x 1 root root 244 dĂ©c. 29 13:08 @ drwxr-xr-x 1 root root 2 dĂ©c. 27 12:50 . # le sous‐volume /@ est bien visible root@ubuntu:/# ls -alt /mnt/@/ total 32 drwxrwxrwt 1 root root 94 janv. 2 13:57 tmp drwx------ 1 root root 88 dĂ©c. 29 13:17 root drwxr-xr-x 1 root root 4 dĂ©c. 29 13:16 .snapshots drwxr-xr-x 1 root root 244 dĂ©c. 29 13:08 . drwxr-xr-x 1 root root 2894 dĂ©c. 28 20:32 etc ... ``` Permutation du sous‐volume `/@` avec `/@/.snapshots/01` : ```bash root@ubuntu:/mnt# mv @ @_old root@ubuntu:/mnt# mv @_old/.snapshots/01 @ root@ubuntu:/mnt# ls @ @_old root@ubuntu:/mnt# reboot Connection to 192.168.0.155 closed by remote host. Connection to 192.168.0.155 closed. ``` Concernant GRUB, je supprime la partie `rootflags` : ```bash cat /boot/grub/grub.cfg ... linux /vmlinuz-4.4.0-21-generic root=UUID=... ro rootflags=subvol=@ ``` RedĂ©marrage... ```bash # c’est bien le sous‐volume ID 261 qui est montĂ© par dĂ©faut root@ubuntu:/root# btrfs sub get-default / ID 261 gen 151 top level 5 path @ # liste des sous‐volumes (les chemins d’accĂšs ont changĂ©) root@ubuntu:/root# btrfs sub list / ID 257 gen 144 top level 5 path @_old ID 261 gen 149 top level 5 path @ # comment est montĂ©e la partition racine root@ubuntu:/root# mount | grep btrfs /dev/sda5 on / type btrfs (rw,relatime,space_cache,subvolid=261,subvol=/@) /dev/sda7 on /home type btrfs (rw,relatime,space_cache,subvolid=257,subvol=/@home) root@ubuntu:/root# btrfs sub list / ID 257 gen 144 top level 5 path @_old ID 261 gen 149 top level 5 path @ ``` Utilisation de YUM et DNF ========================= Les gestionnaires de paquets YUM et DNF sont prĂ©sents dans Fedora et dĂ©rivĂ©es (CentOS, RHEL...). À terme, DNF vise Ă  supplanter YUM. Dans le cas d’espĂšce, YUM possĂšde un greffon nommĂ© _[yum-fs-snapshot](http://man7.org/linux/man-pages/man1/yum-fs-snapshot.1.html)_ qui, lorsqu’activĂ©, prend automatiquement une image du systĂšme de fichiers (SF) avant d’entamer toute transaction. Ainsi, Ă  la fin de cette derniĂšre, arriverait‐il qu’on souhaite restaurer le systĂšme de fichiers Ă  son Ă©tat antĂ©rieur qu’il suffira d’effectuer un _rollback_. Ce greffon a Ă©tĂ© portĂ© [sur DNF](https://dnf-plugins-extras.readthedocs.io/en/latest/snapper.html) et est mentionnĂ© dans les cas d’utilisation sur le [Wiki](https://btrfs.wiki.kernel.org/index.php/UseCases#Snapshots_and_subvolumes) de Btrfs. Travaux pratiques ----------------- Installation de _snapper_ et de son greffon dans DNF ; Btrfs est supposĂ© dĂ©jĂ  configurĂ© : ```bash dnf install snapper python3-dnf-plugins-extras-snapper ``` Configurer _snapper_ sur un (sous‐)volume indiquĂ©. Par dĂ©faut, la configuration est appelĂ©e « root » : ```bash snapper create-config / snapper list-configs snapper list ``` Modifier le systĂšme sans prendre d’instantanĂ© : ```bash dnf --disableplugin=dnf.plugin.snapper install ``` Modifier le systĂšme en prenant un instantanĂ©. Les diffĂ©rents instantanĂ©s sont numĂ©rotĂ©s et leurs numĂ©ros figurent dans les sorties de `snapper list` : ```bash dnf update snapper list ``` Supposons que la mise Ă  jour prĂ©cĂ©dente a entraĂźnĂ© la crĂ©ation de l’instantanĂ© n^(o) N. Pour revenir Ă  l’instantanĂ© n^(o) N-1 : ```bash snapper rollback systemctl reboot ``` À noter que DNF dispose de ses propres transactions qu’il ne faudrait pas confondre avec celles de _snapper_ et qui sont elles aussi dotĂ©es de mĂ©canismes de retour en arriĂšre : 1- historique de toutes les transactions ; la premiĂšre colonne indique leur numĂ©ro ; 2- annuler toutes les transactions accomplies **aprĂšs** la transaction n^(o) X. ```bash dnf history # 1- dnf history rollback # 2- ``` Conclusion =========== La mise en Ɠuvre d’instantanĂ©s sur la partition racine permet d’enregistrer une image disque d’un systĂšme GNU/Linux qui pourra ĂȘtre rĂ©utilisĂ©e en cas d’incident suite Ă  une mise Ă  jour du systĂšme. Btrfs est un systĂšme de fichiers dont la mise en Ɠuvre est simple. Il permet de crĂ©er des instantanĂ©s trĂšs facilement. Il est possible sur certaines distributions GNU/Linux d’adjoindre un greffon au gestionnaire de paquets, ce qui facile la mise en Ɠuvre des instantanĂ©s et des retours en arriĂšre (Fedora, Arch Linux). Pour les autres distributions (Debian, Ubuntu), il faudra passer par une mise en Ɠuvre manuelle en attendant que les communautĂ©s prennent en charge ces fonctionnalitĂ©s. On peut lister ici les outils complĂ©mentaires : - snapper ; - NixOS (dĂ©pĂȘche en cours de rĂ©daction) ; - DNF + greffon ; - [apt-btrfs-snapshot](https://launchpad.net/apt-btrfs-snapshot) ; - [grub-btrfs](https://github.com/Antynea/grub-btrfs) : permet d’ajouter aux menus GRUB, les sous‐volumes Btrfs prĂ©sents Ă  la racine.

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /