Erstellen Sie eine AWS HVM Linux-AMI aus einer vorhandenen paravirtuellen Linux-AMI

38

Ist es möglich, eine HVM-AMI (Hardware Virtual Machine) aus einer vorhandenen PV-AMI (Paravirtual AMI) zu erstellen?

Mein erster Gedanke war, eine neue PV-Instanz zu starten und mit dem ec2-create-imageBefehl ein neues Image zu erstellen, während HVM als Virutalisierungstyp angegeben wurde. Verfügt ec2-create-imagejedoch über keinen Befehlszeilenparameter zum Angeben des Virtualisierungstyps.

Gibt es einen anderen Weg, dies zu tun?

javacavaj
quelle

Antworten:

22

Aktualisieren

AWS hat diese Funktion in der EC2-API aktiviert. Es ist als --virtualization-typeOption für aws ec2 register-imagedie neue Boto-basierte awscli verfügbar.

Ursprüngliche Antwort

Ja! Leider gibt es dafür keinen direkten Weg. Einige PV-Instanzen benötigen möglicherweise auch Änderungen am Kernel und am Bootloader.

  1. Erstellen Sie ein Volume aus Ihrem vorhandenen PV AMI. Wenn es Ihr eigener PV-AMI war, können Sie aus dem Schnappschuss ein Volume erstellen. Wenn es sich um ein AMI eines Drittanbieters handelt, müssen Sie eine Instanz starten und einen Snapshot erstellen.
  2. Starten Sie eine HVM-Instanz mit einem beliebigen AMI.
  3. Stoppen Sie diese HVM-Instanz.
  4. Trennen Sie das Root-Volume von dieser Instanz.
  5. Hängen Sie das PV-Volume als Root-Volume (/ dev / sda1 oder / dev / sda, falls es partitioniert wurde) an die HVM-Instanz an.
  6. Führen Sie ec2-create-imagedie HVM-Instanz aus.
  7. Starten Sie andere Instanzen mit Ihrem neuen HVM AMI.

Wenn dies nicht funktioniert, müssen Sie vor Schritt 5 dieses Volume an eine laufende Instanz anhängen, eine Chroot-Instanz einrichten und einen Kernel und einen Bootloader für Ihre Distribution installieren. Möglicherweise möchten Sie auch die Protokolle und den Cloud-Init-Cache löschen.

Jeff Strunk
quelle
2
Ich habe die Schritte 1 bis 5 ausprobiert und es hat bei mir nicht funktioniert, da die Instanz nach einigen Sekunden angehalten wird. Könnte jemand genauer erläutern, wie ein Chroot eingerichtet und ein Kernel und ein Bootloader installiert werden? Sowohl die alte als auch die neue Instanz sind AMI Linux. Vielen Dank.
Tolgamorf
Wenn Sie über eine funktionierende PV-Instanz verfügen, können Sie diese in HVM konvertieren, indem Sie aws ec2 register-imageim Snapshot des PV-Images das Flag --virtualization-type ausführen. Siehe aws ec2 register-image helpfür weitere Einzelheiten.
Jeff Strunk
2
Ich habe mit ein HVM-Image von meiner PV-Instanz erstellt aws ec2 register-image. Dann habe ich eine neue HVM-Instanz von diesem Image gestartet. Das System bootet jedoch nicht.
Tolgamorf
Nach dem Durchstöbern des aws ec2-Forums habe ich eine Lösung gefunden, bei der die Konvertierung durch manuelles Ersetzen der Dateien erfolgt. Ich werde in Kürze eine Antwort schreiben.
Tolgamorf
@tolgamorf erinnerst du dich an alles was du getan hast? Ich habe das gleiche Problem.
Dmitry Minkovsky
13

In meinem Fall musste ich die Konvertierung manuell durchführen, da die von mir erstellte Instanz aws ec2 register-imagenicht gebootet wurde. Meine Lösung basiert auf diesem Beitrag im AWS EC2-Forum .

Vorbereitung

