Cree una AMI de Linux de AWS HVM a partir de una AMI de Linux paravirtual existente

38

¿Es posible crear una AMI de máquina virtual de hardware (HVM) a partir de una AMI paravirtual (PV) existente?

Inicialmente pensé en iniciar una nueva instancia de PV y usar el ec2-create-imagecomando para crear una nueva imagen mientras especificaba HVM como el tipo de virutalización. Sin embargo, ec2-create-imageno tiene un parámetro de línea de comando para especificar el tipo de virtualización.

¿Hay otra manera de hacer esto?

javacavaj
fuente

Respuestas:

22

Actualizar

AWS ha habilitado esta función en la API EC2. Está disponible como --virtualization-typeopción aws ec2 register-imageen el nuevo awscli basado en Boto.

Respuesta original

¡Sí! Desafortunadamente, no hay una forma directa de hacerlo. Además, algunas instancias PV pueden necesitar modificaciones en el kernel y el gestor de arranque.

  1. Cree un volumen a partir de su PV AMI existente. Si fue su propio PV AMI, puede hacer un volumen a partir de la instantánea. Si se trata de un AMI de un tercero, deberá iniciar una instancia y tomar una instantánea.
  2. Inicie una instancia de HVM con cualquier AMI.
  3. Detenga esa instancia de HVM.
  4. Separe el volumen raíz de esa instancia.
  5. Adjunte el volumen PV como el volumen raíz (/ dev / sda1 o / dev / sda si estaba particionado) a la instancia de HVM.
  6. Ejecutar ec2-create-imageen la instancia de HVM.
  7. Inicie otras instancias con su nueva AMI HVM.

Si eso no funciona, entonces antes del paso 5, necesitará adjuntar ese volumen a una instancia en ejecución, configurar un chroot e instalar un kernel y un gestor de arranque para su distribución. También es posible que desee borrar los registros y cualquier caché de inicio de la nube.

Jeff Strunk
fuente
2
Intenté los pasos 1-5 y no funcionó para mí, ya que la instancia se detiene después de unos segundos. ¿Podría alguien explicar cómo configurar un chroot e instalar un kernel y un gestor de arranque? Tanto las instancias antiguas como las nuevas son AMI Linux. Gracias.
tolgamorf 26/03/2015
Si tiene una instancia de PV en funcionamiento, puede convertirla a HVM ejecutándose aws ec2 register-imagecon el indicador --virtualization-type en la instantánea de la imagen de PV. Ver aws ec2 register-image helppara más detalles.
Jeff Strunk
2
Creé una imagen HVM desde mi instancia PV usando aws ec2 register-image. Luego lancé una nueva instancia de HVM desde esa imagen. Sin embargo, el sistema no se iniciará.
tolgamorf
Después de explorar el foro aws ec2, se me ocurrió una solución en la que la conversión se realiza reemplazando los archivos manualmente. Escribiré una respuesta pronto.
tolgamorf
@tolgamorf ¿recuerdas en absoluto lo que hiciste? Estoy teniendo el mismo problema.
Dmitry Minkovsky
13

En mi caso, tuve que hacer la conversión manualmente ya que la instancia que creo usando aws ec2 register-imageno se inició. Mi solución se basa en esta publicación en el Foro AWS EC2 .

Preparación

Asegúrese de que todos los volúmenes estén en la misma zona de disponibilidad.

  1. SSH a su máquina fotovoltaica desde la que desea migrar y aplicar todas las actualizaciones, luego cierre sesión

  2. Vaya a la consola de AWS e inicie una nueva instancia de HVM seleccionando la misma AMI base a partir de la cual se creó el sistema PV (en mi caso, la AMI de Linux de 64 bits de Amazon).

  3. SSH a esta nueva instancia y aplique todas las actualizaciones, luego cierre sesión.

  4. Vaya a la consola de AWS y detenga la instancia PV. Tome una instantánea del dispositivo raíz y cree un nuevo volumen ( SOURCE VOLUME) a partir de esta instantánea.

  5. Detenga la instancia de HVM. Tome una instantánea del dispositivo raíz en la nueva instancia y cree un nuevo volumen ( TARGET VOLUME) a partir de esta instantánea.

  6. Usando la consola de AWS:

    • Adjuntar SOURCE VOLUMEa la nueva instancia como /dev/xvdf.
    • Adjuntar TARGET VOLUMEa la nueva instancia como /dev/xvdg.

