Les libguestfs est une bibliothèque C et une collection d'outils sur cette bibliothèque pour créer, afficher, accéder et modifier des images de disque de machine virtuelle sous Linux. Vous pouvez regarder à l'intérieur des images de disque, modifier les fichiers qu'elles contiennent, les créer à partir de zéro, les redimensionner et bien plus encore. Il ne nécessite pas libvirt ou KVM et ne nécessite pas non plus de privilèges root. Red Hat sponsorise le développement de libguestfs. Il prend en charge de nombreuses distributions Linux et variantes Unix comme Mac OS.
Libguestfs fonctionne avec presque tous les systèmes de fichiers Linux (ext2/3/4, XFS, btrfs, etc.), les systèmes de fichiers Windows (vfat et ntfs), les systèmes de fichiers Mac OS et BSD, les volumes LVM2, les partitions de disque MBR et GPT, les disques RAW , QCOW2, VirtualBox VDI, VMWare VMDK et Hyper-V VHD/VHDX. Il peut même accéder aux fichiers locaux et aux périphériques locaux tels que les ISO de CD et de DVD, les cartes SD ou à distance via FTP, HTTP, SSH, iSCSI, NBD, GlusterFS, Ceph, Sheepdog et bien plus encore.
Fonctionnalités de Libguestfs
En utilisant les outils libguest, nous pouvons effectuer un grand nombre de tâches répertoriées ci-dessous :
- Créer des machines virtuelles invitées,
- Cloner des machines virtuelles,
- Créer des VM,
- Personnaliser les VM,
- Scripter les modifications apportées aux VM,
- Inspecter les images de MV,
- Afficher et modifier des fichiers à l'intérieur des machines invitées
- Copier des fichiers et des répertoires vers et depuis des machines virtuelles,
- Afficher des informations sur les systèmes de fichiers, les périphériques, LVM,
- Archive, importe et télécharge des fichiers,
- Surveiller les statistiques de disque utilisé/libre,
- Formater les disques virtuels,
- Redimensionner les disques virtuels,
- Effectuer des sauvegardes,
- Monter et démonter le système de fichiers invité dans le système hôte,
- P2V (convertir une machine physique pour une exécution virtualisée sur KVM, OpenStack, oVirt, Red Hat Virtualization),
- V2V (convertir une machine invitée à partir d'un hyperviseur étranger pour qu'elle s'exécute sur KVM),
- Afficher les fichiers journaux,
- Fusionner les modifications dans le registre Windows dans les invités Windows,
- et bien plus encore.
Vous pouvez effectuer toutes ces tâches via un shell scriptable appelé guestfish , ou un shell de secours interactif virt-rescue .
Installer libguestfs sur Linux
Exécutez la commande suivante pour installer libguestfs sur Debian, Ubuntu :
$ sudo apt install libguestfs-tools
Sur CentOS, RHEL :
$ sudo dnf install libguestfs-tools
Une fois installé, vérifiez la version de guestfish à l'aide de la commande :
$ guestfish --version guestfish 1.40.2
Accéder et modifier des images de disque de machine virtuelle avec Libguestfs
Assurez-vous que les machines invitées sont hors tension. Vous ne devez en aucun cas modifier les images en direct. Cela peut entraîner une corruption permanente du disque et une perte de données. Sauvegardez toujours les images de disque avant d'y apporter des modifications.
1. Coquille de poisson invité
Guestfish, abréviation de shell de système de fichiers invité, est un shell interactif permettant de modifier les systèmes de fichiers et les images de disque des machines virtuelles.
1.1. Accéder aux images de disque existantes et monter manuellement les systèmes de fichiers invités
Tout d'abord, chargeons une image disque existante à inspecter.
Exécutez la commande suivante depuis pour entrer dans le shell interactif guestfish :
$ guestfish
Exemple de résultat :
Welcome to guestfish, the guest filesystem shell for editing virtual machine filesystems and disk images. Type: ‘help’ for help on commands ‘man’ to read the manual ‘quit’ to quit the shell ><fs>
Ici, >
..puis ajoutez les images disque à l'aide de la commande :
><fs> add ~/CentOS_8_Server.img
Ensuite, exécutez la commande suivante pour lancer la bibliothèque et attacher (lancer) l'image disque :
><fs> run
Cela prendra quelques secondes dans un premier temps. Les démarrages suivants se termineront beaucoup plus rapidement.
Vous devez maintenant répertorier et monter manuellement les systèmes de fichiers invités.
Pour afficher la liste des systèmes de fichiers du disque, exécutez cette commande à partir de l'invite guestfish :
><fs> list-filesystems
Exemple de résultat :
/dev/sda1: ext4 /dev/cl/root: xfs /dev/cl/swap: swap
Monter un système de fichiers :
><fs> mount /dev/cl/root /
Afficher les points de montage :
><fs> mountpoints /dev/cl/root: /
De même, montez les autres systèmes de fichiers.
1.2. Accéder aux images de disque existantes et monter automatiquement les systèmes de fichiers invités
Au lieu de lister et de monter manuellement les systèmes de fichiers invités, vous pouvez laisser le guestfish inspecter automatiquement les images et monter les systèmes de fichiers en utilisant -i drapeau comme ci-dessous.
$ guestfish -a CentOS_8_Server.img -i
Ici,
- -a (--add) détectera automatiquement le format de l'image disque. Pour remplacer cela et spécifier un format particulier, utilisez le --format option.
- -i (--inspector) - Inspecte les disques et monte les systèmes de fichiers.
- CentOS_8_Server.img - nom de l'image disque. J'ai cette image dans mon répertoire actuel.
Cette commande chargera l'image donnée, montera les systèmes de fichiers invités et vous amènera à l'intérieur du shell guestfish.
Welcome to guestfish, the guest filesystem shell for editing virtual machine filesystems and disk images. Type: ‘help’ for help on commands ‘man’ to read the manual ‘quit’ to quit the shell Operating system: CentOS Linux release 8.2.2004 (Core) /dev/cl/root mounted on / /dev/sda1 mounted on /boot ><fs>
Si vous avez utilisé le "-i" paramètre, vous n'avez pas besoin de lister et de monter manuellement les systèmes de fichiers invités. Les systèmes de fichiers seront automatiquement montés. De plus, vous n'avez pas besoin d'initier la bibliothèque et de joindre l'image disque par vous-même. Guestfish s'en chargera lui-même.
1.3. Accéder aux machines virtuelles plutôt qu'aux images de disque
Guestfish a une option pour accéder aux machines virtuelles (domaines) au lieu des images de disque.
Tout d'abord, obtenez le nom des machines virtuelles à l'aide de la commande :
$ virsh list --all Id Name State -------------------------------- - centos8-uefi shut off - nginx_centos8 shut off
Pour accéder à la VM nommée "centos8-uefi", utilisez l'option -d ou --domain comme ci-dessous.
$ guestfish -d centos8-uefi -i
1.4. Affichage et modification du contenu des images de disque
Guestfish prend en charge des centaines de commandes pour afficher et modifier les images de disque à votre guise. Vous serez submergé si vous examinez toute la page de manuel. Il est donc préférable de savoir d'abord comment obtenir de l'aide.
Répertorier toutes les commandes
Si vous ne savez pas par où commencer, affichez simplement la section d'aide à l'aide de la commande :
><fs> help
Pour répertorier toutes les commandes disponibles avec une brève description, exécutez :
><fs> help -l
Obtenir de l'aide sur une commande spécifique
Pour obtenir de l'aide sur n'importe quelle commande, par exemple mkdir, exécutez :
<fs> help mkdir
Voyons maintenant quelques exemples.
Répertorier les appareils bloqués
Pour répertorier tous les périphériques de bloc dans l'image, exécutez :
><fs> list-devices /dev/sda
Répertorier les partitions
Pour répertorier toutes les partitions détectées sur tous les périphériques de bloc, exécutez :
><fs> list-partitions /dev/sda1 /dev/sda2
Répertorier le contenu du répertoire
Pour lister les fichiers d'un répertoire donné, exécutez :
><fs> ls /root .bash_history .bash_logout .bash_profile .bashrc .cshrc .tcshrc
Afficher le contenu du fichier
Pour afficher le contenu d'un fichier, exécutez :
><fs> cat /etc/fstab # # /etc/fstab # Created by anaconda on Thu Feb 6 06:43:28 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 UUID=5e675dd6-7f64-46cd-8535-3617f3cf870b /boot ext4 defaults 1 2 /dev/mapper/cl-swap swap swap defaults 0 0
Créer des répertoires
La commande suivante créera un répertoire nommé "ostechnix" sous le répertoire /root dans le système invité.
><fs> mkdir /root/ostechnix
Créer des fichiers vides
Pour créer un fichier vide dans la machine invitée, faites :
><fs> touch /root/ostechnix/file.txt
Vérifiez si le fichier a été créé :
><fs> ls /root/ostechnix/ file.txt
Créer des fichiers avec du contenu
Pour créer un fichier avec du contenu, utilisez write commande :
><fs> write /root/ostechnix/file2.txt https://ostechnix.com
La commande ci-dessus créera file2.txt dans le répertoire /root/ostechnix/ et y écrira "https://ostechnix.com".
Vous pouvez le vérifier en utilisant la commande "cat":
><fs> cat /root/ostechnix/file2.txt https://ostechnix.com
Ajouter du contenu aux fichiers existants
Pour ajouter un nouveau contenu à la fin d'un fichier déjà créé, utilisez la commande "write-append" :
<fs> write-append /root/ostechnix/file2.txt /about
La commande ci-dessus ajoutera le mot "/about" à la fin du contenu du fichier1.txt.
Vérifiez si la ligne est ajoutée, utilisez la commande cat :
><fs> cat /root/ostechnix/file2.txt https:/ostechnix.com/about
Modifier des fichiers
Pour modifier un fichier sur la machine invitée, utilisez la commande "edit" :
><fs> edit /root/ostechnix/file.txt
Le fichier donné s'ouvrira dans l'éditeur par défaut.
Supprimer des fichiers et des répertoires
Pour supprimer un fichier de la machine invitée :
><fs> rm /root/ostechnix/file2.txt ><fs> rm /root/ostechnix/file.txt
Pour supprimer un répertoire, utilisez la commande "rmdir" :
><fs> rmdir /root/ostechnix/
Copier les fichiers ou répertoires locaux dans l'image disque
La commande "copy-in" copie les fichiers ou répertoires locaux de manière récursive dans l'image disque.
La commande suivante copiera le fichier ostechnix.txt du système local vers /root/ostechnix/ dans l'image disque.
<fs> copy-in ostechnix.txt /root/ostechnix/
Vérifiez-le en utilisant ls commande :
<fs> ls /root/ostechnix/ file.txt ostechnix.txt
Copier des fichiers ou des répertoires de l'image disque vers le système hôte
De même, nous pouvons copier les fichiers ou répertoires d'une image disque vers le système hôte local à l'aide de la commande "copy-out" comme ci-dessous.
<fs> copy-out /root/ostechnix/ /home/sk/Downloads/
Dans l'exemple ci-dessus, je copie le répertoire /root/ostechnix/ dans le répertoire Téléchargements du système hôte.
Télécharger des fichiers sur le système hôte
C'est la même chose que la commande de copie.
Guestfish vous permet de télécharger et de télécharger du contenu d'une machine invitée à une machine hôte et vice versa.
La syntaxe générale pour télécharger des fichiers :
download <guest_file_location> <host_file_location>
La commande suivante téléchargera le fichier "/etc/fstab" de la machine invitée vers le répertoire /home/sk/Downloads/ du système hôte KVM.
<fs> download /etc/fstab /home/sk/Downloads/fstab
Télécharger des fichiers du système hôte vers le système invité
C'est la même chose que la commande de copie.
Pour télécharger un fichier de votre système hôte vers la machine invitée, exécutez :
><fs> upload /home/sk/Downloads/fstab /etc/fstab
Ici, je télécharge /home/sk/Downloads/fstab fichier de mon système local vers /etc/fstab dans la machine invitée.
Afficher la page de manuel de guestfish
Pour afficher les pages de manuel de guestfish :
><fs> man
Quitter le poisson invité
Pour quitter le shell guestfish, exécutez :
><fs> exit
Ce que nous avons vu jusqu'à présent, c'est que nous avons accédé, monté, inspecté et modifié des images de disque existantes. Guestfish peut également vous aider à créer instantanément de nouvelles images de disque.
1.5. Création de nouvelles images de disque
Les commandes suivantes doivent être exécutées en dehors du shell guestfish. En d'autres termes, ils doivent être exécutés dans votre terminal hôte.
Rappelez-vous que nous avons ajouté les images existantes en utilisant le paramètre -a ? Oui. Pour créer une nouvelle image disque, nous allons -N (--nouveau) paramètre.
Pour créer une nouvelle image disque et la lancer automatiquement, exécutez la commande suivante depuis le terminal hôte (pas dans l'invite guestfish) :
$ guestfish -N fs
Cette commande créera un nouveau disque nommé "test1.img" dans le répertoire courant et vous amène à l'intérieur de l'invite guestfish. Ce disque contiendra une seule partition, avec un système de fichiers vide. Par défaut, la taille du disque sera de 1 Go . Si vous exécutez la même commande la prochaine fois, elle créera un nouveau disque nommé "test2.img" avec une taille de 1G et ainsi de suite.
Au lieu de créer un disque 1G de taille fixe, il est également possible de créer une image disque de taille personnalisée.
Pour créer un disque vierge de 500 Mo , exécutez :
$ guestfish -N disk:500M
Vous pouvez également créer une image disque formatée avec un système de fichiers spécifique. Par exemple, la commande suivante créera un disque 1G avec un ext4 -partition formatée, appelée test1.img dans le répertoire courant :
$ guestfish -N fs:ext4
Créez un disque de 500 Mo avec un VFAT -partition formatée et montez-la :
$ guestfish -N fs:vfat:500M -m /dev/sda1
Créez un disque vierge de 500 Mo appelé blankdisk.img (au lieu du nom par défaut test1.img) :
$ guestfish -N blankdisk.img=disk:500M
1.6. Ajout d'images de disque distant
En plus des images de disque local, nous pouvons également ajouter des disques situés sur un serveur distant SSH, FTP, HTTP ou TFTP.
Ajoutez un disque situé sur un serveur SSH distant :
$ guestfish -a ssh://[email protected]/disk.img
Remplacez le nom d'utilisateur et l'adresse IP dans la commande ci-dessus par les vôtres.
Ajoutez un disque situé sur un serveur FTP distant :
$ guestfish -a ftp://[email protected]:port/disk.img
$ guestfish -a ftps://[email protected]:port/disk.img
Ajoutez un disque situé sur un serveur HTTP distant :
$ guestfish -a http://[email protected]:port/disk.img
$ guestfish -a https://[email protected]:port/disk.img
Ajoutez un disque situé sur un serveur TFTP distant :
$ guestfish -a tftp://[email protected]:port/disk.img
2. Accéder, afficher et modifier des images de disque sans entrer dans le shell guestfish
Libguestfs fournit de nombreuses autres commandes équivalentes pour accéder, afficher et modifier les images disque, sans entrer dans le shell guestfish.
2.1. montage invité
La commande Guestmount est utilisée pour monter un système de fichiers invité sur l'hôte à l'aide de FUSE et de libguestfs.
La commande suivante montera le centos8-uefi système complet de la machine invitée dans ~/guestvm/ dans le système hôte.
$ mkdir ~/guestvm/
$ sudo guestmount -d centos8-uefi -i ~/guestvm/
Vérifiez le contenu du répertoire de montage :
$ sudo ls -l ~/guestvm
Exemple de résultat :
total 16 lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin dr-xr-xr-x. 6 root root 4096 Jul 18 15:46 boot drwxr-xr-x. 2 root root 6 Jul 18 15:23 dev drwxr-xr-x. 78 root root 8192 Jul 25 17:54 etc drwxr-xr-x. 2 root root 6 May 11 2019 home lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64 drwxr-xr-x. 2 root root 6 May 11 2019 media drwxr-xr-x. 2 root root 6 May 11 2019 mnt drwxr-xr-x. 2 root root 6 May 11 2019 opt drwxr-xr-x. 2 root root 6 Jul 18 15:23 proc dr-xr-x---. 2 root root 135 Jul 18 15:46 root drwxr-xr-x. 2 root root 6 Jul 18 15:23 run lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 May 11 2019 srv drwxr-xr-x. 2 root root 6 Jul 18 15:23 sys drwxrwxrwt. 7 root root 119 Jul 25 18:44 tmp drwxr-xr-x. 12 root root 144 Jul 18 15:24 usr drwxr-xr-x. 20 root root 278 Jul 18 15:45 var
Pour le démonter, exécutez :
$ sudo umount ~/guestvm
Pour plus de détails, consultez les pages de manuel.
$ man guestmount
2.2. virt-chat
La commande virt-cat est utilisée pour afficher le contenu d'un fichier stocké dans une image disque ou une machine virtuelle.
$ sudo virt-cat -a CentOS_8_Server.img /etc/fstab
Ou,
$ sudo virt-cat -d centos8-uefi /etc/fstab
Exemple de résultat :
# # /etc/fstab # Created by anaconda on Sat Jul 18 05:53:25 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 UUID=6a7f6481-5eb3-4589-ad19-b2291ddfcda1 /boot ext4 defaults 1 2 UUID=6906-5D0A /boot/efi vfat umask=0077,shortname=winnt 0 2 /dev/mapper/cl-swap swap swap defaults 0 0
2.3. virt-copier
La commande Virt-copy-in est utilisée pour copier des fichiers et des répertoires de l'hôte vers une image disque ou une machine virtuelle.
$ sudo virt-copy-in -a CentOS_8_Server.img ostechnix.txt /root/
Ou,
$ sudo virt-copy-in -d centos8-uefi ostechnix.txt /root/
2.4. virt-copy-out
La commande Virt-copy-out est utilisée pour copier des fichiers et des répertoires à partir d'une image disque ou d'une machine virtuelle.
$ sudo virt-copy-out -a CentOS_8_Server.img /root/ostechnix.txt ~/Downloads
Ou,
$ sudo virt-copy-in -d centos8-uefi /root/ostechnix.txt ~/Downloads
Les commandes ci-dessus copieront le fichier /root/ostechnix.txt du disque de la machine virtuelle vers le répertoire ~/Downloads du système hôte local.
2.4. virt-df
La commande Virt-df affiche l'espace libre sur le système de fichiers d'une machine invitée.
Afficher l'espace libre sur une image disque :
$ sudo virt-df -a CentOS_8_Server.img
Exemple de résultat :
Filesystem Size Used Available Use% CentOS_8_Server.img:/dev/sda1 976M 260M 649M 27% CentOS_8_Server.img:/dev/cl/root 17G 1.4G 16G 9%
Afficher l'espace disque sur une VM :
$ sudo virt-copy-in -d centos8-uefi /root/ostechnix.txt ~/Downloads
Exemple de résultat :
Filesystem Size Used Available Use% centos8-uefi:/dev/sda1 599M 6.6M 592M 2% centos8-uefi:/dev/sda2 976M 121M 788M 13% centos8-uefi:/dev/cl/root 16G 1.2G 15G 8%
2.5. virt-edit
Modifier un fichier dans une image disque ou une machine virtuelle.
$ sudo virt-edit -a CentOS_8_Server.img /root/ostechnix.txt
Ou,
$ sudo virt-edit -d centos8-uefi /root/ostechnix.txt
Cette commande ouvrira le fichier distant dans l'éditeur par défaut. Effectuez simplement les modifications, puis enregistrez et fermez le fichier.
2.6. virt-filesystems
Répertorier les systèmes de fichiers, les partitions, les périphériques de bloc, LVM dans une machine virtuelle ou une image disque.
$ sudo virt-filesystems -a CentOS_8_Server.img -l
Ou,
$ sudo virt-filesystems -d centos8-uefi -l
Exemple de résultat :
Name Type VFS Label Size Parent /dev/sda1 filesystem vfat - 629145600 - /dev/sda2 filesystem ext4 - 1073741824 - /dev/cl/root filesystem xfs - 17620271104 -
Pour afficher les détails de la partition, ajoutez --partitions dans la commande ci-dessus :
$ sudo virt-filesystems -d centos8-uefi --partitions /dev/sda1 /dev/sda2 /dev/sda3
De même, vous pouvez utiliser --logical-volumes , --volume-groups , --volumes-physiques , --block-devices pour lister ces éléments.
2.7. inspecteur virt
Virt-inspector est utilisé pour afficher la version du système d'exploitation et d'autres informations sur une image disque ou une machine virtuelle.
$ sudo virt-inspector -a CentOS_8_Server.img
Ou,
$ sudo virt-inspector -d centos8-uefi
2.8. virt-ls
Virt-ls est utilisé pour afficher les fichiers et répertoires et leurs tailles, attributs, sommes de contrôle dans une image disque ou une machine virtuelle.
$ sudo virt-ls -R -a CentOS_8_Server.img / | less
Ou,
$ sudo virt-ls -R -d centos8-uefi /root
Vous pouvez utiliser la plupart des options/indicateurs normaux de la commande "ls" avec la commande virt-ls.
2.9. virt-log
Virt-log est utilisé pour afficher les fichiers journaux d'une image disque ou d'une machine virtuelle.
$ sudo virt-log -a CentOS_8_Server.img
Ou,
$ sudo virt-log -d centos8-uefi
2.10. virt-queue
La commande virt-tail est utilisée pour suivre les fichiers journaux dans une image disque ou une machine virtuelle.
$ sudo virt-tail -a CentOS_8_Server.img /var/log/messages
Ou,
$ sudo virt-tail -d centos8-uefi /var/log/messages
De nombreuses autres commandes sont disponibles. Je vous propose de vous référer au site libguestfs dont le lien se trouve à la fin de ce guide.
Lire ensuite :
- Créer rapidement des images de machines virtuelles avec Virt-builder
- Afficher les statistiques des systèmes de virtualisation avec Virt-top sous Linux
- Comment sauver des machines virtuelles avec Virt-rescue
Dépannage
Voici les solutions à quelques problèmes courants.
1. libguestfs ne fonctionne pas sans les autorisations root sur Ubuntu
Vous pouvez rencontrer cette erreur lorsque vous essayez d'accéder aux images de disque sur Ubuntu :
libguestfs: error: /usr/bin/supermin exited with error status 1. To see full error messages you may need to enable debugging. Do: export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1 and run the command again. For further information, read: http://libguestfs.org/guestfs-faq.1.html#debugging-libguestfs
Pour résoudre ce problème, exécutez :
$ sudo chmod 0644 /boot/vmlinuz*
Vous devrez peut-être vous ajouter au kvm groupe :
$ sudo usermod -a -G kvm sk
Remplacez "sk" dans la commande ci-dessus par votre propre nom d'utilisateur.
- Si vous avez déjà installé libvirt ou KVM sur votre système et essayez d'utiliser les outils libguesfs en tant qu'utilisateur root, vous devriez voir cette erreur d'autorisation :
libguestfs: error: could not create appliance through libvirt. Try running qemu directly without libvirt using this environment variable: export LIBGUESTFS_BACKEND=direct Original error from libvirt: Cannot access backing file '/root/CentOS_8_Server.qcow2' of storage file '/tmp/libguestfsiPjmga/overlay1.qcow2' (as uid:107, gid:107): Permission denied [code=38 int1=13]
Ceci est causé par libvirt, et ne se produit donc que lors de l'utilisation du backend libvirt. Pour résoudre ce problème, passez au backend direct en définissant cette variable d'environnement :
export LIBGUESTFS_BACKEND=direct
Pour le rendre permanent, ajoutez cette ligne à votre ~/.bashrc fichier.