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
  1. 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
    
  2. Wir müssen das logische Volume anbringen, das die Root-Partition enthält:

    ><fs> mount /dev/vg_centosbase/lv_root /
    
  3. 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
    
  4. Wir wollen die ifcfg-eth0 Datei bearbeiten, um die HWADDR 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
    
  5. 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
    
  6. Wir fügen der folgenden Datei die folgende Zeile hinzu und speichern sie:

    modprobe 8021q
    
  7. Dann setzen wir auf ausführbar:

    ><fs> chmod 0755 /etc/sysconfig/modules/8021q.modules
    
  8. 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.

  1. 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
    
  2. 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
    
  3. Einmal montiert, könnten wir Dinge tun wie Liste der installierten Pakete mit rpm:

    # rpm -qa --dbpath /mnt/var/lib/rpm
    
  4. Sobald wir fertig sind,

    # umount /mnt
    

virt-* Werkzeuge

Das `libguestfs <http://libguestfs.org/> `_ Projekt hat eine Reihe von anderen nützlichen Tools, einschließlich:

Ä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.

  1. 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   -
    
  2. 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