Mettre à jour sereinement son système grâce à LVM

Spécialité(s)


Résumé
Qui n’a jamais eu de problèmes lors de la mise à jour de son système ? Qui n’a jamais espéré pouvoir annuler sa dernière mise à jour de façon relativement simple. Découvrez comment faire cela simplement sous CentOS 7 avec les instantanés LVM.

Body

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.




Article rédigé par

Abonnez-vous maintenant

et profitez de tous les contenus en illimité

Je découvre les offres

Déjà abonné ? Connectez-vous