Proceso de conversión

  1. SSH a la nueva instancia y obtenga acceso de root:

    sudo su
    
  2. Monte las unidades de origen y destino.

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

    En mi caso, los dispositivos fueron /dev/xvdf(fuente) y /dev/xvdg1(destino). Estos pueden cambiar en su configuración en función del número de particiones y de dónde las adjuntó (consulte el paso 6 en Preparación). Use ls -al /dev/xvd*para ver las unidades.

  3. Copia de seguridad /lib/modules/*(si el núcleo de la PV ami difiere de la nueva máquina HVM. Algunos servicios de AWS utilizan este módulo).

  4. Eliminar todo menos /booten el volumen de destino:

    cd /mnt/target && ls | grep -v boot | xargs rm -Rf
    
  5. Eliminar /booten el volumen de origen:

    rm -Rf /mnt/source/boot
    
  6. Copie los datos del volumen de origen al volumen de destino conservando todos los atributos:

    rsync -aAXHPv /mnt/source/ /mnt/target
    
  7. Edite /mnt/target/etc/fstabpara la /partición, de modo que haga referencia al TARGET VOLUMEcuando está montado en su ubicación final en el paso (8). Ya sea usando una etiqueta o simplemente algo junto:

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

Luego restaure /lib/modules/la copia de seguridad que se realizó en el Paso 3. (Si el núcleo de la PV ami difiere de la nueva máquina HVM).

  1. Detenga el sistema y separe todos los volúmenes con la consola de AWS. Adjunte el TARGET VOLUMEen la nueva instancia como /dev/xvda.

    Asegúrese de anotar dónde se montó el dispositivo raíz original. En la mayoría de los casos, debería ser /dev/xvda.

  2. Comience su instancia de HVM. Ahora debería ser un duplicado exacto de su sistema fotovoltaico. Si todo parece correcto, ahora puede eliminar su instancia de PV y también SOURCE VOLUME.

tolgamorf
fuente
1
¿Por qué no simplemente haces un rm -f /booty cp -a /mnt/source/boot /mnt/target?
michelem
@Michelem, si no recuerdo mal, intenté hacerlo en primer lugar. La máquina no arranca.
tolgamorf
1
@tolgamorf ¿Alguna posibilidad de actualizar la respuesta para reflejar esto?
Dan Tenenbaum
2
Estas instrucciones fueron realmente útiles (¡y funcionaron para mí!) Pero tengo una última sugerencia. Dado que la pregunta original era sobre hacer una AMI HVM, no deje ese paso implícito, agregue un paso final de detener la instancia y hacer una AMI a partir de ella (y luego terminar la instancia). Además, tuve exactamente los mismos problemas que @DanGravell y no estoy usando almacenamiento magnético, por lo que estos pueden ser problemas comunes que podrían abordarse en la respuesta.
Dan Tenenbaum
1
¡Muchas gracias! Esto me ahorró mucho tiempo, lo edité para aclarar la parte fstab que me confundió un poco. Cuidado durante el paso (4), de alguna manera eliminé la raíz del volumen temporal y no los objetivos, rompiendo ese volumen y tuve que reiniciar el proceso.
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 

Pasos detallados:

Respondiendo más en base a la respuesta de Jeff Strunk para simplificar los pasos y dar un poco más de detalles sobre la imagen de registro ec2:

  1. Crear instancia usando la imagen PV. Realice / actualice los cambios que desee.

  2. Crear imagen a partir de la instancia anterior.

  3. Busque la identificación de la instantánea utilizada por la AMI anterior en EC2> Elastic Block Store> Instantánea en la consola EC2.

    o si tiene la configuración de las herramientas ec2 api:

    ec2-describe-images ami-id_of_above_created_ami

    y encuentre la identificación de la instantánea para el ami

    .. Suposiciones para pasos adicionales: las teclas ec2 y las herramientas de API están configuradas y listas para usar:

  4. Registre una nueva AMI HVM utilizando la instantánea anterior: ejemplo:

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

dónde

  • Descripción de -d is AMI
  • -n es el nombre de AMI
  • -s es la identificación de la instantánea del paso 3.
  • -a es arquitectura
  • --virtualization-type es requerido para hacerlo hvm
  • --sriov es para habilitar una red mejorada, aunque puede ser redundante, no estoy seguro.

Para más información:

Anshu Prateek
fuente
2
A menos que esté haciendo algo mal, esto no funcionará para las AMI del mercado que restringen los tipos de instancias. Intenté convertir el AMI paravirtual oficial de MongoDB a HVM, y aunque pude crear el AMI de HVM, no lanzaría una instancia de HVM con él.
Matt Beckman el
@ MattBeckman Creo que se trata del soporte subyacente del kernel / bootloader en lugar de la restricción AMI. Lo anterior funciona para fedora pero no para amazon linux. Ahí tienes que seguir el camino sugerido por Jeff Strunk originalmente.
Anshu Prateek
1
Funcionó @AnshuPrateek
Atmesh Mishra
2

Puede hacerlo desde el interior de la interfaz web de AWS. Navegue a las instantáneas , haga clic en la instantánea deseada que desea convertir a hvm y haga clic en acciones y luego cree la imagen . En el menú desplegable del asistente de creación de imágenes, seleccione HVM .

Justin
fuente
9
Acabo de intentar esto, pero parece que la instancia no arrancará correctamente. Simplemente se detiene por sí solo, unos momentos después de que lo inicie.
ovi
1

Después de haber probado todas las sugerencias en este documento, ninguna de las cuales funcionó para mí, encontré una excelente entrada de blog sobre el tema, en https://www.opswat.com/blog/aws-2015-why-you-need-switch- pv-hvm .

Los elementos (detalles) del procedimiento son:

  1. Instalar gruben la instancia de PV que se va a migrar (instancia de origen).

  2. Realice una instantánea de precaución del volumen raíz en la instancia de origen (volumen de origen, SV).

  3. Cree una instancia temporal de HVM que migrará el volumen.

    1. Usé una instancia de Amazon Linux
  4. Cree un volumen de destino (DV) y adjunte este y el SV a la instancia temporal.

    1. El DV debe ser al menos tan grande como el SV.

    2. Adjunte el SV como /dev/{sd,xvd}fy el DV como /dev/{sd,xvd}g.

    3. Particionar el DV:

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

    partprobe /dev/xvdg

    udevadm settle

  5. Cambie el tamaño al tamaño mínimo del FS del SV y use la ddimagen en el DV.

    1. Limpie el FS del volumen de origen: e2fsck -f /dev/xvdf

    2. Minimiza lo mismo: resize2fs -M /dev/xvdf

    3. Observe el resultado de resize2fs (por ejemplo Resizing the file system on /dev/xvdf to 269020 (4k) blocks) y anótelo para el siguiente paso.

    4. Duplicar SV a 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. Expanda el FS en la nueva partición: resize2fs /dev/xvdg1

  6. Instalar gruben el bloque de arranque del DV

    1. Cree temporalmente archivos de dispositivo en el DV: mount /dev/xvdg1 /mnt; cp -a /dev/xvdg /dev/xvdg1 /mnt/dev/

    2. Instalar archivos grub:

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

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

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

    1. Instale grub en un entorno chroot:

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

    device (hd0) /dev/xvdg

    root (hd0,0)

    setup (hd0)

    ARNIE

  7. Después de haber realizado otros cambios menores en el volumen de destino, ajuste el volumen y cree un AMI a partir de él.

    1. Ordena los archivos temporales del dispositivo: rm -f /mnt/dev/xvdg /mnt/dev/xvdg1

    2. En /mnt/boot/grub/grub.conf, cambie root (hd0)a root (hd0,0), agregue (o reemplace console=*) console=ttyS0a la línea del kernel y, si es necesario, reemplace root=*con root=LABEL=/en la línea del kernel

    3. En /mnt/etc/fstab, asegúrese de que la línea del FS raíz contenga una referencia etiquetada, por ejemplo

    LABEL=/ / ext4 defaults,noatime 1 1

    1. Etiquete la nueva raíz FS con e2label /dev/xvdg1 /

    2. Desmonta DV de la instancia temporal, desconecta SV y DV de la instancia temporal.

    3. Ajuste el DV y, a partir de ese ajuste, cree una imagen AMI.

  8. Inicie una instancia de HVM desde esa HMI. Esa es tu instancia migrada.

MadHatter apoya a Monica
fuente