Zugriff auf virtuelle Disk-Images mit Libguestfs

© iofoto, 123RF

Gastfreundlich

Die Libvirt vereinheitlicht den Zugriff auf virtuelle Maschinen unterschiedlicher Couleur zur Laufzeit. Mit der Libguestfs können Administratoren und Programmierer die dazu gehörigen Disk-Images bearbeiten.
Strom sparender Computereinsatz hilft nicht zuletzt auch Kosten zu senken. ADMIN 02/2011 geht der Frage nach, was Administratoren tun können, damit ihre ... (mehr)

In der Vergangenheit hatten Administratoren es mit virtuellen Disk-Images nicht leicht. Ganz am Anfang mussten sie sogar noch die Images für virtuelle Maschinen von Hand anlegen, aber diese Zeiten sind unter anderem dank des Storage-Management-Codes der Libvirt vorbei. Wer aber unabhängig von einer laufenden virtuellen Maschine ein Disk-Image bearbeiten wollte, musste sich immer noch mit Tools wie Kpartx begnügen. Das erforderte Root-Rechte und barg somit sogar die Gefahr für Root-Exploits durch manipulierte Disk-Images.

Ich fand die Situation völlig inakzeptabel. Schließlich sind Disk-Images auch nur Dateien, und es ist nicht einzusehen, wieso man dafür Root-Rechte brauchen sollte. Man muss auch nicht Superuser werden, wenn man ein Textdokument öffnet oder spezielle Device-Nodes anlegen, um mit Gimp zu arbeiten.

Problem erkannt

Die Libguestfs [1] löst nun alle diese Probleme. Es ist eine skriptbare, sichere Bibliothek, über die ein Anwender Disk-Images unterschiedlicher virtueller Maschinen ohne Root-Rechte bearbeiten kann. Das Paket bringt eine ganze Reihe nützlicher Kommandozeilentools mit und sogar eine interaktive Shell, um innerhalb des Disk-Image zu navigieren.

Anwender von Fedora, Red Hat Enterprise Linux und Cent OS haben es leicht. Fedora-User beispielsweise installieren die Bibliothek und die Tools mit

yum install \*guestf\*

Wer RHEL oder Cent OS einsetzt, muss vorher noch das EPEL-Repository einbinden und kann dann Libguestfs mit dem gleichen Befehl installieren. Debian- und Ubuntu-User finden einen passenden Link in den Libguestfs-FAQ [2] . Hilfe versprechen ein freundlicher IRC-Channel namens #libguestfs im Freenode-Netz und eine Mailing-Liste, die Sie über die Website abonnieren können.

Libguestfs kann von Hardware-Beschleunigung Gebrauch machen, dazu muss das Device »/dev/kvm« Lese- und Schreibrechte für den jeweiligen Benutzer besitzen. Wenn die Tools installiert sind, verschaffen Sie sich einen Überblick, indem Sie in der Shell »virt-« eingeben und zweimal die Tab-Taste drücken. Tabelle 1 listet die wichtigsten Befehle auf.

Für jedes Tool gibt es eine eigene Manpage (zum Beispiel »man virt-df« ). Guestfish erlaubt den vollständigen Zugriff auf die Libguestfs-API zum Beispiel für Shellskripts, mit Guestmount können Sie ein Disk-Image in einem Verzeichnis mounten ( Abbildung 1 ). Die API ist außerdem für die Programmiersprachen C, C++, Perl, Python, Ruby, Ocaml, Java, Haskell und C# (Mono) verfügbar.

Abbildung 1: Mit dem Befehl guestmount kann der Administrator ein virtuelles Image direkt mounten. Hier ein Windows-Dateisystem im Nautilus-Dateibrowser.

Wie der Name schon andeutet, stellt »virt-df« das Pendant zum gewohnten »df« -Kommando dar. Ohne weitere Optionen aufgerufen zeigt es den freien und belegten Speicherplatz jeder virtuellen Disk an, die von Libvirt verwaltet wird. Beachten Sie, dass per Default nur Root die Images lesen darf, die beispielsweise in »/var/lib/libvirt/images« liegen. Damit Sie als gewöhnlicher User die Images lesen dürfen, müssen Sie die Rechte also entsprechend anpassen. Das Beispiel einer Ausgabe von »virt-df« zeigt Listing 1 . Alternativ rufen Sie virt-df mit einem Disk-Image als Parameter auf ( Listing 2 ).

