Outils utilisés : lvm2 / CentOS 7
Introduction
Linux Volume Manager (LVM) est un outil installé et configuré par défaut à l’installation de nombreuses distributions, dont CentOS. Il est cependant nécessaire de faire une modification sur le mode de partitionnement initial de la distribution pour profiter pleinement de la fonctionnalité de prise d’instantané (ou snapshot) fournie par cet outil.
Étape 1 : Préparer le terrain
Par défaut, CentOS 7 s’installe et configure /boot sur une partition xfs séparée. Cela peut avoir certains avantages, mais pas dans notre cas. Pour remédier à cela, nous allons avoir besoin d’intégrer le contenu de cette partition dans la partition root. Cela peut se faire ainsi (sous réserve que rsync soit installé sur votre machine) :
# rsync -avz /boot/ boot/
# umount /boot
# rsync -avz boot/ /boot/
# grub2-mkcong -o /boot/grub2/grub.cfg
Il faut ensuite commenter la ligne correspondant au montage de /boot dans le fichier /etc/fstab. Il suffit de mettre un # en début de ligne. Cela va donner une ligne comme celle-ci :
#UUID=27dbd38a-52c7-4207-a44a-3484327e9067 /boot xfs defaults 0 0
On peut redémarrer la machine pour s’assurer que la modification est bien fonctionnelle.
Étape 2 : Prendre son premier instantané
Listons les groupes de volumes disponibles et les volumes logiques pour avoir un aperçu de notre LVM.
# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 1 1 wz--n- 19.00g 9.00g
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos owi-aos--- 10.00g
Ici, il n’y a qu’un groupe de volumes, centos avec 9Go d’espace non alloué, et il y a un volume logique (j’ai désactivé le swap durant l’installation). Il est nécessaire d’avoir de l’espace libre dans le groupe de volumes pour pouvoir utiliser les instantanés LVM.
Créons notre premier instantané du volume logique root grâce à la commande lvcreate. Il portera le nom root-20170628 pour se souvenir facilement de la date à laquelle il a été effectué. Nous allons lui allouer 2Go sur les 9 disponibles.
# lvcreate -s -L 2G -n root-20170628 /dev/centos/root
Using default stripesize 64,00 KiB.
Logical volume "root-20170628" created.
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos owi-aos--- 10.00g
root-20170628 centos swi-a-s--- 2.00g root 0.00
La taille d’un snapshot représente la taille des modifications autorisées par rapport au volume logique d’origine. C’est cette dernière valeur qui est la plus difficile à déterminer. Il est d’autant plus important de bien choisir cette valeur qu’ un snapshot rempli à 100 % est corrompu et devient donc inutilisable. Dans le cas de mises à jour système, le différentiel entre le volume logique d’origine et l’instantané peut augmenter très vite si les mises à jour ne sont pas réalisées régulièrement.
Étape 3 :Modifier le volume logique d’origine
# curl -L -O https://download.fedoraproject.org/pub/fedora/linux/releases/25/Workstation/x86_64/iso/Fedora-Workstation-netinst-x86_64-25-1.3.iso
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 464M 100 464M 0 0 1653k 0 0:04:47 0:04:47 --:--:-- 1363k
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos owi-aos--- 10.00g
root-20170628 centos swi-a-s--- 2.00g root 20.38
Ici nous téléchargeons un fichier image de taille importante pour voir quel est l’effet sur le snapshot. Comme on peut le voir, l’instantané est indiqué comme rempli à 20 % après l’ajout du fichier. Ce qui est logique, on vient de rajouter 450 Mo (sur 2 Go autorisés), et donc cette quantité de données diffère donc du volume logique de base et remplie donc le snapshot.
On peut ensuite supprimer le volume instantané grâce à la commande lvremove.
# lvremove /dev/centos/root-20170628
Do you really want to remove active logical volume centos/root-20170628? [y/n]: y
Logical volume "root-20170628" successfully removed
Étape 4 : Installer un logiciel
Nous allons installer un logiciel sur notre système, grâce à l’outil de gestion de paquets yum. La première étape est de créer un volume logique de type snapshot comme au paragraphe 1, préalablement à l’installation.
# lvcreate -s -L 2G -n root-20170628 /dev/centos/root
# yum install httpd
[la sortie de l’installation ne nous intéresse pas]
# rpm -qa | grep httpd
httpd-tools-2.4.6-45.el7.centos.4.x86_64
httpd-2.4.6-45.el7.centos.4.x86_64
Étape 5 ... et revenir en arrière !
Nous cherchons maintenant à revenir à l’état du système avant l’installation. Pour cela, nous allons utiliser la commande lvconvert avec l’option --merge.
# lvconvert --merge /dev/centos/root-20170628
Can't merge until origin volume is closed.
Merging of snapshot centos/root-20170628 will occur on next activation of fedora/root.
Rien de grave concernant ce message, il indique simplement que le volume logique et son snapshot seront fusionnés (et donc retrouverons l’état dans lequel était le volume logique root à la création du snapshot) à la prochaine activation du volume logique. Pour finaliser l’opération, nous devons redémarrer le système. Il n’y a plus de traces de httpd sur le système de fichiers.
Étape 6 : Mettre à jour son système
Pour cela, il faut donc prendre un instantané avant la mise à jour, de façon automatique, en effet quoi de plus facile que d’oublier de taper une commande. On peut créer dans un premier temps, un alias comme celui-ci :
# alias update='lvcreate -s -L 2G -n root-update-$(date +%s) /dev/centos/root && yum update'
Cela marche sans problème, mais présente plusieurs problèmes que l’on va tâcher de régler ensuite. Le premier est que le snapshot est créé que l’on accepte ou non les mises à jour présentées. Ce qui peut faire rapidement croître leur nombre. Deuxièmement, on peut tout simplement oublier de passer par l’alias, bien sûr on ne s’en rendra compte que le jour où il y aura un problème.
Étape 7 : Utiliser le plugin yum pour automatiser la prise d’instantané
Il existe un plugin pour yum qui répond spécifiquement à notre besoin : yum-plugin-fs-snapshot. Une fois installé, /etc/yum/pluginconf.d/fs-snapshot.confpermet de le paramétrer.
Le fichier suivant prendra un instantané de la partition root dont la taille est 20 % de la partition root. Il est possible de spécifier la taille précise du snapshot avec l’option -L au lieu de -l.
[main]
enabled = 1
create_snapshots_in_post = 0
[lvm]
enabled = 1
# 'lvcreate_size_args' option must specify the snapshot LV size using -L or -l
lvcreate_size_args = -l 20%ORIGIN
Voici ce qu’on obtient à l’utilisation :
# yum install rsync
[...]
Total size: 360 k
Installed size: 732 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
fs-snapshot: snapshotting / (/dev/centos/root): root_yum_20170628230947
Installing : rsync-3.0.9-17.el7.x86_64 1/1
Verifying : rsync-3.0.9-17.el7.x86_64 1/1
Installed:
rsync.x86_64 0:3.0.9-17.el7
Complete!
Un snapshot est créé de façon automatique lorsqu’on installe ou met à jour avec yum.
Attention cependant lorsqu’on l’utilise en condition réelle on peut apercevoir la notification suivante :
fs-snapshot: WARNING: creating LVM snapshot of root LV. If a kernel is
being altered /boot may need to be manually restored
in the event that a system rollback proves necessary.
La manipulation permet de ne pas tenir compte de cet avertissement.
Il est important de réaliser que le retour en arrière fait perdre toutes les données qui ont été modifiées sur le volume depuis la mise à jour, c’est pourquoi il peut être intéressant de séparer ses partitions de données, comme /home ou /var pour qu’elles ne soient pas impactées lors de la fusion du volume root avec son instantané. Cela peut également amener quelques incohérences dans les logs par exemple.
Aller plus loin
Les instantanés ont tendance à s’accumuler rapidement au fur et à mesure des mises à jour. Il peut être intéressant d’avoir un script lancé par cron qui les supprime régulièrement, à vous de trouver la bonne fréquence.
Yum est peu à peu remplacé dans les distributions, Fedora par exemple est passée à dnf pour lequel il n’existe pas encore de plugin équivalent, sauf à utiliser des volumes lvm à allocation fine (thin provisionning) et le plugin Snapper.
Certains systèmes de fichiers permettent de faire la même chose, comme Btrfs par exemple, toujours avec le plugin Snapper.