41.6Direkter Zugriff auf den Inhalt einer Image-Datei

In diesem Abschnitt geht es um die Frage, wie Sie den Inhalt eines virtuellen Datenträgers auslesen oder verändern können, ohne die virtuelle Maschine selbst zu starten. Das ist beispielsweise praktisch, um von außen Reparaturen durchzuführen oder um Konfigurationsdateien durch ein Script zu verändern.

Für den Zugriff auf den virtuellen Datenträger gibt es verschiedene Vorgehensweisen:

In diesem Abschnitt gehe ich nur auf die beiden ersten Varianten ein. Manche der hier vorgestellten Werkzeuge können ausschließlich RAW-Images bearbeiten. Gegebenenfalls müssen Sie eine in einem anderen Format vorliegende Image-Datei in dieses Format umwandeln:

user$ qemu-img convert -f qcow2 image.qcow2 -O raw image.raw

Mit dem folgenden Kommando erzeugen Sie aus einem Logical Volume oder einer Festplattenpartition ein äquivalentes RAW-Image:

root# dd if=/dev/mapper/vg830-lv2 of=copy.raw bs=64M 312+1 Datensätze ein 312+1 Datensätze aus 20971520000 Bytes (21 GB) kopiert, 133,462 s, 157 MB/s

Ein Schreibzugriff auf einen virtuellen Datenträger ist nur zulässig, wenn die virtuelle Maschine vollkommen heruntergefahren ist! Andernfalls riskieren Sie ein kaputtes Dateisystem!

Zugriff auf partitionierte RAW-Images im Hostsystem

Mit dem Kommando kpartx aus dem gleichnamigen Paket verbinden Sie alle in einer RAW-Datei enthaltenen Partitionen mit Loop-Devices:

root# kpartx -av image.raw add map loop0p1 (252:12): 0 1024000 linear /dev/loop0 2048 add map loop0p2 (252:13): 0 19945472 linear /dev/loop0 1026048

Bei unseren Tests hat dies auch funktioniert, wenn die Image-Datei eine GUID Partition Table enthält (also keine traditionelle Partitionstabelle im Master Boot Record). Sofern es sich um normale Partitionen handelt, können Sie diese nun direkt mit mount in das Dateisystem einbinden:

root# mkdir /repair1 root# mount /dev/mapper/loop0p1 /repair1

Wenn Sie innerhalb der virtuellen Maschine LVM konfiguriert haben, stehen die resultierenden Physical und Logical Volumes sowie Volume Groups direkt zur Verfügung. Listen der LVM-Elemente liefern lvscan, pvscan und vgscan. Der Zugriff auf die LVs setzt voraus, dass auf dem Hostsystem die LVM-Werkzeuge installiert sind.

root# lvscan ACTIVE '/dev/VolGroup/lv_root' [7,56 GiB] inherit ACTIVE '/dev/VolGroup/lv_swap' [1,94 GiB] inherit ... root# mkdir /repair2 root# mount /dev/VolGroup/lv_root /repair2

Nun können Sie über die Verzeichnisse repairn auf die Dateisysteme der virtuellen KVM-Festplatte zugreifen. Wenn Sie damit fertig sind, müssen Sie aufräumen:

root# umount /repair1 root# umount /repair2 root# kpartx -dv image.raw

libguestfs-Werkzeuge

Anstatt die Image-Datei selbst zu analysieren und die relevanten Partitionen in das lokale Dateisystem zu integrieren, können Sie diese Aufgaben diversen Werkzeugen überlassen, die auf der libguestfs-Bibliothek aufbauen.

Die Bibliothek libguestfs erlaubt den direkten Zugriff auf die Dateisysteme, die sich innerhalb einer Image-Datei befinden. libguestfs unterstützt alle erdenklichen Image-Formate, Partitionen, LVM sowie alle gängigen Dateisysteme. Die Bedienung der libguestfs-Werkzeuge ist auf der folgenden Website sowie auf der man-Seite libguestfs umfassend dokumentiert:

http://libguestfs.org

Aktuelle CentOS-, Debian-, Fedora-, RHEL- und Ubuntu-Distributionen liefern alle erforderlichen Pakete gleich mit:

