Crea un'AMI Linux AWS HVM da un'AMI Linux paravirtuale esistente


38

È possibile creare una AMI di una macchina virtuale hardware (HVM) da una AMI paravirtuale (PV) esistente.

Inizialmente pensavo di avviare una nuova istanza PV e utilizzare il ec2-create-imagecomando per creare una nuova immagine specificando HVM come tipo di virutalizzazione. Tuttavia, ec2-create-imagenon ha un parametro da riga di comando per specificare il tipo di virtualizzazione.

C'è un altro modo di fare questo?

Risposte:


22

Aggiornare

AWS ha abilitato questa funzione nell'API EC2. È disponibile come --virtualization-typeopzione aws ec2 register-imagenel nuovo awscli basato su Boto.

Risposta originale

Sì! Sfortunatamente, non esiste un modo diretto per farlo. Inoltre, alcune istanze PV potrebbero richiedere modifiche al kernel e al bootloader.

  1. Crea un volume dall'AMI PV esistente. Se era la tua AMI PV, puoi creare un volume dall'istantanea. Se si tratta di un'AMI di terze parti, dovrai avviare un'istanza e scattare un'istantanea.
  2. Avviare un'istanza HVM con qualsiasi AMI.
  3. Ferma quell'istanza HVM.
  4. Stacca il volume di root da quell'istanza.
  5. Collegare il volume PV come volume principale (/ dev / sda1 o / dev / sda se è stato partizionato) all'istanza HVM.
  6. Esegui ec2-create-imagesull'istanza HVM.
  7. Avvia altre istanze con la tua nuova AMI HVM.

Se il problema persiste, prima di eseguire il passaggio 5, dovrai collegare quel volume a un'istanza in esecuzione, impostare un chroot e installare un kernel e un bootloader per la tua distribuzione. Potresti anche voler cancellare i log e qualsiasi cache di cloud-init.


2
Ho provato i passaggi 1-5 e non ha funzionato per me, poiché l'istanza si interrompe dopo alcuni secondi. Qualcuno potrebbe approfondire come impostare un chroot e installare un kernel e un bootloader? Sia la vecchia che la nuova istanza sono AMI Linux. Grazie.
tolgamorf,

Se hai un'istanza PV funzionante, puoi convertirla in HVM eseguendo aws ec2 register-imagecon il flag --virtualization-type sull'istantanea dell'immagine PV. Vedi aws ec2 register-image helpper i dettagli.
Jeff Strunk,

2
Ho creato un'immagine HVM dalla mia istanza PV utilizzando aws ec2 register-image. Quindi ho lanciato una nuova istanza HVM da quell'immagine. Tuttavia, il sistema non si avvia.
Tolgamorf,

Dopo aver esplorato il forum di aws ec2, ho trovato una soluzione in cui la conversione viene eseguita sostituendo i file manualmente. Scriverò presto una risposta.
Tolgamorf,

@tolgamorf ti ricordi per tutto quello che hai fatto? Sto avendo lo stesso problema.
Dmitry Minkovsky,

13

Nel mio caso, ho dovuto eseguire la conversione manualmente poiché l'istanza che ho creato utilizzando aws ec2 register-imagenon si è avviata. La mia soluzione si basa su questo post sul forum AWS EC2 .

Preparazione