Listing 2

virt-df mit Disk-Image

 

Listing 1

virt-df

 

Virt-df eignet sich hervorragend dafür, kontinuierlich den Speicherplatz zu überprüfen und rechtzeitig neue Kapazitäten einzuplanen. So können Sie es als Cronjob ausführen und die kommaseparierte Ausgabe ( »--csv« ) beispielsweise in Datenbanken oder eine Tabellenkalkulation importieren.

Die Größe eines Disk-Image lässt sich mit »virt-resize« ändern ( Listing 3 ). Das Tool verändert nicht direkt das Disk-Image, sondern legt ein neues an und kopiert die bestehenden Inhalte dorthin. Damit diese konsistent sind, sollte man keine Images mit einer gerade laufenden Maschine verändern. Fahren Sie diese also vorher herunter.

Listing 3

virt-resize

 

Wenn es beispielsweise ein Problem mit dem Boot-Manager einer virtuellen Maschine gibt, lässt sich mit »virt-edit« direkt eine Datei auf dem Image editieren, wie etwa die Grub-Konfigurationsdatei »menu.lst« :

virt-edit Debian5x32 /boot/grub/menu.lst

Alternativ dazu können Sie eine Reparatur mit »virt-rescue« versuchen, das ähnlich wie eine Rescue-CD eine Rettungs-Shell startet. Versuchen Sie auch das besser nicht mit einer laufenden VM (siehe Kasten "Warnung" ).

Warnung

Verwenden Sie niemals Libguestfs-Tools im Lese-/Schreibmodus mit Images einer laufenden virtuellen Maschine. Das würde höchstwahrscheinlich zu einem unbrauchbaren Image führen. Meistens überprüfen die Tools das selbst, aber es gibt Fälle, in denen Sie es nicht merken. Die meisten Programme kennen die Option »--ro« , um Änderungen zu verhindern. Damit lassen sich die Tools gefahrlos selbst mit laufenden VMs verwenden. Manche Tools lesen von Haus aus nur, und kennen deshalb diese Option nicht. Werfen Sie im Zweifelsfall einen Blick in die Manpage.

Um Dateien eines Image anzuzeigen, gibt es den Befehl »virt-cat« . Damit können Sie beispielsweise die Logdateien einer virtuellen Maschine anzeigen oder nach verdächtigen Spuren suchen. Das Skript in Listing 4 verwendet »virt-cat« , um nach Backdoor-Accounts in einem Linux-Gastsystem zu suchen.

Listing 4

Backdoor-Suche

 

Auch wenn sich viele Administrationsaufgaben mit den Kommandozeilentools des Pakets erledigen lassen, erschließt sich der volle Leistungsumfang der Libguestfs nur durch Guestfish, die interaktive Shell. Guestfish kennt intern beinahe 300 Befehle, von denen dieser Artikel nur die allerwichtigsten kurz erklärt.

Sie können Guestfish ebenfalls mit einem existierenden Disk-Image starten oder direkt ein neues anlegen. An Formaten beherrscht Guestfish das Rohformat von Festplatten (Raw), CD-ISOs, virtuelle Floppy Disks (VFD), komprimierte Formate wie Qcow2, SD-Karten und sogar Dateisysteme. Guestfish kann sie alle lesen und die meisten sogar schreiben. Zum Starten des Programm geben Sie in der Shell »guestfish« ein. Ein 100 MByte großes Sparse-Image legen Sie dann folgendermaßen an:

><fs> sparse test.img 100M
><fs> run

Das dauert ein paar Sekunden. Partitionieren Sie dann die Disk und legen Sie ein Dateisystem an:

><fs> part-disk /dev/sda mbr
><fs> mkfs ext2 /dev/sda1

