Ressuscitez vos machines virtuelles défaillantes

Magazine
Marque
Linux Pratique
Numéro
132
Mois de parution
juillet 2022
Spécialité(s)


Résumé

Depuis Socrate, nous savons que tout ce qui est humain est faillible. Les machines virtuelles étant créées par des humains, elles sont faillibles. C’est donc bien de prévoir comment sauver les données quand la machine virtuelle défaille.


Body

Introduction

Les machines virtuelles sont de plus en plus utilisées. Mais celles-ci peuvent subir des dysfonctionnements. Les Plans de Continuité d’Activité (PCA) et les Plans de Reprises d’Activité (PRA) permettent de limiter l’impact de ces défaillances. Nous allons nous intéresser au cas où il faut récupérer le système de fichiers d’une machine virtuelle sans utiliser celle-ci.

Les deux cas d’usages classiques sont la perte de mot de passe et la récupération de données. Bien que ce ne devrait pas arriver, il est fréquent d’oublier le mot de passe administrateur. La machine peut continuer de fonctionner, mais les modifications seront impossibles. Si la machine virtuelle ne fonctionne plus, certaines données peuvent ne pas avoir été sauvegardées.

Accéder au système de fichiers sans le système d’exploitation est aussi utile pour une analyse post-mortem (forensic).

Nous voulons montrer comment récupérer les données d’une machine arrêtée. Le principe est le même que pour un ordinateur physique : sortir le disque dur, l’insérer dans un autre ordinateur et accéder au système de fichiers.

Nous allons commencer par présenter rapidement quelques aspects de la conception des disques durs. Ceci permet de mieux comprendre comment gérer un disque virtuel. Ensuite, nous allons présenter deux méthodes pour accéder aux données du disque. D’abord, en utilisant les commandes GNU/Linux, ensuite en utilisant les possibilités du logiciel de virtualisation.

1. Démystifions les disques durs

Au siècle dernier, les ordinateurs utilisaient des disques magnétiques pour enregistrer les données. Certains étaient souples, d’autres durs. Le disque dur de mon premier ordinateur professionnel permettait d’enregistrer 40 Mo de données. Pour écrire et lire des octets, il fallait mettre le disque en rotation, déplacer la tête au-dessus de la donnée, baisser la tête au plus près de la surface sans la toucher. Ensuite, quand la donnée passait sous la tête, il était possible de la lire. Pour des raisons mécaniques, il était aussi facile de lire tout un ensemble de données que de lire un seul octet.

Le disque était donc divisé en cylindres. Ces cylindres étaient divisés en secteurs entre lesquels des données de contrôle permettaient d’identifier le secteur. Les disques durs actuels sont toujours conçus sur la même architecture. Mais l’évolution a permis de créer des disques durs avec d’autres composants électroniques, comme de la mémoire flash, sans composant mobile. Et aussi sans une forme circulaire. L’appellation disque dur devient un abus de langage. Néanmoins, les interfaces entre ces nouveaux produits restent compatibles avec les disques durs. Il est donc possible de changer un disque par un SSD, le système ne fait pas vraiment de distinction entre les différents supports.

Le noyau Linux a donc deux façons de gérer les périphériques : le mode caractère, comme un clavier et le mode bloc, comme un disque.

Les matériels ayant une interface de type disque sont identifiés par le noyau dans l’arborescence /dev/disk :

=> ls /dev/disk/by-path
pci-0000:00:14.0-usb-0:4:1.0-scsi-0:0:0:0@
pci-0000:00:14.0-usb-0:4:1.0-scsi-0:0:0:0-part1@
pci-0000:00:17.0-ata-2@
pci-0000:00:17.0-ata-2.0@
pci-0000:01:00.0-nvme-1@
pci-0000:01:00.0-nvme-1-part1@
pci-0000:01:00.0-nvme-1-part2@
pci-0000:01:00.0-nvme-1-part3@

Nous voyons ici trois périphériques : une clef USB, un disque dur et un SSD. Le SSD est identifié par son interface NVM Express (NVMe : Non-Volatile Media). Les partitionnements des disques apparaissent aussi. Il est possible d’accéder aussi aux supports par un identifiant unique (UUID) ou par son nom historique (/dev/sdb).

Le noyau Linux va masquer la réalité physique et proposer une abstraction au système d’exploitation. Le système verra le disque dur comme un fichier composé d’une suite linéaire d’octets. Tout fichier peut alors être interprété comme un disque dur. Les logiciels de virtualisation vont utiliser cela pour simuler le disque dur (physique ?) d’une machine virtuelle.

