
Ist es möglich, aus einem vorhandenen paravirtuell basierten AMI (PV) eine Hardware-Virtual-Machine (HVM) zu erstellen?
Mein erster Gedanke war, eine neue PV-Instanz zu starten und den ec2-create-image
Befehl zum Erstellen eines neuen Images zu verwenden, während ich HVM als Virtualisierungstyp angebe. ec2-create-image
Es gibt jedoch keinen Befehlszeilenparameter zum Angeben des Virtualisierungstyps.
Gibt es eine andere Möglichkeit, dies zu tun?
Antwort1
Aktualisieren
AWS hat diese Funktion in der EC2-API aktiviert. Sie ist als --virtualization-type
Option verfügbar, umaws ec2 register-image
im neuen Boto-basierten awscli.
Ursprüngliche Antwort
Ja! Leider gibt es dafür keinen direkten Weg. Außerdem können bei einigen PV-Instanzen Kernel- und Bootloader-Änderungen erforderlich sein.
- Erstellen Sie ein Volume aus Ihrem vorhandenen PV AMI. Wenn es Ihr eigenes PV AMI war, können Sie aus dem Snapshot ein Volume erstellen. Wenn es ein AMI eines Drittanbieters ist, müssen Sie eine Instanz starten und einen Snapshot erstellen.
- Starten Sie eine HVM-Instanz mit einem beliebigen AMI.
- Stoppen Sie diese HVM-Instanz.
- Trennen Sie das Stammvolume von dieser Instanz.
- Fügen Sie das PV-Volume als Stammvolume (/dev/sda1 oder /dev/sda, wenn es partitioniert wurde) zur HVM-Instanz hinzu.
- Auf der HVM-Instanz ausführen
ec2-create-image
. - Starten Sie andere Instanzen mit Ihrem neuen HVM AMI.
Wenn das nicht funktioniert, müssen Sie vor Schritt 5 dieses Volume an eine laufende Instanz anhängen, ein Chroot einrichten und einen Kernel und einen Bootloader für Ihre Distribution installieren. Möglicherweise möchten Sie auch Protokolle und den gesamten Cloud-Init-Cache löschen.
Antwort2
In meinem Fall musste ich die Konvertierung manuell durchführen, da die von mir erstellte Instanz aws ec2 register-image
nicht bootete. Meine Lösung basiert aufdieser Beitragauf derAWS EC2 Forum.
Vorbereitung
Stellen Sie sicher, dass sich alle Volumes in derselben Verfügbarkeitszone befinden.
Stellen Sie per SSH eine Verbindung zu der PV-Maschine her, von der Sie migrieren möchten, und wenden Sie alle Aktualisierungen an. Melden Sie sich anschließend ab.
Gehen Sie zur AWS-Konsole und starten Sie eine neue HVM-Instanz, indem Sie dasselbe Basis-AMI auswählen, aus dem das PV-System erstellt wurde (in meinem Fall das 64-Bit-Linux-AMI von Amazon).
Stellen Sie per SSH eine Verbindung zu dieser neuen Instanz her, wenden Sie alle Aktualisierungen an und melden Sie sich anschließend ab.
Gehen Sie zur AWS-Konsole und stoppen Sie die PV-Instanz. Machen Sie einen Snapshot des Root-Geräts und erstellen Sie
SOURCE VOLUME
aus diesem Snapshot ein neues Volume ( ).Stoppen Sie die HVM-Instanz. Erstellen Sie einen Snapshot des Root-Geräts auf der neuen Instanz und erstellen Sie
TARGET VOLUME
aus diesem Snapshot ein neues Volume ( ). Starten Sie die (neue) HVM-Instanz erneut.Verwenden der AWS-Konsole:
SOURCE VOLUME
An die neue Instanz anhängen als/dev/xvdf
.TARGET VOLUME
An die neue Instanz anhängen als/dev/xvdg
.
Umwandlungsprozess
Stellen Sie per SSH eine Verbindung zur neuen Instanz her und erhalten Sie Root-Zugriff:
sudo su
Mounten Sie die Quell- und Ziellaufwerke.
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 je nach Anzahl der Partitionen und der Stelle, an der Sie sie angeschlossen haben, ändern (siehe Schritt 6 in Vorbereitung). Verwenden Sie ,ls -al /dev/xvd*
um die Laufwerke anzuzeigen.Backup
/lib/modules/*
(Wenn sich der Kernel des PV-AMI vom neuen HVM-Rechner unterscheidet. Dieses Modul wird von einigen AWS-Diensten verwendet.)Löschen Sie alles außer
/boot
dem Zielvolume:cd /mnt/target && ls | grep -v boot | xargs rm -Rf
/boot
Auf dem Quellvolume löschen :rm -Rf /mnt/source/boot
Kopieren Sie die Daten des Quellvolumes unter Beibehaltung aller Attribute auf das Zielvolume:
rsync -aAXHPv /mnt/source/ /mnt/target
Bearbeiten Sie
/mnt/target/etc/fstab
die/
Partition so, dass sieTARGET VOLUME
beim Einhängen an ihren endgültigen Speicherort in Schritt (8) auf die Partition verweist. Verwenden Sie dazu entweder ein Label oder einfach etwas in der Art:/dev/xvda1 / ext4 defaults,barrier=0 1 1
Stellen Sie dann /lib/modules/
das in Schritt 3 gesicherte System wieder her. (Wenn sich der Kernel des PV-AMI vom Kernel der neuen HVM-Maschine unterscheidet.)
Stoppen Sie das System und trennen Sie alle Volumes mithilfe der AWS-Konsole. Hängen Sie das
TARGET VOLUME
an die neue Instanz als an/dev/xvda
.Notieren Sie sich unbedingt, wo das ursprüngliche Root-Gerät gemountet wurde. In den meisten Fällen sollte dies der Fall sein
/dev/xvda
.Starten Sie Ihre HVM-Instanz. Sie sollte jetzt eine exakte Kopie Ihres PV-Systems sein. Wenn alles in Ordnung ist, können Sie jetzt Ihre PV-Instanz löschen und auch
SOURCE VOLUME
.
Antwort3
Kurz zusammengefasst:
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 basierend aufJeff Strunks Antwortum die Schritte zu vereinfachen und ein paar mehr Details zum EC2-Registerabbild zu geben:
Erstellen Sie eine Instanz mit PV Image. Nehmen Sie alle gewünschten Änderungen vor bzw. aktualisieren Sie sie.
Erstellen Sie ein Image aus der obigen Instanz.
Suchen Sie die vom obigen AMI verwendete Snapshot-ID unter EC2 > Elastic Block Store > Snapshot in der EC2-Konsole.
oder wenn Sie die EC2-API-Tools eingerichtet haben:
ec2-describe-images ami-id_des_oben_erstellten_ami
und finde die Snapshot-ID für den AMI
.. Annahmen für weitere Schritte: Ihre EC2-Schlüssel und API-Tools sind festgelegt und einsatzbereit:
Registrieren Sie ein neues HVM AMI mit dem obigen Snapshot: Beispiel:
ec2-register -a x86_64 -d '3.15.7-200.fc20.x86_64' -n 'Fedora_20_HVM_AMI' --sriov einfach --virtualisierungstyp hvm -s snap-b44feb18 --root-gerätename /dev/sda1
Wo
- -d ist die AMI-Beschreibung
- -n ist der AMI-Name
- -s ist die Snapshot-ID aus Schritt 3.
- -a ist Architektur
- --virtualization-type ist erforderlich, um es zu hvm zu machen
- --sriov dient zum Aktivieren der erweiterten Netzwerkfunktion, ist aber möglicherweise überflüssig, ich bin nicht sicher.
Für mehr Informationen:
Antwort4
Nachdem ich alle hier aufgeführten Vorschläge ausprobiert hatte, von denen keiner für mich funktionierte, fand ich einen ausgezeichneten Blogeintrag zu diesem Thema unterhttps://www.opswat.com/blog/aws-2015-why-you-need-switch-pv-hvm.
Die Elemente (Details) des Verfahrens sind:
Installieren Sie es
grub
auf der zu migrierenden PV-Instanz (Quellinstanz).Erstellen Sie vorsorglich einen Snapshot des Root-Volumes auf der Quellinstanz (Quellvolume, SV).
Erstellen Sie eine temporäre HVM-Instanz, die das Volume migriert.
- Ich habe eine Amazon Linux-Instanz verwendet
Erstellen Sie ein Zielvolume (DV) und hängen Sie sowohl dieses als auch das SV an die temporäre Instanz an.
Der DV sollte mindestens so groß sein wie der SV.
Fügen Sie den SV als
/dev/{sd,xvd}f
und den DV als an/dev/{sd,xvd}g
.Partitionieren Sie die Festplatte:
parted /dev/xvdg --script 'mklabel msdos mkpart primary 1M -1s print quit'
partprobe /dev/xvdg
udevadm settle
Passen Sie die FS-Größe des SVs auf die Mindestgröße an und kopieren Sie
dd
es mithilfe des Images auf das DV.Bereinigen Sie das FS des Quellvolumes:
e2fsck -f /dev/xvdf
Minimieren Sie dasselbe:
resize2fs -M /dev/xvdf
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.SV auf DV duplizieren:
dd if=/dev/xvdf of=/dev/xvdg1 bs=<block size from previous step, here 4k> count=<use block count from last step, here 269020>
Erweitern Sie das FS auf der neuen Partition:
resize2fs /dev/xvdg1
grub
In den Bootblock des DV installierenGerätedateien temporär auf dem DV erstellen:
mount /dev/xvdg1 /mnt; cp -a /dev/xvdg /dev/xvdg1 /mnt/dev/
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
- Installieren Sie Grub in einer Chroot-Umgebung:
cat << ARNIE | chroot /mnt grub --batch
device (hd0) /dev/xvdg
root (hd0,0)
setup (hd0)
ARNIE
Nachdem Sie einige andere kleinere Änderungen am Zielvolume vorgenommen haben, erstellen Sie ein Snapshot des Volumes und ein AMI daraus.
Räumen Sie die temporären Gerätedateien auf:
rm -f /mnt/dev/xvdg /mnt/dev/xvdg1
/mnt/boot/grub/grub.conf
Ändern Sie in in , fügen Sie zur Kernelzeile hinzu (oder ersetzen Sie ) und ersetzen Sie beiroot (hd0)
Bedarfroot (hd0,0)
inconsole=*
der Kernelzeile durchconsole=ttyS0
root=*
root=LABEL=/
/mnt/etc/fstab
Stellen Sie sicher, dass die Zeile des Stamm-FS eine beschriftete Referenz enthält, z. B.
LABEL=/ / ext4 defaults,noatime 1 1
Beschriften Sie das neue Stamm-FS mit
e2label /dev/xvdg1 /
Hängen Sie DV von der temporären Instanz ab und trennen Sie sowohl SV als auch DV von der temporären Instanz.
Machen Sie einen Snap des DV und erstellen Sie daraus ein AMI-Image.
Starten Sie eine HVM-Instanz von diesem HMI. Das ist Ihre migrierte Instanz.