Sie können die Partition dann mounten und beispielsweise eine Datei aus dem Host-System in die neue Gast-Partition hochladen ( Listing 5 ). Umgekehrt geben Sie mit dem folgenden Befehl den Inhalt der Datei aus dem Disk-Image aus:

Listing 5

Datei-Upload ins Gast-System

 

guestfish --ro -a test.img -m /dev/sda1 cat /foo.rb

Der Schalter »-a« fügt das Image hinzu, und »-m« teilt Guestfish mit, wo es das Dateisystem findet. Von außen betrachtet ist ein Disk-Image nur eine Datei, das Mounten eines Dateisystems gehorcht aber den Konventionen des jeweiligen Betriebssystems. So kann »/dev/sda1« auf »/boot« eingebunden werden, »/dev/vg/lv_var« auf »/var« oder »/dev/sda2« als Laufwerk »C:« unter Windows. Woher soll man nun als Anwender wissen, wie man eine Partition einbindet? Libguestfs bringt ein Tool namens »virt-inspector« mit, das mit einigen Regeln und Heuristiken die Zuweisung herausfindet. Über den Schalter »-i« bietet Guestfish eine ähnliche Funktion ( Listing 6 ).

Listing 6

Automatik mit -i

 

Um beispielsweise herauszufinden, wieviel Platz die Logdateien einnehmen, geben Sie »du /var/log« ein. Mit »grep ^root: /etc/password« listen Sie den Root-Account des Systems auf. Auch Pfad- und Dateivervollständigung per Tab-Taste funktioniert in Guestfish wie von der Bash-Shell gewohnt. Partitionen und logische Volumes listen die folgenden Befehle auf:

><fs> list-partitions
/dev/vda1
/dev/vda2
><fs> lvs
/dev/vg_rhel6/lv_root
/dev/vg_rhel6/lv_swap

Ihr Typ lässt sich dann mit »vfs-type« und »file« abfragen:

><fs> vfs-type /dev/vg_rhel6/lv_root
ext4
><fs> file /dev/vg_rhel6/lv_root
Linux rev 1.0 ext4 filesystem data (needs journal recovery) (extents) (large files) (huge files)

Mit den Guestfish-Befehlen »tgz-out« und »tgz-in« packen Sie Dateien aus dem Gast-System in ein Tar-Paket auf dem Host-System oder umgekehrt. Mit dem Augeas-Konfigurations-Editor [3] können Sie die Konfiguration verschiedener Linux-Systeme bearbeiten, zum Beispiel die Apt-Konfigurationsdateien einer Debian-Distribution:

><fs> aug-init / 0
><fs> aug-get /files/etc/apt/sources.list/1/uri
http://ftp.uk.debian.org/debian/
><fs> aug-get /files/etc/apt/sources.list/1/distribution
lenny

Das hier verwendete Präfix »/files« wird von Augeas verwendet, um Konfigurationsdateien zu kennzeichnen, es hat nichts mit der Libguestfs zu tun.

Kein Stiefkind

Libguestfs bringt auch guten Support für Windows mit. Genauso wie Linux-Gäste lassen sich Windows-Gäste mounten und untersuchen.

$ guestfish --ro -i Windows7x32
><fs> ls /Windows/System32/drivers | head -2
1394bus.sys
1394ohci.sys

Abbildung 2 zeigt, wie sich mit dem Tool »virt-win-reg« sogar Registry-Einträge bearbeiten lassen.

Abbildung 2: Zugriff auf die Windows-Registry mit virt-win-reg.

Sein volles Potenzial entfaltet Guestfish, wenn man es in eigenen Skripts einsetzt. So klont das Skript in Listing 7 eine virtuelle Maschine. Die folgenden Zeilen verwenden das Skript, um von einem Template eine neue VM zu klonen und dann die Konfiguration zu verändern:

Listing 7

Cloning VMs

 

# cd /var/lib/libvirt/images
# /tmp/clone.sh oldguest newguest 192.168.1.1newguest.example.com
# virt-install --import --file newguest

Auf diese Art kann jeder Administrator auch ohne GUI recht unkompliziert Management-Skripts für virtuelle Umgebungen schreiben.

Ähnliche Artikel

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023