L’usage classique de l’utilisation d’un disque consiste à ajouter une table de partition qui permet d’identifier les parties sur lesquelles vont être créés les systèmes de fichiers. Le partitionnement permet de séparer, par exemple, les données du système de celles des utilisateurs. Les premiers octets vont donc contenir l’adresse de début et de fin des différentes parties.

D’après Wikipédia, un disque formaté au format IBM définit quatre parties potentielles. La première est définie à partir de l’octet 446 du MBR [1]. La commande dd va nous permettre d’extraire ces informations. Sur un disque, nous extrayons 16 octets :

# dd if=/tmp/ptah.raw of=/tmp/partition bs=1 skip=446 count=16
16+0 enregistrements lus
16+0 enregistrements écrits
16 octets copiés, 0,000700379 s, 22,8 kB/s

Puis nous lisons les valeurs :

# od -x /tmp/partition
0000000 2080 0021 bf83 8778 0800 0000 0000 0060

La première partie est donc située au secteur 2048 (0x0000 0x0800) et contient 6291456 secteurs (0x0060 0x0000). Notons que nous avons une représentation petit-boutiste (little endian). Il peut paraître étonnant que la première partie ne commence pas au deuxième secteur, c’est principalement dû à des erreurs historiques. La convention en vigueur recommande d’aligner les partitions sur des frontières de 1Mo, soit 2 048 secteurs.

Donc, puisque Linux peut gérer tout et n’importe quoi comme si c’était un disque dur, nous allons utiliser cela pour nos disques de machines virtuelles.

2. La machine virtuelle sans la machine virtuelle

Les machines virtuelles c’est bien, c’est même très bien, surtout quand ça marche. Mais parfois, elles ne fonctionnent plus de manière satisfaisante. Un des écueils fréquents, c’est la perte du mot de passe administrateur. Certes, cela peut être considéré comme une faute professionnelle et cela ne devrait jamais arriver.

Cela peut être aussi causé par un dysfonctionnement de la machine virtuelle qui ne veut plus fonctionner. Encore une fois, si le Plan de Reprise d’Activité est correctement rédigé, ceci ne devrait pas être un problème.

Enfin, cela peut être réalisé juste parce qu’on peut le faire. Nous allons donc montrer comment utiliser le disque d’une machine virtuelle sans celle-ci.

Les logiciels de virtualisation définissent un format spécifique pour les disques virtuels. Ainsi, QEMU recommande le format qcow2 (Quick Copy On Write II). Ce format permet en particulier d’avoir un fichier dont la taille est différente sur le système hébergé et le système hébergeant. J’ai ainsi mis en place une machine avec quatre disques de 400To sur mon ordinateur portable. L’autre intérêt, c’est de faciliter la production de snapshots.

Pour récupérer le disque virtuel, il est soit possible d’utiliser un outil fourni par le logiciel de virtualisation, soit un logiciel GNU/Linux. Ces derniers logiciels ne peuvent pas gérer les formats spécifiques des machines virtuelles. Il faut donc commencer par convertir le format pour revenir à un format plus brut (raw).

2.1 Retour sur les outils classiques

Euh… pas sûr que ce soit si classique que cela. Il faut donc commencer par revenir dans un format utilisable par d’autres outils. Les bons logiciels de virtualisation fournissent un outil de conversion permettant de changer le format du disque. Les très bons logiciels permettent la conversion vers un format brut. Nous allons donc utiliser QEMU. La commande qemu-img [2] gère la conversion entre plusieurs formats, y compris des formats de logiciels privateurs.

qemu-img convert -f qcow2 -O raw ptah-bck.qc2 /tmp/ptah.raw

Cette commande convertit une image au format qcow2 vers le format raw. L’image d’origine n’est pas altérée et une conversion inverse peut être utile.

Le fichier peut alors être géré par les outils du système GNU/Linux. Par exemple fdisk :

# fdisk /tmp/ptah.raw
 