Stellen Sie sicher, dass sich alle Volumes in derselben Verfügbarkeitszone befinden.

  1. SSH auf Ihre PV-Maschine, von der Sie migrieren möchten, und Anwenden aller Updates. Melden Sie sich dann ab.

  2. Rufen Sie die AWS-Konsole auf und starten Sie eine neue HVM-Instanz, indem Sie dieselbe Basis-AMI auswählen, mit der die PV-Anlage erstellt wurde (in meinem Fall die 64-Bit-Linux-AMI von Amazon).

  3. Stellen Sie für diese neue Instanz eine SSH-Verbindung her, und wenden Sie alle Updates an. Melden Sie sich dann ab.

  4. Gehen Sie zur AWS-Konsole und stoppen Sie die PV-Instanz. Erstellen Sie einen Snapshot des Root-Geräts und erstellen Sie SOURCE VOLUMEaus diesem Snapshot ein neues Volume ( ).

  5. Stoppen Sie die HVM-Instanz. Erstellen Sie einen Snapshot des Root-Geräts auf der neuen Instanz und erstellen Sie TARGET VOLUMEaus diesem Snapshot ein neues Volume ( ).

  6. Verwenden der AWS-Konsole:

    • SOURCE VOLUMEAn die neue Instanz anhängen als /dev/xvdf.
    • TARGET VOLUMEAn die neue Instanz anhängen als /dev/xvdg.

