Zugreifen auf und Ändern von Disk-Images virtueller Maschinen mit libguestfs-Tools
In einem früheren Artikel haben wir gesehen, wie man virtuelle KVM-Maschinen über die Befehlszeile erstellt. In diesem Tutorial lernen wir stattdessen, wie man auf Disk-Images virtueller Maschinen zugreifen und diese ändern kann, indem man einige Dienstprogramme verwendet, die Teil des libguestfs-Pakets auf den am häufigsten verwendeten Linux-Distributionen sind. Mit diesen Tools können wir eine Vielzahl von Aufgaben ausführen.
Wir werden uns auf einige von ihnen konzentrieren, wie virt-filesystems und guestmount, die verwendet werden können, um Dateisysteme aufzulisten, die auf Gast-Disk-Images vorhanden sind, bzw. sie auf dem Host-System zu mounten.
In diesem Tutorial lernen Sie:
- So installieren Sie libguestfs-tools auf einigen der am häufigsten verwendeten Linux-Distributionen
- So listen Sie Partitionen und Dateisysteme auf, die auf Gast-Disk-Images vorhanden sind
- So mounten und unmounten Sie Gastdateisysteme auf dem Host-System
- So bearbeiten Sie Gastdateien vom Hostsystem aus
- Kopieren von Dateien in und aus einem Gastsystem
Installation
Wir können die Tools, über die wir in diesem Tutorial sprechen werden, direkt aus den offiziellen Repositories der am häufigsten verwendeten Linux-Distribution installieren, indem wir ihre nativen Paketmanager verwenden. Auf Fedora verwenden wir zum Beispieldnf. In dieser Distribution sind die Dienstprogramme im libguest-Paket enthalten:
sudo dnf install libguestfs
Auf der Debian-Distributionsfamilie und Debian selbst können wir stattdessen den apt-Wrapper verwenden, um die Installation durchzuführen. Der Name des Pakets lautet libguestfs-tools:
sudo apt install libguestfs-toolsUnter Archlinux heißt das Paket, wie auch auf Fedora, libguestfs. Wir können die Installation mit pacman durchführen:
sudo pacman -Sy libguestfsDas Paket bietet eine Vielzahl von Dienstprogrammen, die es uns ermöglichen, mit virtuellen Maschinen und Disk-Images zu interagieren und sehr nützliche Aufgaben auszuführen. Ein Hinweis, bevor wir anfangen, einige Beispiele zu sehen: Wenn wir libvirt verwenden und versuchen, eines der oben genannten Dienstprogramme aufzurufen, erhalten wir die folgende Fehlermeldung:
libguestfs: error: could not create appliance through libvirt.Eine Lösung für dieses Problem besteht darin, qemu direkt auszuführen, indem wir die Variable LIBGUESTFS_BACKEND in der Shell, die wir zum Aufrufen der Befehle verwenden, auf "direct" setzen und exportieren oder sie zu einem Teil unserer Umgebung machen:
export LIBGUESTFS_BACKEND=directAuflisten von Gastpartitionen und Dateisystemen
Das Dienstprogramm virt-filesystems ermöglicht es uns, Dateisysteme, Partitionen und Blockgeräte aufzulisten, die auf Images von Festplatten virtueller Maschinen vorhanden sind. Sehen wir uns ein Beispiel für seine Verwendung an. Das Tool kann, wie praktisch alle, die Teil der Suite sind, grundsätzlich auf zwei Arten verwendet werden: Die erste besteht darin, die Domäne der virtuellen Maschine mit der Option -d zu übergeben. Wenn diese Strategie angewendet wird, werden alle vom Gast verwendeten Festplatten analysiert:
virt-filesystems [options] -d <domain>Die andere Strategie, die wir verwenden können, besteht darin, dem Dienstprogramm den Pfad eines Disk-Images direkt als Argument der Option -a zur Verfügung zu stellen:
virt-filesystems [options] -a /path/to/diskLassen Sie uns testen, was der Befehl auf einem virtualisierten Fedora 35-System zurückgibt, das das Disk-Image fedora35.qcow2 verwendet. Um alle auf der Festplatte vorhandenen Dateisysteme aufzulisten, führen wir Folgendes aus:
virt-filesystems -a fedora35.qcow2
/dev/sda1
/dev/sda2Der Befehl hat zwei Dateisysteme erkannt. Um zusätzliche Informationen über sie zu erhalten, können wir die Option -l hinzufügen (kurz für --long):
virt-filesystems -la fedora35.qcow2
Name Type VFS Label Size Parent
/dev/sda1 filesystem ext4 - 1020702720 -
/dev/sda2 filesystem ext4 - 20038230016 -
Wie Sie sehen können, wurden Details wie der Dateisystemtyp und seine Größe berücksichtigt. Um die Größe des Dateisystems für Menschen lesbar zu machen (vierte Spalte), können wir dem Befehl die Option -h hinzufügen. Die Ausgabe sieht wie folgt aus:
virt-filesystems -lha fedora35.qcow2
Name Type VFS Label Size Parent
/dev/sda1 filesystem ext4 - 973M -
/dev/sda2 filesystem ext4 - 19G -
Standardmäßig werden nur Dateisysteme, die eingehängt werden können, in der Liste aufgeführt; Um auch nicht mountbare Dateisysteme (z.B. swap) in der Liste erscheinen zu lassen, können wir die Option --extra verwenden.
Festlegen von Gerätetypen
Wie wir oben gesehen haben, besteht die Standardaktion des Dienstprogramms darin, Dateisysteme anzuzeigen, die auf einem Disk-Image vorhanden sind. Wir können jedoch die Art der "Entität" angeben, die explizit aufgeführt werden soll. Um beispielsweise eine Liste der Partitionen zu erhalten, die auf einem Disk-Image vorhanden sind, können wir die Option --partitions verwenden:
virt-filesystems --partitions -la fedora35.qcow2
Name Type MBR Size Parent
/dev/sda1 partition 83 1073741824 /dev/sda
/dev/sda2 partition 83 20400046080 /dev/sda
Auf die gleiche Weise können wir logische Volumes (--logical-volumes), Volume-Gruppen (--volume-groups) oder physische Volumes (--physical-volumes) visualisieren. Um das Dienstprogramm dazu zu bringen, alle von ihnen einzubeziehen, können wir einfach die Option --all verwenden:
virt-filesystems --all -la fedora35.qcow2Wenn wir dies tun, erscheinen einige Einträge mehr als einmal in der Ausgabeliste: /dev/sda1 zum Beispiel ist eine Partition, enthält aber ein ext4-Dateisystem:
Name Type VFS Label MBR Size Parent
/dev/sda1 filesystem ext4 - - 1020702720 -
/dev/sda2 filesystem ext4 - - 20038230016 -
/dev/sda1 partition - - 83 1073741824 /dev/sda
/dev/sda2 partition - - 83 20400046080 /dev/sda
/dev/sda device - - - 21474836480 -
Formatieren der Ausgabe als CSV
Wie wir in den vorherigen Beispielen gesehen haben, wird die vonvirt-filesystems erzeugte Ausgabe standardmäßig als Liste formatiert. Mit der Option --csv können wir jedoch sicherstellen, dass das CSV-Format (Comma Separated Values) verwendet wird:
virt-filesystems --all --csv -la fedora35.qcow2
Name,Type,VFS,Label,MBR,Size,Parent
/dev/sda1,filesystem,ext4,,,1020702720,
/dev/sda2,filesystem,ext4,,,20038230016,
/dev/sda1,partition,,,83,1073741824,/dev/sda
/dev/sda2,partition,,,83,20400046080,/dev/sda
/dev/sda,device,,,,21474836480,Ein- und Aushängen von Gast-Dateisystemen auf dem Host
Mit den Dienstprogrammen guestmount und guestunmount ist es möglich, Gastdateisysteme auf dem Host einzuhängen bzw. auszuhängen. Wenn das Gastsystem läuft, sollten die Dateisysteme immer im schreibgeschützten Modus gemountet werden, sonst können sie
beschädigt werden: Wenn wir also Schreiboperationen durchführen müssen, sollten wir zuerst die virtuelle Maschine herunterfahren.
Gastdateisysteme können als Nicht-Root-Benutzer auf dem Host mit Hilfe von FUSE (Dateisystem im Userspace) gemountet werden. In diesem Fall der Benutzer, der der Eigentümer des Verzeichnisses sein muss, das als Einhängepunkt verwendet werden soll.
Sehen wir uns ein praktisches Beispiel mit dem Disk-Image fedora35.qcow2 an, das wir zuvor gesehen haben. Aus der Ausgabe von virt-filesystems wissen wir, dass ein ext4-Dateisystem auf /dev/sda1 existiert; Hier erstellen wir ein Verzeichnis namens mountpoint
und mounten das Gastdateisystem im schreibgeschützten Modus:
mkdir mountpoint
guestmount -a fedora35.qcow2 -m /dev/sda1 --ro mountpointSchauen wir uns den obigen Befehl an. Wie in den vorherigen Beispielen haben wir den Pfad des Disk-Images über die Option -a angegeben. Mit der Option -mhaben wir stattdessen das Gastdateisystem angegeben, das eingehängt werden soll, und mit --ro, dass es im schreibgeschützten Modus eingehängt werden soll. Schließlich haben wir angegeben, wo im Host-Dateisystem es eingehängt werden soll.
ls -l mountpoint
total 110224
-rw-r--r--. 1 root root 240738 Feb 23 18:25 config-5.16.11-200.fc35.x86_64
drwxr-xr-x. 3 root root 17 Feb 27 15:51 efi
drwx------. 5 root root 97 Feb 27 15:56 grub2
-rw-------. 1 root root 62396530 Feb 27 15:55 initramfs-0-rescue-c4f17c4c03ad474cb43ee9e586b29d0c.img
-rw-------. 1 root root 21517654 Feb 27 15:57 initramfs-5.16.11-200.fc35.x86_64.img
drwxr-xr-x. 3 root root 21 Feb 27 15:52 loader
lrwxrwxrwx. 1 root root 47 Feb 27 15:52 symvers-5.16.11-200.fc35.x86_64.gz -> /lib/modules/5.16.11-200.fc35.x86_64/symvers.gz
-rw-------. 1 root root 5958331 Feb 23 18:25 System.map-5.16.11-200.fc35.x86_64
-rwxr-xr-x. 1 root root 11371408 Feb 27 15:54 vmlinuz-0-rescue-c4f17c4c03ad474cb43ee9e586b29d0c
-rwxr-xr-x. 1 root root 11371408 Feb 23 18:25 vmlinuz-5.16.11-200.fc35.x86_64
Was ist, wenn wir das Gastdateisystem rekursiv mounten möchten? Nehmen wir zum Beispiel an, dass im Gast /dev/sda1die Boot-Partition darstellt, die auf /boot eingehängt ist. Die Root-Partition ist stattdessen /dev/sda2, daher sollte sie davor gemountet werden, wenn wir dieses Mount-Schema auf dem Host reproduzieren wollen. Wir können es ganz einfach mit dem folgenden Befehl tun:
guestmount -a fedora35.qcow2 -m /dev/sda2 -m /dev/sda1:/boot --ro mountpointOben haben wir die Option -m zweimal verwendet, einmal für jedes Dateisystem, das wir mounten möchten. Mit der Notation /dev/sda1:/boot haben wir deklariert, dass das Dateisystem /dev/sda1 auf /boot gemountet werden soll, wobei "/boot" der Einhängepunkt im Gast ist.
Aushängen der Gastdateisysteme aufheben
Um die Gastdateisysteme auszuhängen, können wirguestunmount verwenden. Die Verwendung ist sehr einfach: Wir rufen einfach das Dienstprogramm auf und übergeben den Einhängepunkt als Argument. In diesem Fall würden wir Folgendes ausführen:
guestunmount mountpointBearbeiten von Dateien innerhalb eines Gastsystems
Das Dienstprogramm virt-edit ermöglicht es uns, Dateien, die auf der Festplatte einer virtuellen Maschine vorhanden sind, direkt vom Host-System aus zu ändern. Wie bereits erwähnt, kann das Ändern von Dateien während der Ausführung einer virtuellen Maschine gefährlich sein, daher sollte das Gastsystem gestoppt werden, bevor solche Vorgänge ausgeführt werden.
Das Bearbeiten von Dateien mit virt-edit ist ganz einfach. Wie in den vorherigen Beispielen geben wir den Pfad des Disk-Images oder der Domäne des Gastsystems und den Pfad der Datei selbst an. Nur als Beispiel: Um die Datei /etc/fstab in dem Gast zu bearbeiten, der durch die Domäne "fedora" identifiziert wird, würden wir Folgendes ausführen:
virt-edit -d fedora /etc/fstabDie Datei wird in das Verzeichnis /tmp des Host-Dateisystems kopiert und mit dem Standardeditor geöffnet. Mehrere Dateien können mit einem Befehl nacheinander angegeben werden. In diesem Fall werden sie nacheinander geöffnet (der zweite wird geöffnet, nachdem der erste geschlossen wurde, usw...):
virt-edit -d fedora /etc/fstab /etc/crypttabKopieren von Dateien in und aus einem Gastsystem
Um Dateien auf und von einem Disk-Image einer virtuellen Maschine zu kopieren, können wir die Dienstprogramme virt-copy-in bzw. virt-copy-out verwenden. Auch hier können wir mit der Option -d auf die Domäne verweisen, dann auf die zu kopierende Datei(en) und schließlich auf das Zielverzeichnis.
Nichts ist besser als ein Beispiel, um zu demonstrieren, wie die Befehle funktionieren. Angenommen, wir möchten die Datei /etc/fstab von dem Gastsystem, das mit der Domäne "fedora" verknüpft ist, in unser aktuelles Arbeitsverzeichnis im Host-Dateisystem kopieren. So würden wir virt-copy-out aufrufen:
virt-copy-out -d fedora /etc/fstab .Um eine oder mehrere Dateien von unserem Host auf das Dateisystem einer virtuellen Gastmaschine zu kopieren, verwenden wir stattdessen virt-copy-in. Hier ist, was wir tun würden, um die Datei "fstab" in unserem aktuellen Verzeichnis zurück in das Verzeichnis /etc/ im Gastdateisystem zu kopieren:
virt-copy-in -d fedora fstab /etc/Abschließende Gedanken
In diesem Tutorial haben wir gelernt, wie man die libguestfs-Tools auf einigen der am häufigsten verwendeten Linux-Distributionen installiert und wie man einige von ihnen verwendet. Wir haben gesehen, wie man Dateisysteme und Partitionen auflistet, die auf einem Disk-Image vorhanden sind, wie man Gastdateisysteme auf einem Hostsystem einhängt und aushängt, wie man Gastdateien direkt vom Host aus bearbeitet und schließlich, wie man Dateien von und zu einem Gastdateisystem kopiert.