root# apt-get/dnf/yum install libguestfs-tools

Das Paket enthält diverse Kommandos zur Manipulation von Image-Dateien. Die zu bearbeitende oder zu analysierende Image-Datei geben Sie in der Regel mit -a image-datei an. Alternativ können Sie mit -d vmname den libvirt-Namen der virtuellen Maschine angeben.

virt-df gibt einen raschen Überblick über die Auslastung aller Dateisysteme aller virtuellen Maschinen, die den libvirt-Werkzeugen bekannt sind. Das Kommando kommt auch mit Logical Volumes innerhalb von virtuellen Datenträgern zurecht.

root# virt-df Filesystem 1K-blocks Used Available Use% centos-mini:/dev/sda1 495844 52091 418153 11% centos-mini:/dev/sdb1 20157836 253468 18880396 2% centos-mini:/dev/vg_centosmini/lv_root 9571132 1051104 8033836 11% centos64-vm2:/dev/sdb 4319464 4319464 0 100% centos64-vm2:/dev/sda1 495844 32918 437326 7% centos64-vm2:/dev/vg_vm2/lv_root 7539088 2369932 4786180 32% ...

Wenn Sie nur an den Ergebnissen einer einzelnen virtuellen Maschine interessiert sind, geben Sie den Dateinamen der Image-Datei mit -a oder den libvirt-Namen der virtuellen Maschine mit -d an.

virt-filesystems verrät, welche Dateisysteme sich in einer Image-Datei befinden. Mit den Optionen --all, --long und --uuid listet das Kommando auch LVM- und Swap-Partitionen auf und gibt die UUID-Nummern der Dateisysteme an:

root# virt-filesystems -a vm2.img --all --long --uuid Name Type VFS Label Size Parent UUID /dev/sda1 filesystem ext4 - 524288000 - 7a95... /dev/vg_vm2/lv_root filesystem ext4 - 7843348480 - e69f... /dev/vg_vm2/lv_swap filesystem swap - 2113929216 - e0f4... ...

virt-inspector wirft einen Blick in die Dateisysteme einer Image-Datei und verrät, welche Distribution darin installiert ist, welche Partitionen es gibt, welche Kernelversion und welche Pakete installiert sind etc. virt-inspector kennt sowohl das RPM- als auch das Debian-Paketsystem.

root# virt-inspector disk.img linux centos x86_64 6.4 (CentOS release 6.4 (Final)) on /dev/vg_vm2/lv_root: Mountpoints: /dev/vg_vm2/lv_root / /dev/sda1 /boot /dev/vg_vm2/lv_swap swap Filesystems: /dev/sda1: label: UUID: 7a95ebf4-4a3d-4a87-888f-93c08505156c type: ext4 content: linux-grub ...

virt-cat gibt eine Datei einer virtuellen Maschine aus:

root# virt-cat -d centos64 /etc/fstab LABEL=79d3d2d4 / ext4 defaults,noatime 0 0 ...

Um die Datei in einem Editor zu verändern, verwenden Sie anstelle von virt-cat das Kommando virt-edit. Es darf nur für ausgeschaltete virtuelle Maschinen verwendet werden! Abweichend von den anderen Kommandos wird der Name der Image-Datei bzw. der virtuellen Maschine ohne die Optionen -a bzw. -d angegeben. virt-edit berücksichtigt bei der Wahl des Editors die Umgebungsvariable EDITOR. Standardmäßig wird der Editor vi ausgeführt.

root# virt-edit centos64 /etc/fstab

Mit virt-tar können Sie ein Archiv von Dateien aus dem Dateisystem der virtuellen Maschine lesen oder dorthin schreiben – Letzteres aber nur, wenn die virtuelle Maschine ausgeschaltet ist. Das folgende Kommando liest das Verzeichnis /root der virtuellen Maschine vm1 aus und speichert es in einem tar-Archiv:

root# virt-tar -z -x vm1 /root root-backup.tar.gz

virt-make-fs erzeugt eine neue Image-Datei und speichert darin den Inhalt eines Verzeichnisses oder eines tar-Archivs:

root# virt-make-fs mydata.tar.gz new-disk.img