Umwandlungsprozess

  1. SSH auf die neue Instanz und Root-Zugriff erhalten:

    sudo su
    
  2. Hängen Sie die Quell- und Ziellaufwerke ein.

    mkdir -p /mnt/source && mount /dev/xvdf /mnt/source
    mkdir -p /mnt/target && mount /dev/xvdg1 /mnt/target
    

    In meinem Fall waren die Geräte /dev/xvdf(Quelle) und /dev/xvdg1(Ziel). Diese können sich in Ihrer Konfiguration basierend auf der Anzahl der Partitionen und der Position, an der Sie sie angehängt haben, ändern (siehe Schritt 6 in Vorbereitung). Verwenden Sie ls -al /dev/xvd*, um die Laufwerke zu sehen.

  3. Backup /lib/modules/*(Wenn der Kernel des PV ami vom neuen HVM-Rechner abweicht. Dieses Modul wird von einigen Diensten von AWS verwendet.)

  4. Löschen Sie alles außer /bootauf dem Zieldatenträger:

    cd /mnt/target && ls | grep -v boot | xargs rm -Rf
    
  5. Löschen Sie /bootauf dem Quellvolume:

    rm -Rf /mnt/source/boot
    
  6. Kopieren Sie die Daten des Quellvolumes auf das Zielvolume, wobei alle Attribute erhalten bleiben:

    rsync -aAXHPv /mnt/source/ /mnt/target
    
  7. Bearbeiten /mnt/target/etc/fstabfür die /Partition, so dass es die Referenzen , TARGET VOLUMEwenn auf seinem endgültigen Standort in Schritt (8) montiert. Entweder mit einem Etikett oder einfach so:

    /dev/xvda1 /     ext4    defaults,barrier=0 1 1
    

Dann wieder herstellen , /lib/modules/die in Schritt 3 wurde gesichert (Wenn der Kern des PV ami unterscheidet sich von der neuen HVM - Maschine.)

  1. Stoppen Sie das System und trennen Sie alle Volumes über die AWS-Konsole. Hängen Sie die TARGET VOLUMEauf der neuen Instanz als /dev/xvda.

    Stellen Sie sicher, dass Sie wissen, wo das ursprüngliche Root-Gerät installiert wurde. In den meisten Fällen sollte es sein /dev/xvda.

  2. Starten Sie Ihre HVM-Instanz. Es sollte nun eine exakte Kopie Ihrer PV-Anlage sein. Wenn alles in Ordnung ist, können Sie jetzt Ihre PV-Instanz und auch löschen SOURCE VOLUME.

Tolgamorf
quelle
1
Warum machst du nicht einfach ein rm -f /bootund cp -a /mnt/source/boot /mnt/target?
Michelem
@Michelem Wenn ich mich richtig erinnere, habe ich das zuerst versucht. Die Maschine bootete nicht.
Tolgamorf
1
@tolgamorf Gibt es eine Möglichkeit, die Antwort zu aktualisieren, um dies widerzuspiegeln?
Dan Tenenbaum
2
Diese Anleitung war sehr hilfreich (und hat bei mir funktioniert !!), aber ich habe einen letzten Vorschlag. Da es in der ursprünglichen Frage darum ging, eine HVM-AMI zu erstellen, lassen Sie diesen Schritt nicht implizit, sondern fügen Sie einen letzten Schritt hinzu, bei dem die Instanz angehalten und eine AMI daraus erstellt wird (und die Instanz dann beendet wird). Außerdem hatte ich genau die gleichen Probleme wie @DanGravell und verwende keinen Magnetspeicher. Dies sind also möglicherweise häufige Fallstricke, die in der Antwort behoben werden könnten.
Dan Tenenbaum
1
Danke vielmals! Das hat mir viel Zeit gespart und den fstab-Teil aufgeräumt, der mich ein bisschen verwirrt hat. Beachten Sie, dass ich in Schritt (4) den Stamm des temporären Volumes und nicht die Ziele gelöscht habe, wodurch dieses Volume zerstört wurde und der Prozess neu gestartet werden musste.
Zar
10

TLDR:

ec2-register -a x86_64 -d '3.15.7-200.fc20.x86_64' -n 'Fedora_20_HVM_AMI'  --sriov simple --virtualization-type hvm -s snap-b44feb18 --root-device-name /dev/sda1 

Detaillierte Schritte:

Weitere Antworten auf der Grundlage von Jeff Strunks Antwort zur Vereinfachung der Schritte und ein paar Details zum Bild des ec2-Registers:

  1. Instanz mit PV Image erstellen. Nehmen Sie die gewünschten Änderungen vor bzw. aktualisieren Sie sie.

  2. Erstellen Sie ein Image aus der obigen Instanz.

  3. Suchen Sie unter EC2> Elastic Block Store> Snapshot in EC2 Console nach der von der obigen AMI verwendeten Snapshot-ID.

    oder wenn du das ec2 api tools setup hast:

    ec2-describe-images ami-id_of_above_created_ami

    und finde die Schnappschuss-ID für den Ami

    .. Annahmen für weitere Schritte: Ihre ec2-Schlüssel und API-Tools sind festgelegt und einsatzbereit:

  4. Registrieren Sie eine neue HVM-AMI mithilfe des obigen Schnappschusses: Beispiel:

ec2-register -a x86_64 -d '3.15.7-200.fc20.x86_64' -n 'Fedora_20_HVM_AMI' --sriov simple --virtualization-type hvm -s snap-b44feb18 --root-device-name / dev / sda1

woher

  • -d ist eine AMI-Beschreibung
  • -n ist AMI Name
  • -s ist die Schnappschuss-ID aus Schritt 3.
  • -a ist Architektur
  • --Virtualisierungstyp ist erforderlich, damit es hvm wird
  • --sriov ist für die Aktivierung eines erweiterten Netzwerks vorgesehen, obwohl es redundant sein kann, aber nicht sicher ist.

Für mehr Informationen:

Anshu Prateek
quelle
2
Wenn ich nichts falsch mache, funktioniert dies nicht für Marktplatz-AMIs, die Instanztypen einschränken. Versuchte, das offizielle paravirtuelle AMI von MongoDB in HVM zu konvertieren, und obwohl ich das HVM-AMI erstellen konnte, würde es keine HVM-Instanz damit starten.
Matt Beckman
@MattBeckman Ich denke, es geht eher um die zugrunde liegende Kernel- / Bootloader-Unterstützung als um die AMI-Einschränkung. Oben funktioniert für Fedora, aber nicht für Amazon Linux. Dort muss man den von Jeff Strunk vorgeschlagenen Weg gehen.
Anshu Prateek
1
Es funktionierte @AnshuPrateek
Atmesh Mishra
2

Sie können dies über die AWS-Weboberfläche tun. Navigieren Sie zu Schnappschüssen , klicken Sie auf den gewünschten Schnappschuss, den Sie in hvm konvertieren möchten, klicken Sie auf Aktionen und erstellen Sie dann ein Bild . Wählen Sie im Dropdown-Menü des Assistenten zum Erstellen von Images die Option HVM aus .

Justin
quelle
9
Ich habe es gerade versucht, aber es scheint, als würde die Instanz nicht richtig booten. Es wird nur wenige Momente nachdem ich es gestartet habe, von selbst in den gestoppten Zustand versetzt.
Ovi
1

Nachdem ich alle Vorschläge ausprobiert hatte, von denen keiner für mich funktionierte, fand ich unter https://www.opswat.com/blog/aws-2015-why-you-need-switch- einen ausgezeichneten Blogeintrag zu diesem Thema. pv-hvm .

Die Elemente (Details) des Verfahrens sind:

  1. Installation grubauf der zu migrierenden PV-Instanz (Quellinstanz).

  2. Erstellen Sie vorsorglich einen Snapshot des Root-Volumes auf der Quellinstanz (Quell-Volume, SV).

  3. Erstellen Sie eine temporäre HVM-Instanz, die das Volume migriert.

    1. Ich habe eine Amazon Linux-Instanz verwendet
  4. Erstellen Sie ein Zielvolume (DV) und hängen Sie dieses und das SV an die temporäre Instanz an.

    1. Der DV sollte mindestens so groß sein wie der SV.

    2. Schließen Sie den SV als /dev/{sd,xvd}fund den DV als an /dev/{sd,xvd}g.

    3. Partitionieren Sie die DV:

    parted /dev/xvdg --script 'mklabel msdos mkpart primary 1M -1s print quit'

    partprobe /dev/xvdg

    udevadm settle

  5. Ändern Sie die Größe des SV-FS ddauf die Mindestgröße und übertragen Sie das Bild auf den DV.

    1. Reinigen Sie den FS des Quellvolumes: e2fsck -f /dev/xvdf

    2. Minimieren Sie dasselbe: resize2fs -M /dev/xvdf

    3. Beobachten Sie die Ausgabe von resize2fs (z. B. Resizing the file system on /dev/xvdf to 269020 (4k) blocks) und notieren Sie sie für den nächsten Schritt.

    4. Dupliziere SV nach DV: dd if=/dev/xvdf of=/dev/xvdg1 bs=<block size from previous step, here 4k> count=<use block count from last step, here 269020>

    5. Erweitern Sie den FS auf der neuen Partition: resize2fs /dev/xvdg1

  6. grubIn den Bootblock des DV installieren

    1. Erstellen Sie vorübergehend Gerätedateien auf dem DV: mount /dev/xvdg1 /mnt; cp -a /dev/xvdg /dev/xvdg1 /mnt/dev/

    2. Installieren Sie Grub-Dateien:

    rm -f /mnt/boot/grub/*stage*

    cp /mnt/usr/*/grub/*/*stage* /mnt/boot/grub/

    rm -f /mnt/boot/grub/device.map

    1. Installieren Sie grub in einer Chroot-Umgebung:

    cat << ARNIE | chroot /mnt grub --batch

    device (hd0) /dev/xvdg

    root (hd0,0)

    setup (hd0)

    ARNIE

  7. Nachdem Sie weitere geringfügige Änderungen am Zieldatenträger vorgenommen haben, rasten Sie den Datenträger ein und erstellen Sie daraus einen AMI.

    1. Bereinigen Sie die temporären Gerätedateien: rm -f /mnt/dev/xvdg /mnt/dev/xvdg1

    2. In /mnt/boot/grub/grub.conf, ändern root (hd0)zu root (hd0,0), fügen Sie (oder ersetzen console=*) console=ttyS0auf Kernel - Zeile und bei Bedarf ersetzen root=*mit root=LABEL=/der Kernel - Zeile

    3. Stellen Sie /mnt/etc/fstabsicher, dass die Zeile des Root-FS eine beschriftete Referenz enthält, z

    LABEL=/ / ext4 defaults,noatime 1 1

    1. Beschriften Sie den neuen Root-FS mit e2label /dev/xvdg1 /

    2. Hängen Sie DV von der temporären Instanz aus, und trennen Sie sowohl SV als auch DV von der temporären Instanz.

    3. Schnapp die DV und erstelle daraus ein AMI-Image.

  8. Starten Sie eine HVM-Instanz von diesem HMI aus. Das ist Ihre migrierte Instanz.

MadHatter unterstützt Monica
quelle