Abbilder ändern¶
Sobald Sie ein virtuelles Maschinenbild erhalten haben, können Sie einige Änderungen vor dem Hochladen in den Image-Service vornehmen. Hier beschreiben wir mehrere Werkzeuge, die Ihnen erlauben, Abbilder zu ändern.
Warnung
Versuchen Sie nicht, diese Werkzeuge zu verwenden, um ein Abbild zu ändern, das an eine laufende virtuelle Maschine angehängt ist. Diese Werkzeuge sind nur dazu bestimmt, die momentan laufenden Abbilder zu modifizieren.
guestfish¶
Das guestfish
Programm ist ein Werkzeug aus den `libguestfs <http://libguestfs.org/> `_ Projekt, das Ihnen erlaubt, die Dateien innerhalb eines virtuellen Maschinenbildes zu ändern.
Bemerkung
guestfish
platziert das Abbild nicht direkt in das lokale Dateisystem. Stattdessen bietet es Ihnen eine Shell-Schnittstelle, mit der Sie Dateien anzeigen, bearbeiten und löschen können. Viele von guestfish Befehle, wie zB touch,:command:chmod und :command:` rm`, ähneln traditionellen bash-Befehlen.
Beispiel guestfish session¶
Manchmal müssen Sie ein virtuelles Maschinenbild ändern, um alle Spuren der MAC-Adresse zu entfernen, die der virtuellen Netzwerkschnittstellenkarte zugewiesen wurde, als das Abbild zuerst erstellt wurde. Dies ist, weil die MAC-Adresse anders ist, wenn die virtuellen Maschine Abbilder bootet. In diesem Beispiel wird gezeigt, wie Sie den guestfish
verwenden, um Verweise auf die alte MAC-Adresse zu entfernen, indem Sie die Datei /etc/udev/rules.d/70-persistent-net.rules` löschen und die ``HWADDR
Zeile aus der /etc/sysconfig/network-scripts/ifcfg-eth0
Datei entfernen.
Angenommen, Sie haben ein CentOS qcow2 Abbild namens `` centos63_desktop.img``. Montieren das Abbild im Read-Write-Modus als root, wie folgt:
# guestfish --rw -a centos63_desktop.img
Welcome to guestfish, the libguestfs filesystem interactive shell for
editing virtual machine filesystems.
Type: 'help' for help on commands
'man' to read the manual
'quit' to quit the shell
><fs>
Hier beginnt eine Gastfisch-Session.
Bemerkung
Der guestfish sieht wie ein Fisch aus: ><fs>
.
Wir müssen zuerst den run Befehl an der guestfish-Aufforderung verwenden, bevor wir etwas anderes tun können. Dies wird eine virtuelle Maschine starten, mit der alle Dateiverwaltungen ausgeführt werden.
><fs> run
Wir können nun die Dateisysteme im Abbild mit dem Befehl list-filesystems ansehen:
><fs> list-filesystems /dev/vda1: ext4 /dev/vg_centosbase/lv_root: ext4 /dev/vg_centosbase/lv_swap: swap
Wir müssen das logische Volume anbringen, das die Root-Partition enthält:
><fs> mount /dev/vg_centosbase/lv_root /
Als nächstes wollen wir eine Datei löschen. Wir können den rm guestfish Befehl verwenden, der genauso funktioniert wie es in einer traditionellen Shell funktioniert.
><fs> rm /etc/udev/rules.d/70-persistent-net.rules
Wir wollen die
ifcfg-eth0
Datei bearbeiten, um dieHWADDR
Zeile zu entfernen. Der Befehl edit wird die Datei auf den Host kopieren, den Editor aufrufen und dann die Datei wieder kopieren.><fs> edit /etc/sysconfig/network-scripts/ifcfg-eth0
Wenn Sie dieses Abbild ändern möchten, um den 8021q-Kernel zum Booten zu laden, müssen Sie ein ausführbares Skript im Verzeichnis
/etc/sysconfig/modules/
erstellen. Sie können den Befehl touch guestfish verwenden, um eine leere Datei zu erstellen, den Befehl edit, um ihn zu bearbeiten, und den Befehl chmod, um ihn ausführbar zu machen.><fs> touch /etc/sysconfig/modules/8021q.modules ><fs> edit /etc/sysconfig/modules/8021q.modules
Wir fügen der folgenden Datei die folgende Zeile hinzu und speichern sie:
modprobe 8021q
Dann setzen wir auf ausführbar:
><fs> chmod 0755 /etc/sysconfig/modules/8021q.modules
Wir sind fertig, also können wir mit dem Befehl :command: exit beenden:
><fs> exit
Gehen Sie weiter mit guestfish¶
Es gibt eine enorme Menge an Funktionalität in guestfish und eine vollständige Behandlung geht über den Rahmen dieses Dokuments hinaus. Stattdessen empfehlen wir Ihnen, die `guestfs-rezepte zu lesen <http://libguestfs.org/guestfs-recipes.1.html> `_ Dokumentations-Seite für eine Vorstellung, was mit diesen Werkzeugen möglich ist.
guestmount¶
Für einige Arten von Änderungen, ist es einfacher, das Abbild-Dateisystem direkt in den Gast zu montieren. Das guestmount
Programm, auch aus dem libguestfs Projekt, ermöglicht es Ihnen, dies zu tun.
Um beispielsweise die Root-Partition von unserem
centos63_desktop.qcow2
-Abbild auf/mnt
zu bringen, können wir:# guestmount -a centos63_desktop.qcow2 -m /dev/vg_centosbase/lv_root --rw /mnt
Wenn wir im voraus nicht wussten, was der Einstieg in den Gast ist, könnten wir die
-i
(Inspektion) -Flag verwenden, damit guestmount automatisch sagt, welcher Mountpunkt zu verwenden ist:# guestmount -a centos63_desktop.qcow2 -i --rw /mnt
Einmal montiert, könnten wir Dinge tun wie Liste der installierten Pakete mit rpm:
# rpm -qa --dbpath /mnt/var/lib/rpm
Sobald wir fertig sind,
# umount /mnt
virt-* Werkzeuge¶
Das `libguestfs <http://libguestfs.org/> `_ Projekt hat eine Reihe von anderen nützlichen Tools, einschließlich:
virt-edit <http://libguestfs.org/virt-edit.1.html> `_ zum Bearbeiten einer Datei innerhalb eines Abbildes.
`virt-df <http://libguestfs.org/virt-df.1.html> `_ zum Anzeigen von freiem Speicherplatz innerhalb eines Abbildes.
virt-resize <http://libguestfs.org/virt-resize.1.html> `_ zur Größenänderung eines Abbildes.
`virt-sysprep <http://libguestfs.org/virt-sysprep.1.html> `_ für die Vorbereitung eines Abbildes für die Verteilung (z. B. löschen SSH-Host-Schlüssel, entfernen MAC-Adresse info, oder entfernen Sie Benutzerkonten).
virtu-sparsify für ein Abbild sparsam zu halten
`virt-p2v <http://libguestfs.org/virt-v2v/> `_ für die Umwandlung eines physischen Rechners in ein Abbild, das auf KVM läuft.
virt-v2v für die Umwandlung von Xen und VMware Abbildern in KVM Abbilder.
Ändern Sie eine einzelne Datei innerhalb eines Abbildes¶
Dieses Beispiel zeigt, wie man virt-edit verwendet, um eine Datei zu ändern. Der Befehl kann entweder einen Dateinamen als Argument mit dem -a
-Flag oder einen Domain-Namen als Argument mit dem -d
-Flag enthalten. Die folgenden Beispiele zeigen, wie man die Datei /etc/shadow
in der Instanz mit dem libvirt Domainnamen instance-000000e1
, der gerade läuft,
# virsh shutdown instance-000000e1
# virt-edit -d instance-000000e1 /etc/shadow
# virsh start instance-000000e1
Größe eines Abbildes ändern¶
Hier ist ein Beispiel für die Verwendung virt-resize zur Größenänderung eines Abbildes. Angenommen, wir haben ein 16 GB Windows-Image im qcow2-Format, das wir auf 50 GB ändern möchten.
Zuerst verwenden wir virt-filesystems, um die Partitionen zu identifizieren:
# virt-filesystems --long --parts --blkdevs -h -a /data/images/win2012.qcow2 Name Type MBR Size Parent /dev/sda1 partition 07 350M /dev/sda /dev/sda2 partition 07 16G /dev/sda /dev/sda device - 16G -
In diesem Fall ist es die
/dev/sda2
-Partition, die wir ändern möchten. Wir erstellen ein neues qcow2-Abbild und verwenden den Befehl virt-resize, um eine veränderte Kopie des Originals in das neue Abbild zu schreiben:# qemu-img create -f qcow2 /data/images/win2012-50gb.qcow2 50G # virt-resize --expand /dev/sda2 /data/images/win2012.qcow2 \ /data/images/win2012-50gb.qcow2 Examining /data/images/win2012.qcow2 ... ********** Summary of changes: /dev/sda1: This partition will be left alone. /dev/sda2: This partition will be resized from 15.7G to 49.7G. The filesystem ntfs on /dev/sda2 will be expanded using the 'ntfsresize' method. ********** Setting up initial partition table on /data/images/win2012-50gb.qcow2 ... Copying /dev/sda1 ... 100% [ ] 00:00 Copying /dev/sda2 ... 100% [ ] 00:00 Expanding /dev/sda2 using the 'ntfsresize' method ... Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly.
Loop-Geräte, kpartx, Netzwerk-Block-Geräte¶
Wenn Sie keinen Zugriff auf die libguestfs haben, können Sie Abbilddateisysteme direkt im Host über Loop-Geräte, kpartx und Netzwerk-Block-Geräte montieren.
Warnung
Die Installation von nicht vertrauenswürdigen Gastbildern mit den in diesem Abschnitt beschriebenen Werkzeugen ist ein Sicherheitsrisiko, verwenden Sie immer libguestfs-Tools wie guestfish und guestmount, wenn Sie Zugang zu ihnen haben. Siehe `Eine Erinnerung, warum sollten Sie nie Gast-Festplatten-Abbilder auf dem Host-Betriebssystem montieren<https://www.berrange.com/posts/2013/02/20/ a-reminder-why-you-should-never-mount-guest-disk-images-on-the-host-os/> `_von Daniel Berrangé für weitere Details.
Ein Raw-Abbild (ohne LVM)¶
Wenn Sie ein raw virtuelles Maschinenabbild haben, das LVM nicht verwendet, um seine Partitionen zu verwalten, verwenden Sie den Befehl losetup, um ein unbenutztes Loop-Gerät zu finden.
# losetup -f
/dev/loop0
In diesem Beispiel ist /dev/loop0
frei. Verknüpfen Sie ein Loop-Gerät mit dem Raw-Abbild:
# losetup /dev/loop0 fedora17.img
Wenn das Abbild nur eine einzelne Partition hat, können Sie das Loop-Gerät direkt anbringen:
# mount /dev/loop0 /mnt
Wenn das Abbild mehrere Partitionen hat, verwenden Sie kpartx, um die Partitionen als separate Geräte freizugeben (z. B.` /dev/mapper/loop0p1`) und dann die Partition, die dem Root-Dateisystem entspricht,
# kpartx -av /dev/loop0
Wenn das Abbild sagen wir drei Partitionen (/boot, /, swap) hat, sollte es ein neues Gerät pro Partition erstellt werden:
$ ls -l /dev/mapper/loop0p*
brw-rw---- 1 root disk 43, 49 2012-03-05 15:32 /dev/mapper/loop0p1
brw-rw---- 1 root disk 43, 50 2012-03-05 15:32 /dev/mapper/loop0p2
brw-rw---- 1 root disk 43, 51 2012-03-05 15:32 /dev/mapper/loop0p3
Um die zweite Partition als root zu installieren:
# mkdir /mnt/image
# mount /dev/mapper/loop0p2 /mnt/image
Sobald Sie fertig sind um aufzuräumen:
# umount /mnt/image
# rmdir /mnt/image
# kpartx -d /dev/loop0
# losetup -d /dev/loop0
Ein Raw Abbild (mit LVM)¶
Wenn Ihre Partitionen mit LVM verwaltet werden, verwenden Sie :command: losetup und :command:` kpartx` Befehle wie im vorherigen Beispiel, um die Partitionen dem Host auszusetzen.
# losetup -f
/dev/loop0
# losetup /dev/loop0 rhel62.img
# kpartx -av /dev/loop0
Als nächstes müssen Sie den Befehl vgscan verwenden, um die LVM-Volume-Gruppen zu identifizieren und dann den Befehl vgchange, um die Volumes als Geräte freizulegen:
# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vg_rhel62x8664" using metadata type lvm2
# vgchange -ay
2 logical volume(s) in volume group "vg_rhel62x8664" now active
# mount /dev/vg_rhel62x8664/lv_root /mnt
Aufräumen wenn Sie fertig sind:
# umount /mnt
# vgchange -an vg_rhel62x8664
# kpartx -d /dev/loop0
# losetup -d /dev/loop0
Ein qcow2-Abbild (ohne LVM)¶
Du brauchst das geladene nbd
(network block device) Kernelmodul, um qcow2 Abbilder zu mounten. Dies lädt es mit Unterstützung für 16 Block-Geräte, was für unsere Zwecke gut ist. Als root:
# modprobe nbd max_part=16
Angenommen, das erste Blockgerät (/dev/nbd0
) ist derzeit nicht benutzt, können wir die Festplattenpartitionen mit dem qemu-nbd und partprobe-Befehle aufsetzen. Als root:
# qemu-nbd -c /dev/nbd0 image.qcow2
# partprobe /dev/nbd0
Wenn das Abbild sagen wir drei Partitionen (/boot, /, swap) hat, sollte es ein neues Gerät für jede Partition erstellt werden:
$ ls -l /dev/nbd0*
brw-rw---- 1 root disk 43, 48 2012-03-05 15:32 /dev/nbd0
brw-rw---- 1 root disk 43, 49 2012-03-05 15:32 /dev/nbd0p1
brw-rw---- 1 root disk 43, 50 2012-03-05 15:32 /dev/nbd0p2
brw-rw---- 1 root disk 43, 51 2012-03-05 15:32 /dev/nbd0p3
Bemerkung
If the network block device you selected was already in use,
the initial qemu-nbd command will fail silently, and the
/dev/nbd0p{1,2,3}
device files will not be created.
Wenn die Abbildpartitionen nicht mit LVM verwaltet werden, können sie direkt montiert werden:
# mkdir /mnt/image
# mount /dev/nbd0p2 /mnt/image
Wenn Sie fertig sind, räumen Sie auf:
# umount /mnt/image
# rmdir /mnt/image
# qemu-nbd -d /dev/nbd0
Ein qcow2-Abbild (mit LVM) einbinden¶
Wenn die Abbildpartitionen mit LVM verwaltet werden, verwenden Sie :command: qemu-nbd und partprobe, Sie müssen vgscan und vgchange -ay benutzen, um die LVM-Partitionen als einbindbare Geräte zu erstellen:
# modprobe nbd max_part=16
# qemu-nbd -c /dev/nbd0 image.qcow2
# partprobe /dev/nbd0
# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vg_rhel62x8664" using metadata type lvm2
# vgchange -ay
2 logical volume(s) in volume group "vg_rhel62x8664" now active
# mount /dev/vg_rhel62x8664/lv_root /mnt
Wenn Sie fertig sind, räumen Sie auf:
# umount /mnt
# vgchange -an vg_rhel62x8664
# qemu-nbd -d /dev/nbd0