Assicurarsi che tutti i volumi siano nella stessa zona di disponibilità.

  1. SSH sulla macchina fotovoltaica da cui si desidera migrare e applicare tutti gli aggiornamenti, quindi disconnettersi.

  2. Vai alla Console AWS e avvia una nuova istanza HVM selezionando la stessa AMI di base da cui è stato creato il sistema fotovoltaico (nel mio caso, l'AMI Linux a 64 bit di Amazon).

  3. SSH per questa nuova istanza e applicare tutti gli aggiornamenti, quindi disconnettersi.

  4. Vai alla Console AWS e arresta l'istanza PV. Scatta un'istantanea del dispositivo radice e crea un nuovo volume ( SOURCE VOLUME) da questa istantanea.

  5. Arresta l'istanza HVM. Scatta un'istantanea del dispositivo radice sulla nuova istanza e crea un nuovo volume ( TARGET VOLUME) da questa istantanea.

  6. Utilizzando la console AWS:

    • Allegare SOURCE VOLUMEalla nuova istanza come /dev/xvdf.
    • Allegare TARGET VOLUMEalla nuova istanza come /dev/xvdg.

Processo di conversione

  1. SSH per la nuova istanza e ottenere l'accesso come root:

    sudo su
    
  2. Montare le unità di origine e di destinazione.

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

    Nel mio caso, i dispositivi erano /dev/xvdf(sorgente) e /dev/xvdg1(destinazione). Questi possono variare nella configurazione in base al numero di partizioni e al punto in cui le sono state collegate (vedere il passaggio 6 in Preparazione). Utilizzare ls -al /dev/xvd*per vedere le unità.

  3. Backup /lib/modules/*(se il kernel del PV ami differisce dalla nuova macchina HVM. Questo modulo è utilizzato da alcuni servizi di AWS.)

  4. Elimina tutto tranne /bootsul volume di destinazione:

    cd /mnt/target && ls | grep -v boot | xargs rm -Rf
    
  5. Elimina /bootsul volume di origine:

    rm -Rf /mnt/source/boot
    
  6. Copia i dati del volume di origine nel volume di destinazione conservando tutti gli attributi:

    rsync -aAXHPv /mnt/source/ /mnt/target
    
  7. Modifica /mnt/target/etc/fstabper la /partizione, in modo che faccia riferimento a TARGET VOLUMEquando montato nella sua posizione finale nel passaggio (8). O usando un'etichetta o semplicemente qualcosa insieme:

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

Quindi ripristina il /lib/modules/backup di cui hai eseguito il passaggio 3. (Se il kernel del PV ami differisce dalla nuova macchina HVM.)

  1. Arrestare il sistema e scollegare tutti i volumi utilizzando la console AWS. Allegare la TARGET VOLUMEnuova istanza come /dev/xvda.

    Assicurati di notare dove è stato montato il dispositivo radice originale. Nella maggior parte dei casi, dovrebbe essere /dev/xvda.

  2. Inizia la tua istanza HVM. Ora dovrebbe essere un duplicato esatto del tuo impianto fotovoltaico. Se tutto sembra a posto, ora è possibile eliminare anche l'istanza PV SOURCE VOLUME.


1
Perché non fai semplicemente un rm -f /boote cp -a /mnt/source/boot /mnt/target?
michelem,

@Michelem se ricordo bene, ho provato a farlo in primo luogo. La macchina non si è avviata.
tolgamorf,

1
@tolgamorf Qualche possibilità di aggiornare la risposta per riflettere questo?
Dan Tenenbaum,

2
Queste istruzioni sono state davvero utili (e hanno funzionato per me !!) ma ho un ultimo suggerimento. Poiché la domanda originale riguardava la creazione di un AMI HVM, non lasciare quel passaggio implicito, aggiungere un passaggio finale di arresto dell'istanza e creazione di un AMI da esso (e quindi chiusura dell'istanza). Inoltre, ho avuto gli stessi identici problemi di @DanGravell e non sto usando l'archiviazione magnetica, quindi potrebbero essere insidie ​​comuni che potrebbero essere risolte nella risposta.
Dan Tenenbaum,

1
Grazie molto! Questo mi ha fatto risparmiare un sacco di tempo, editato per chiarire la parte fstab che mi ha confuso un po '. Fai attenzione durante il passaggio (4), in qualche modo ho eliminato la radice del volume temporaneo e non le destinazioni, rompendo quel volume e ho dovuto riavviare il processo.
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 

Passaggi dettagliati:

Risposta ulteriormente basata sulla risposta di Jeff Strunk per semplificare i passaggi e fornire un po 'più di dettagli sull'immagine del registro ec2:

  1. Creare un'istanza utilizzando l'immagine PV. Apporta / aggiorna le modifiche che desideri.

  2. Crea immagine dall'istanza sopra.

  3. Trova l'ID dell'istantanea utilizzato dall'AMI sopra in EC2> Elastic Block Store> Snapshot nella console EC2.

    o se hai la configurazione degli strumenti ec2 api:

    ec2-descrivi-immagini ami-id_of_above_created_ami

    e trova l'ID dell'istantanea per l'ami

    .. Presupposti per ulteriori passaggi: i tasti ec2 e gli strumenti api sono impostati e pronti per l'uso:

  4. Registrare una nuova AMI HVM utilizzando l'istantanea sopra: esempio:

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

dove

  • -d è la descrizione AMI
  • -n è il nome AMI
  • -s è l'ID dell'istantanea dal passaggio 3.
  • -a è l'architettura
  • --virtualization-type è richiesto per renderlo hvm
  • --sriov serve per abilitare il potenziamento della rete, anche se potrebbe essere ridondante, non sono sicuro.

Per maggiori informazioni:


2
A meno che non stia facendo qualcosa di sbagliato, questo non funzionerà per le AMI del mercato che limitano i tipi di istanza. Ho provato a convertire l'AMI paravirtuale ufficiale MongoDB in HVM, e mentre potevo creare l'AMI HVM, non avrebbe lanciato un'istanza HVM con essa.
Matt Beckman,

@MattBeckman Penso che si tratti del supporto kernel / bootloader sottostante piuttosto che della restrizione AMI. Sopra funziona per Fedora ma non per Amazon Linux. Lì devi andare come suggerito da Jeff Strunk in modo originale.
Anshu Prateek,

1
Ha funzionato @AnshuPrateek
Atmesh Mishra

2

Puoi farlo dall'interno dell'interfaccia web di AWS. Passare alle istantanee , fare clic sull'istantanea desiderata che si desidera convertire in hvm e fare clic su azioni e quindi creare un'immagine . Nel menu a discesa nella procedura guidata di creazione dell'immagine selezionare HVM .


9
Ho appena provato questo, ma sembra che l'istanza non si avvii correttamente. Ritorna da solo, pochi istanti dopo che l'ho avviato.
ovi,

1

Avendo provato tutti i suggerimenti qui, nessuno dei quali ha funzionato per me, ho trovato un eccellente post di blog sull'argomento, su https://www.opswat.com/blog/aws-2015-why-you-need-switch- pv-hvm .

Gli elementi (dettagli) della procedura sono:

  1. Installa grubsull'istanza PV da migrare (istanza di origine).

  2. Creare un'istantanea precauzionale del volume principale sull'istanza di origine (volume di origine, SV).

  3. Creare un'istanza HVM temporanea che eseguirà la migrazione del volume.

    1. Ho usato un'istanza di Amazon Linux
  4. Creare un volume di destinazione (DV) e collegare sia questo che SV all'istanza temporanea.

    1. Il DV dovrebbe essere almeno grande quanto il SV.

    2. Collegare SV come /dev/{sd,xvd}fe DV come /dev/{sd,xvd}g.

    3. Partiziona il DV:

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

    partprobe /dev/xvdg

    udevadm settle

  5. Ridimensiona alla dimensione minima dell'SV di SV e utilizzalo come ddimmagine sul DV.

    1. Pulisci il volume del volume sorgente: e2fsck -f /dev/xvdf

    2. Riduci al minimo lo stesso: resize2fs -M /dev/xvdf

    3. Osservare l'output di resize2fs (ad es. Resizing the file system on /dev/xvdf to 269020 (4k) blocks) E annotarlo per il passaggio successivo.

    4. SV a DV duplicato: 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. Espandi FS sulla nuova partizione: resize2fs /dev/xvdg1

  6. Installa grubnel blocco di avvio del DV

    1. Creare temporaneamente i file del dispositivo sul DV: mount /dev/xvdg1 /mnt; cp -a /dev/xvdg /dev/xvdg1 /mnt/dev/

    2. Installa i file grub:

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

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

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

    1. Installa grub in un ambiente chroot:

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

    device (hd0) /dev/xvdg

    root (hd0,0)

    setup (hd0)

    ARNIE

  7. Dopo aver apportato alcune altre piccole modifiche al volume di destinazione, eseguire lo snap del volume e ricavarne un AMI.

    1. Riordina i file temporanei del dispositivo: rm -f /mnt/dev/xvdg /mnt/dev/xvdg1

    2. In /mnt/boot/grub/grub.conf, cambia root (hd0)in root (hd0,0), aggiungi (o sostituisci console=*) console=ttyS0alla riga del kernel e, se necessario, sostituisci root=*con root=LABEL=/nella riga del kernel

    3. In /mnt/etc/fstab, assicurarsi che la riga del root FS contenga un riferimento etichettato, ad es

    LABEL=/ / ext4 defaults,noatime 1 1

    1. Etichetta la nuova radice FS con e2label /dev/xvdg1 /

    2. Smonta DV dall'istanza temporanea, stacca SV e DV dall'istanza temporanea.

    3. Scatta il DV e da quello scatto crea un'immagine AMI.

  8. Avviare un'istanza HVM da quell'HMI. Questa è la tua istanza migrata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.