Créer une AMI AWS HVM Linux à partir d'une AMI Paravirtual Linux existante

38

Est-il possible de créer une AMI de machine virtuelle matérielle (HVM) à partir d'une AMI existante paravirtuelle (PV).

Mon idée initiale était de démarrer une nouvelle instance PV et d'utiliser la ec2-create-imagecommande pour créer une nouvelle image tout en spécifiant HVM comme type de virutalisation. Toutefois, ec2-create-imageaucun paramètre de ligne de commande ne permet de spécifier le type de virtualisation.

Y a-t-il une autre façon de s'y prendre?

javacavaj
la source

Réponses:

22

Mise à jour

AWS a activé cette fonctionnalité dans l'API EC2. Il est disponible comme --virtualization-typeoption aws ec2 register-imagedans le nouvel awscli basé sur Boto.

Réponse originale

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.

  1. Créez un volume à partir de votre AMI PV existante. S'il s'agissait de votre propre AMI PV, vous pouvez créer un volume à partir de l'instantané. S'il s'agit d'une AMI tierce, vous devrez lancer une instance et prendre un instantané.
  2. Lancez une instance HVM avec n'importe quelle AMI.
  3. Arrêtez cette instance HVM.
  4. Détachez le volume racine de cette instance.
  5. Associez le volume PV en tant que volume racine (/ dev / sda1 ou / dev / sda s'il a été partitionné) à l'instance HVM.
  6. Exécuter ec2-create-imagesur l'instance HVM.
  7. Lancez d'autres instances avec votre nouvelle AMI HVM.

Si cela ne fonctionne pas, avant l'étape 5, vous devrez associer ce volume à une instance en cours d'exécution, configurer un chroot, puis installer un noyau et un chargeur de démarrage pour votre distribution. Vous pouvez également vouloir effacer les journaux et tout cache en nuage-init.

Jeff Strunk
la source
2
J'ai essayé les étapes 1 à 5 et cela n'a pas fonctionné pour moi, l'instance s'arrêtant après quelques secondes. Quelqu'un pourrait-il expliquer comment configurer un chroot et installer un noyau et un chargeur de démarrage? L'AMI Linux est l'ancienne et la nouvelle instance. Merci.
tolgamorf
Si vous avez une instance PV fonctionnelle, vous pouvez la convertir en HVM en l'exécutant aws ec2 register-imageavec l'indicateur --virtualization-type sur l'instantané de l'image PV. Voir aws ec2 register-image helppour plus de détails.
Jeff Strunk
2
J'ai créé une image HVM à partir de mon instance PV en utilisant aws ec2 register-image. Ensuite, j'ai lancé une nouvelle instance HVM à partir de cette image. Cependant, le système ne démarre pas.
tolgamorf
Après avoir fouillé dans le forum aws ec2, je suis arrivé à une solution dans laquelle la conversion est effectuée en remplaçant les fichiers manuellement. Je vais écrire une réponse bientôt.
tolgamorf
@tolgamorf vous souvenez-vous de ce que vous avez fait? Je rencontre le même problème.
Dmitry Minkovsky
13

Dans mon cas, je devais faire la conversion manuellement car l'instance que je crée en utilisant aws ec2 register-imagene démarrait pas. Ma solution est basée sur ce post sur le forum AWS EC2 .

Préparation

Assurez-vous que tous les volumes se trouvent dans la même zone de disponibilité.

  1. SSH sur votre machine PV à partir de laquelle vous souhaitez migrer et appliquer toutes les mises à jour, puis déconnectez-vous.

  2. 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 photovoltaïque a été créé (dans mon cas, l'AMI Amazon 64 bits de Amazon).

  3. SSH sur cette nouvelle instance et appliquez toutes les mises à jour, puis déconnectez-vous.

  4. 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é.

  5. 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é.

  6. Utilisation de la console AWS:

    • Attacher SOURCE VOLUMEà la nouvelle instance en tant que /dev/xvdf.
    • Attacher TARGET VOLUMEà la nouvelle instance en tant que /dev/xvdg.

Processus de conversion

  1. SSH sur la nouvelle instance et obtenir un accès root:

    sudo su
    
  2. 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 du lieu où vous les avez attachées (voir l'étape 6 de la section Préparation). Utilisez ls -al /dev/xvd*pour voir les lecteurs.

  3. Sauvegarde /lib/modules/*(Si le noyau de PV ami diffère de celui de la nouvelle machine HVM. Ce module est utilisé par certains services d’AWS.)

  4. Supprimer tout sauf /bootsur le volume cible:

    cd /mnt/target && ls | grep -v boot | xargs rm -Rf
    
  5. Supprimer /bootsur le volume source:

    rm -Rf /mnt/source/boot
    
  6. Copiez les données du volume source sur le volume cible en préservant tous les attributs:

    rsync -aAXHPv /mnt/source/ /mnt/target
    
  7. Éditez /mnt/target/etc/fstabpour la /partition, de sorte qu'il fasse référence à TARGET VOLUMElorsqu'il est monté à son emplacement final à l'étape (8). Soit en utilisant une étiquette ou simplement quelque chose de long:

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

Ensuite, restaurez la /lib/modules/sauvegarde sauvegardée à l’étape 3. (Si le noyau de l’ami PV diffère de celui de la nouvelle machine HVM.)

  1. Arrêtez le système et détachez tous les volumes à l'aide de la console AWS. Attachez le TARGET VOLUMEsur la nouvelle instance en tant que /dev/xvda.

    Assurez-vous de noter l'emplacement du périphérique racine d'origine. Dans la plupart des cas, cela devrait être /dev/xvda.

  2. Démarrez votre instance HVM. Il devrait maintenant s'agir d'une copie exacte de votre système PV. Si tout se passe bien, vous pouvez maintenant supprimer votre instance PV ainsi que SOURCE VOLUME.

tolgamorf
la source
1
Pourquoi ne faites-vous pas simplement un rm -f /bootet cp -a /mnt/source/boot /mnt/target?
Michelem
@ Michelem si je me souviens bien, j'ai essayé de le faire en premier lieu. La machine n'a pas démarré.
tolgamorf
1
@tolgamorf Avez-vous une chance de mettre à jour la réponse pour refléter cela?
Dan Tenenbaum
2
Ces instructions ont été vraiment utiles (et ont fonctionné pour moi !!) mais j'ai une dernière suggestion. La question initiale étant de créer une AMI HVM, ne laissez pas cette étape implicite, ajoutez une étape finale consistant à arrêter l'instance et à en faire une AMI (puis à mettre fin à l'instance). De plus, j'avais exactement les mêmes problèmes que @DanGravell et je n'utilise pas de stockage magnétique. Il peut donc s'agir de pièges courants qui pourraient être résolus dans la réponse.
Dan Tenenbaum
1
Merci beaucoup! Cela m'a fait gagner beaucoup de temps et l'a édité pour éclaircir la partie fstab qui m'a un peu dérouté. Attention, au cours de l'étape (4), j'ai en quelque sorte supprimé la racine du volume temporaire et non les cibles, interrompant ce volume et devais redémarrer le processus.
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 

Étapes détaillées:

Répondant en outre sur la réponse de Jeff Strunk pour simplifier les étapes et donner un peu plus de détails sur l'image du registre ec2:

  1. Créer une instance à l'aide de PV Image. Effectuez / mettez à jour les modifications souhaitées.

  2. Créer une image à partir de l'instance ci-dessus.

  3. Recherchez l'identifiant d'instantané utilisé par l'AMI ci-dessus sous EC2> Elastic Block Store> Instantané dans la console EC2.

    ou si vous avez la configuration d'outils ec2 api:

    ec2-describe-images ami-id_of_above_created_ami

    et trouver l'identifiant de l'instantané pour l'ami

    .. Hypothèses pour les étapes suivantes: vos clés ec2 et vos outils api sont configurés et prêts à être utilisés:

  4. Enregistrez une nouvelle AMI HVM à l'aide de 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-nom-appareil / dev / sda1

  • -d est la description d'AMI
  • -n est le nom AMI
  • -s est l'ID d'instantané de l'étape 3.
  • -a est l'architecture
  • - Le type-virtualisation est requis pour le rendre hvm
  • --sriov permet d'activer les réseaux améliorés, même s'il peut être redondant, pas certain.

Pour plus d'informations:

Anshu Prateek
la source
2
À moins que je ne fasse quelque chose de mal, cela ne fonctionnera pas pour les AMI du marché qui limitent les types d'instances. J'ai essayé de convertir l'AMI paravirtuelle de MongoDB en HVM, et même si je pouvais créer l'AMI HVM, elle ne lancerait pas d'instance HVM avec celle-ci.
Matt Beckman
@MattBeckman Je pense que cela concerne le support sous-jacent du noyau / chargeur de démarrage plutôt que la restriction AMI. Ci-dessus fonctionne pour fedora mais pas pour amazon linux. Là, vous devez suivre le chemin suggéré par Jeff Strunk à l’origine.
Anshu Prateek
1
Cela a fonctionné @AnshuPrateek
Atmesh Mishra
2

Vous pouvez le faire depuis l'intérieur de l'interface Web AWS. Accédez aux instantanés , cliquez sur l'instantané que vous souhaitez convertir en hvm, cliquez sur les actions , puis créez une image . Dans la liste déroulante de l'assistant de création d'image, sélectionnez HVM .

Justin
la source
9
Je viens d’essayer cela, mais c’est comme si l’instance ne démarrait pas correctement. Il se met à l’état arrêté seul, quelques instants après le démarrage.
ovi
1

Après avoir essayé toutes les suggestions présentées ici, mais aucune d’entre elles n’a fonctionné pour moi, j’ai trouvé un excellent article de blog sur le sujet, à l’ adresse https://www.opswat.com/blog/aws-2015-why-you-need-switch- pv-hvm .

Les éléments (détails) de la procédure sont:

  1. Installer grubsur l'instance PV à migrer (instance source).

  2. Créez un instantané de précaution du volume racine sur l'instance source (volume source, SV).

  3. Créez une instance HVM temporaire qui migrera le volume.

    1. J'ai utilisé une instance Amazon Linux
  4. Créez un volume de destination (DV) et attachez-le, ainsi que le SV, à l'instance temporaire.

    1. Le DV devrait être au moins aussi grand que le SV.

    2. Fixez le SV en tant que /dev/{sd,xvd}f, et le DV en tant que /dev/{sd,xvd}g.

    3. Partitionner le DV:

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

    partprobe /dev/xvdg

    udevadm settle

  5. Redimensionnez au minimum la taille du SV du SV et utilisez- ddla sur le DV.

    1. Nettoyez le système de fichiers du volume source: e2fsck -f /dev/xvdf

    2. Minimiser les mêmes: resize2fs -M /dev/xvdf

    3. Observez le résultat de resize2fs (par exemple Resizing the file system on /dev/xvdf to 269020 (4k) blocks) et notez-le pour l'étape suivante.

    4. Dupliquer SV à 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. Développez le système de fichiers sur la nouvelle partition: resize2fs /dev/xvdg1

  6. Installer grubdans le bloc de démarrage du DV

    1. Créer temporairement des fichiers de périphérique sur le DV: mount /dev/xvdg1 /mnt; cp -a /dev/xvdg /dev/xvdg1 /mnt/dev/

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

    1. Installez grub dans un environnement chroot:

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

    device (hd0) /dev/xvdg

    root (hd0,0)

    setup (hd0)

    ARNIE

  7. Après avoir apporté quelques modifications mineures au volume de destination, accrochez le volume et créez une AMI à partir de celui-ci.

    1. Rangez les fichiers de périphériques temporaires: rm -f /mnt/dev/xvdg /mnt/dev/xvdg1

    2. Dans /mnt/boot/grub/grub.conf, le changement root (hd0)à root (hd0,0), ajouter (ou remplacer console=*) console=ttyS0à la ligne du noyau, et si nécessaire , remplacer root=*parroot=LABEL=/ dans la ligne du noyau

    3. Dans /mnt/etc/fstab, assurez-vous que la ligne du système racine contient une référence libellée, par exemple

    LABEL=/ / ext4 defaults,noatime 1 1

    1. Étiquetez la nouvelle racine FS avec e2label /dev/xvdg1 /

    2. Démontez DV de l'instance temporaire, détachez SV et DV de l'instance temporaire.

    3. Alignez le DV et créez à partir de celui-ci une image AMI.

  8. Lancez une instance HVM à partir de cette IHM. C'est votre instance migrée.

MadHatter soutient Monica
la source