Est-il possible de créer une AMI de machine virtuelle matérielle (HVM) à partir d'une AMI paravirtuelle (PV) existante.
Ma pensée initiale était de démarrer une nouvelle instance PV et d'utiliser le ec2-create-image
commande pour créer une nouvelle image tout en spécifiant HVM comme type de virutalisation. Cependant, ec2-create-image
n'a pas de paramètre de ligne de commande pour spécifier le type de virtualisation.
Y a-t-il une autre façon de procéder?
AWS a activé cette fonctionnalité dans l'API EC2. Il est disponible en tant que --virtualization-type
option pour aws ec2 register-image
dans le nouvel awscli basé sur Boto.
Oui! Malheureusement, il n'y a pas de moyen direct de le faire. De plus, certaines instances PV peuvent nécessiter des modifications du noyau et du chargeur de démarrage.
ec2-create-image
sur l'instance HVM.Si cela ne fonctionne pas, avant l'étape 5, vous devrez attacher ce volume à une instance en cours d'exécution, configurer un chroot et installer un noyau et un chargeur de démarrage pour votre distribution. Vous pouvez également vouloir effacer les journaux et tout cache d'initialisation cloud.
Dans mon cas, j'ai dû effectuer la conversion manuellement depuis l'instance que je crée à l'aide de aws ec2 register-image
n'a pas démarré. Ma solution est basée sur cet article sur le AWS EC2 Forum .
Assurez-vous que tous les volumes se trouvent dans la même zone de disponibilité.
SSH sur votre machine PV à partir de laquelle vous souhaitez migrer et appliquer toutes les mises à jour, puis déconnectez-vous.
Accédez à la console AWS et lancez une nouvelle instance HVM en sélectionnant la même AMI de base à partir de laquelle le système PV a été créé (dans mon cas, l'AMI Linux 64 bits d'Amazon).
SSH à cette nouvelle instance et appliquer toutes les mises à jour, puis déconnectez-vous.
Accédez à la console AWS et arrêtez l'instance PV. Prenez un instantané du périphérique racine et créez un nouveau volume (SOURCE VOLUME
) à partir de cet instantané.
Arrêtez l'instance HVM. Prenez un instantané du périphérique racine sur la nouvelle instance et créez un nouveau volume (TARGET VOLUME
) à partir de cet instantané.
Utilisation de la console AWS:
SOURCE VOLUME
à la nouvelle instance en tant que /dev/xvdf
.TARGET VOLUME
à la nouvelle instance en tant que /dev/xvdg
.SSH à la nouvelle instance et obtenez un accès root:
Sudo su
Montez les lecteurs source et cible.
mkdir -p /mnt/source && mount /dev/xvdf /mnt/source
mkdir -p /mnt/target && mount /dev/xvdg1 /mnt/target
Dans mon cas, les appareils étaient
/dev/xvdf
(source) et/dev/xvdg1
(cible). Celles-ci peuvent changer dans votre configuration en fonction du nombre de partitions et de l'endroit où vous les avez attachées (voir l'étape 6 de la préparation). Utilisationls -al /dev/xvd*
pour voir les lecteurs.
Sauvegarde /lib/modules/*
(Si le noyau de l'AMI PV diffère de la nouvelle machine HVM. Ce module est utilisé par certains services d'AWS.)
Supprimez tout sauf /boot
sur le volume cible:
cd /mnt/target && ls | grep -v boot | xargs rm -Rf
Supprimer /boot
sur le volume source:
rm -Rf /mnt/source/boot
Copiez les données du volume source sur le volume cible en préservant tous les attributs:
rsync -aAXHPv /mnt/source/ /mnt/target
Éditer /mnt/target/etc/fstab
pour /
partition, afin qu'elle fasse référence à la TARGET VOLUME
lorsqu'il est monté sur son emplacement final à l'étape (8). Soit en utilisant une étiquette ou simplement quelque chose le long:
/dev/xvda1 / ext4 defaults,barrier=0 1 1
Ensuite, restaurez /lib/modules/
qui a été sauvegardé à l'étape 3. (Si le noyau du PV AMI diffère de la nouvelle machine HVM.)
Arrêtez le système et détachez tous les volumes à l'aide de la console AWS. Fixez le TARGET VOLUME
sur la nouvelle instance en tant que /dev/xvda
.
Assurez-vous de noter où le périphérique racine d'origine a été monté. Dans la plupart des cas, il doit être
/dev/xvda
.
Démarrez votre instance HVM. Ce devrait maintenant être un double exact de votre système PV. Si tout semble correct, vous pouvez maintenant supprimer votre instance PV ainsi que SOURCE VOLUME
.
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
Étapes détaillées:
Répondre en fonction de réponse de Jeff Strunk pour simplifier les étapes et donner un peu plus de détails sur l'image du registre ec2:
Créer une instance à l'aide d'une image PV. Apportez/mettez à jour les modifications que vous souhaitez.
Créez une image à partir de l'instance ci-dessus.
Recherchez l'ID d'instantané utilisé par l'AMI ci-dessus sous EC2> Elastic Block Store> Instantané dans la console EC2.
ou si vous avez la configuration des outils api ec2:
ec2-décrire-images AMI-id_of_above_created_AMI
et trouver l'ID d'instantané pour l'AMI
.. Hypothèses pour les étapes suivantes: Vos clés ec2 et vos outils api sont définis et prêts à l'emploi:
Enregistrez une nouvelle AMI HVM en utilisant l'instantané ci-dessus: exemple:
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
où
Pour plus d'informations:
Vous pouvez le faire depuis l'intérieur de l'interface Web AWS. Accédez à instantanés, cliquez sur l'instantané souhaité que vous souhaitez convertir en hvm et cliquez sur actions puis créer une image. Dans la liste déroulante de l'assistant de création d'image, sélectionnez HVM .
Après avoir essayé toutes les suggestions ci-dessous, dont aucune n'a fonctionné pour moi, j'ai trouvé une excellente entrée de blog sur le sujet, à https://www.opswat.com/blog/aws-2015-why-you- need-switch-pv-hvm .
Les éléments (détails) de la procédure sont:
Installez grub
sur l'instance PV à migrer (instance source).
Faites un instantané de précaution du volume racine sur l'instance source (volume source, SV).
Créez une instance HVM temporaire qui fera migrer le volume.
Créez un volume de destination (DV) et associez ce volume et le SV à l'instance temporaire.
Le DV doit être au moins aussi grand que le SV.
Fixez le SV comme /dev/{sd,xvd}f
Et le DV comme /dev/{sd,xvd}g
.
Partitionnez le DV:
parted /dev/xvdg --script 'mklabel msdos mkpart primary 1M -1s print quit'
partprobe /dev/xvdg
udevadm settle
Redimensionnez à la taille minimale le FS du SV et utilisez dd
l'image sur le DV.
Nettoyez le FS du volume source: e2fsck -f /dev/xvdf
Minimisez la même chose: resize2fs -M /dev/xvdf
Observez la sortie de resize2fs (par exemple Resizing the file system on /dev/xvdf to 269020 (4k) blocks
) et notez-la pour l'étape suivante.
Dupliquer SV vers 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>
Développez le FS sur la nouvelle partition: resize2fs /dev/xvdg1
Installez grub
dans le bloc de démarrage du DV
Créez temporairement des fichiers de périphérique sur le DV: mount /dev/xvdg1 /mnt; cp -a /dev/xvdg /dev/xvdg1 /mnt/dev/
Installez les fichiers grub:
rm -f /mnt/boot/grub/*stage*
cp /mnt/usr/*/grub/*/*stage* /mnt/boot/grub/
rm -f /mnt/boot/grub/device.map
cat << ARNIE | chroot /mnt grub --batch
device (hd0) /dev/xvdg
root (hd0,0)
setup (hd0)
ARNIE
Après avoir apporté d'autres modifications mineures au volume de destination, prenez le volume et faites-en une AMI.
Ranger les fichiers de périphériques temporaires: rm -f /mnt/dev/xvdg /mnt/dev/xvdg1
Dans /mnt/boot/grub/grub.conf
, Remplacez root (hd0)
par root (hd0,0)
, ajoutez (ou remplacez console=*
) console=ttyS0
À la ligne du noyau et remplacez si nécessaire root=*
Avec root=LABEL=/
Dans la ligne du noyau
Dans /mnt/etc/fstab
, Assurez-vous que la ligne de la racine FS contient une référence étiquetée, par exemple
LABEL=/ / ext4 defaults,noatime 1 1
Étiquetez la nouvelle racine FS avec e2label /dev/xvdg1 /
Démontez DV de l'instance temporaire, détachez SV et DV de l'instance temporaire.
Prenez le DV et à partir de ce cliché, créez une image AMI.
Lancez une instance HVM à partir de cette IHM. Il s'agit de votre instance migrée.