Bienvenue dans fdisk (util-linux 2.33.1).
Les modifications resteront en mémoire jusqu'à écriture.
Soyez prudent avant d'utiliser la commande d'écriture.
 
 
Commande (m pour l'aide) : p
Disque /tmp/ptah.raw : 12 GiB, 12884901888 octets, 25165824 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x9c8abe79
 
Périphérique   Amorçage   Début      Fin Secteurs Taille Id  Type
/tmp/ptah.raw1 *           2048  6293503  6291456    3G  83  Linux
/tmp/ptah.raw2          6295550 10483711  4188162    2G  5   étendue
/tmp/ptah.raw5          6295552 10483711  4188160    2G  82  partition d'échange

Ce disque contient trois parties. La première commence au bloc 2048. C’est ce que nous avions lu dans le MBR à la section précédente. Pour extraire la partie, il suffit de demander à dd.

# dd if=/tmp/ptah.raw of=/tmp/partition1 bs=512 skip=2048 count=6291456
6291456+0 enregistrements lus
6291456+0 enregistrements écrits
3221225472 octets (3,2 GB, 3,0 GiB) copiés, 11,5184 s, 280 MB/s

La commande mount peut alors réaliser le montage :

# mount /tmp/partition1 /mnt
# ls /mnt
bin   home            lib32       media  root  sys vmlinuz
boot  initrd.img      lib64       mnt    run   tmp vmlinuz.old
dev   initrd.img.old  libx32      opt    sbin  usr
etc   lib             lost+found  proc   srv   var

Ceci permet de comprendre comment est structuré un disque dur. Mais ce n’est pas exactement pratique ou facile. Pour commencer à simplifier, nous pouvons indiquer à la commande mount d’ignorer les premiers octets. Il faut lui parler en octets, pas en secteurs. Nous devons donc calculer le décalage :

2048 * 512 = 1048576

Nous allons fournir cette information à la commande mount :

# mount -o offset=1048576 /tmp/ptah.raw /mnt/
# ls /mnt
bin   home            lib32       media  root  sys vmlinuz
boot  initrd.img      lib64       mnt    run   tmp vmlinuz.old
dev   initrd.img.old  libx32      opt    sbin  usr
etc   lib             lost+found  proc   srv   var

Pour ceux qui ne sont pas bons en calcul mental, il est possible d’utiliser une commande qui fait les calculs et prépare le montage. En plus, elle gère d’un seul coup toutes les partitions.

# kpartx -a /tmp/ptah.raw
# ls /dev/mapper
control loop0p1 loop0p2 loop0p5

Cette machine virtuelle utilise un système GNU/Linux sur la première partition primaire. La seconde partition primaire héberge une partition d’échange. Le périphérique de bouclage loop0 présente donc trois parties. Pour monter une de ces parties, il suffit de la monter :

# mount /dev/mapper/loop0p1 /mnt
# ls /mnt
bin   etc         initrd.img.old lost+found opt   run   sys var
...

Nous voyons donc que le noyau peut gérer les images de disques. Nous allons voir maintenant un exemple de gestion du disque par une application issue du logiciel de virtualisation.

2.2 Le fichier transmis par QEMU

Les logiciels de virtualisation permettent aussi d’accéder au système de fichiers directement. QEMU propose d’utiliser NBD. Le protocole Network Block Device permet de fournir l’accès à un disque physiquement présent dans un ordinateur à un autre ordinateur. Il permet donc de fournir aussi un accès à un disque dur virtuel.

Il faut commencer par ajouter le support nbd dans le noyau :

# modprobe nbd

Puis demander à QEMU d’attacher le disque virtuel au périphérique nbd :

# qemu-nbd -c /dev/nbd0 -f qcow2 ptah.qc2

En fonction du disque dur, ses partitions apparaissent aussi comme des extensions de nbd0 :

# ls /dev/nbd*
/dev/nbd0   /dev/nbd0p1 /dev/nbd0p2 /dev/nbd0p5

il est alors possible de monter un système de fichiers :

# mount /dev/nbd0p1 /mnt
# ls /mnt
bin   etc         initrd.img.old lost+found opt   run   sys
...

Cette méthode a l’avantage de ne pas nécessiter de copie de l’image virtuelle. Néanmoins, elle est dépendante du logiciel de virtualisation utilisé.

Conclusion

Nous avons présenté deux méthodes pour accéder aux systèmes de fichiers sans utiliser leur système d’exploitation. Une méthode n’utilise pas du tout le logiciel de virtualisation. Cependant, il faut pouvoir traduire le format utilisé par le disque virtuel dans un format plus simple. Il faut donc alors utiliser un outil complémentaire d’un logiciel de virtualisation. Si le problème est l’expiration de la licence d’un logiciel privateur, alors QEMU peut probablement assurer cette traduction.

Une autre application de ces méthodes, c’est la modification des images des firmwares, par exemple pour un Raspberry Pi [3]. C’est ce que j’utilise pour ajouter le support SSH et les certificats sur mes images. Dans ce cas, les commandes issues des machines virtuelles sont inutiles.

Références

[1] Page Wikipédia sur le MBR : https://fr.wikipedia.org/wiki/Master_boot_record

[2] Fleur Brosseau, « Virtualisation avec KVM/Qemu », Linux Pratique n°61 :
https://connect.ed-diamond.com/Linux-Pratique/lp-061/virtualisation-avec-kvm-qemu

[3] Laurent Delmas, « Caméra 3D et nuage de points », GNU/Linux Magazine n°202 :
https://connect.ed-diamond.com/GNU-Linux-Magazine/glmf-202/camera-3d-et-nuage-de-points



Article rédigé par

Par le(s) même(s) auteur(s)

Remettez de l'ordre dans votre WiFi avec un peu de programmation

Magazine
Marque
Linux Pratique
Numéro
134
Mois de parution
novembre 2022
Spécialité(s)
Résumé

Le WiFi, c’est pratique ! Enfin… quand il fonctionne bien. Parfois, cela ne marche plus, il suffit de cliquer sur le clickodrome jusqu’au retour de la connexion du bonheur. Mais parfois le système intelligent, il ne veut pas faire ce que nous, nous voudrions. Nous allons voir comment, avec les commandes systèmes et la programmation, l’aider un peu à accepter à être moins intelligent que nous et réaliser nos souhaits.

Interagissez simplement avec votre téléphone : utilisez adb

Magazine
Marque
Linux Pratique
HS n°
Numéro
54
Mois de parution
juin 2022
Spécialité(s)
Résumé

L’utilisation de smartphones est simple et conviviale. D’après le dictionnaire Webster de 1913 (paquet dict-gcide) « smart » peut être traduit par irritant, démangeant, piquant. « Simple » signifie qu’il n’y a pas de documentation. « Convivial » indique que vous n’avez le droit de faire que ce que le vendeur a prévu. Pour reprendre le contrôle et contraindre cet ordiphone à faire ce que vous souhaitez, vous pouvez utiliser adb.

Les derniers articles Premiums

Les derniers articles Premium

Stubby : protection de votre vie privée via le chiffrement des requêtes DNS

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Depuis les révélations d’Edward Snowden sur l’espionnage de masse des communications sur Internet par la NSA, un effort massif a été fait pour protéger la vie en ligne des internautes. Cet effort s’est principalement concentré sur les outils de communication avec la généralisation de l’usage du chiffrement sur le web (désormais, plus de 90 % des échanges se font en HTTPS) et l’adoption en masse des messageries utilisant des protocoles de chiffrement de bout en bout. Cependant, toutes ces communications, bien que chiffrées, utilisent un protocole qui, lui, n’est pas chiffré par défaut, loin de là : le DNS. Voyons ensemble quels sont les risques que cela induit pour les internautes et comment nous pouvons améliorer la situation.

Surveillez la consommation énergétique de votre code

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Être en mesure de surveiller la consommation énergétique de nos applications est une idée attrayante, qui n'est que trop souvent mise à la marge aujourd'hui. C'est d'ailleurs paradoxal, quand on pense que de plus en plus de voitures permettent de connaître la consommation instantanée et la consommation moyenne du véhicule, mais que nos chers ordinateurs, fleurons de la technologie, ne le permettent pas pour nos applications... Mais c'est aussi une tendance qui s'affirme petit à petit et à laquelle à terme, il devrait être difficile d'échapper. Car même si ce n'est qu'un effet de bord, elle nous amène à créer des programmes plus efficaces, qui sont également moins chers à exécuter.

Donnez une autre dimension à vos logs avec Vector

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Avoir des informations précises et détaillées sur ce qu’il se passe dans une infrastructure, et sur les applications qu'elle héberge est un enjeu critique pour votre business. Cependant, ça demande du temps, temps qu'on préfère parfois se réserver pour d'autres tâches jugées plus prioritaires. Mais qu'un système plante, qu'une application perde les pédales ou qu'une faille de sécurité soit découverte et c'est la panique à bord ! Alors je vous le demande, qui voudrait rester aveugle quand l'observabilité a tout à vous offrir ?

Les listes de lecture

8 article(s) - ajoutée le 01/07/2020
Découvrez notre sélection d'articles pour faire vos premiers pas avec les conteneurs, apprendre à les configurer et les utiliser au quotidien.
11 article(s) - ajoutée le 02/07/2020
Si vous recherchez quels sont les outils du DevOps et comment les utiliser, cette liste est faite pour vous.
8 article(s) - ajoutée le 02/07/2020
Il est essentiel d'effectuer des sauvegardes régulières de son travail pour éviter de perdre toutes ses données bêtement. De nombreux outils sont disponibles pour nous assister dans cette tâche.
Voir les 57 listes de lecture

Abonnez-vous maintenant

et profitez de tous les contenus en illimité

Je découvre les offres

Déjà abonné ? Connectez-vous