Criar uma AMI do AWS HVM Linux a partir de uma AMI existente do Linux para-virtual

38

É possível criar uma AMI de hardware virtual machine (HVM) a partir de uma AMI paravirtual (PV) existente.

Meu pensamento inicial era iniciar uma nova instância de PV e usar o ec2-create-imagecomando para criar uma nova imagem enquanto especifica HVM como o tipo de virutalização. No entanto, ec2-create-imagenão possui um parâmetro de linha de comando para especificar o tipo de virtualização.

Existe outra maneira de fazer isso?

javacavaj
fonte

Respostas:

22

Atualizar

A AWS ativou esse recurso na API do EC2. Está disponível como --virtualization-typeopção aws ec2 register-imageno novo awscli baseado em Boto.

Resposta original

Sim! Infelizmente, não há uma maneira direta de fazer isso. Além disso, algumas instâncias de PV podem precisar de modificações no kernel e no carregador de inicialização.

  1. Crie um volume a partir da sua PV AMI existente. Se fosse sua própria AMI de PV, você pode criar um volume a partir da captura instantânea. Se for uma AMI de terceiros, será necessário iniciar uma instância e tirar uma captura instantânea.
  2. Inicie uma instância HVM com qualquer AMI.
  3. Pare essa instância do HVM.
  4. Desanexe o volume raiz dessa instância.
  5. Anexe o volume PV como o volume raiz (/ dev / sda1 ou / dev / sda se tiver sido particionado) à instância do HVM.
  6. Execute ec2-create-imagena instância HVM.
  7. Inicie outras instâncias com sua nova HVM AMI.

Se isso não funcionar, antes da etapa 5, você precisará anexar esse volume a uma instância em execução, configurar um chroot e instalar um kernel e um gerenciador de inicialização para sua distribuição. Você também pode limpar logs e qualquer cache de inicialização na nuvem.

Jeff Strunk
fonte
2
Tentei as etapas de 1 a 5 e não funcionou para mim, pois a instância para após alguns segundos. Alguém poderia elaborar sobre como configurar um chroot e instalar um kernel e um gerenciador de inicialização? As instâncias antiga e nova são AMI Linux. Obrigado.
22415 tolgamorf
Se você tiver uma instância de PV ativa, poderá convertê-la em HVM executando aws ec2 register-imageo sinalizador --virtualization-type no instantâneo da imagem PV. Veja aws ec2 register-image helppara detalhes.
Jeff Strunk
2
Criei uma imagem HVM da minha instância de PV usando aws ec2 register-image. Então, lancei uma nova instância HVM a partir dessa imagem. No entanto, o sistema não inicializa.
27415 tolgamorf
Depois de pesquisar no fórum aws ec2, encontrei uma solução na qual a conversão é feita substituindo os arquivos manualmente. Escreverei uma resposta em breve.
27415 tolgamorf
@tolgamorf você se lembra do que fez? Eu estou tendo o mesmo problema.
Dmitry Minkovsky
13

No meu caso, eu tive que fazer a conversão manualmente, pois a instância que eu criei usando aws ec2 register-imagenão foi inicializada. Minha solução é baseada nesta postagem no AWS EC2 Forum .

Preparação

Verifique se todos os volumes estão na mesma zona de disponibilidade.

  1. SSH para sua máquina fotovoltaica da qual você deseja migrar e aplicar todas as atualizações e, em seguida, efetue logout.

  2. Vá para o Console da AWS e inicie uma nova instância HVM selecionando a mesma AMI base da qual o sistema fotovoltaico foi criado (no meu caso, a AMI Linux da Amazon de 64 bits).

  3. SSH para esta nova instância, aplique todas as atualizações e efetue logout.

  4. Vá para o AWS Console e pare a instância do PV. Tire uma captura instantânea do dispositivo raiz e crie um novo volume ( SOURCE VOLUME) a partir dessa captura instantânea.

  5. Pare a instância HVM. Tire uma captura instantânea do dispositivo raiz na nova instância e crie um novo volume ( TARGET VOLUME) a partir dessa captura instantânea.

  6. Usando o console da AWS:

    • Anexe SOURCE VOLUMEà nova instância como /dev/xvdf.
    • Anexe TARGET VOLUMEà nova instância como /dev/xvdg.

Processo de conversão

  1. SSH para a nova instância e obtenha acesso root:

    sudo su
    
  2. Monte as unidades de origem e destino.

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

    No meu caso, os dispositivos foram /dev/xvdf(origem) e /dev/xvdg1(destino). Isso pode mudar na sua configuração com base no número de partições e onde você as anexou (consulte a etapa 6 em Preparação). Use ls -al /dev/xvd*para ver as unidades.

  3. Backup /lib/modules/*(se o kernel do PV ami diferir da nova máquina HVM. Este módulo é usado por alguns serviços da AWS.)

  4. Exclua tudo, menos /booto volume de destino:

    cd /mnt/target && ls | grep -v boot | xargs rm -Rf
    
  5. Exclua /bootno volume de origem:

    rm -Rf /mnt/source/boot
    
  6. Copie os dados do volume de origem no volume de destino, preservando todos os atributos:

    rsync -aAXHPv /mnt/source/ /mnt/target
    
  7. Edite /mnt/target/etc/fstabpara /partição, para que ele faça referência a TARGET VOLUMEquando montado em seu local final na etapa (8). Usando um rótulo ou simplesmente algo junto:

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

Em seguida, restaure /lib/modules/o backup na Etapa 3. (Se o kernel do PV ami diferir da nova máquina HVM.)

  1. Pare o sistema e desconecte todos os volumes usando o console da AWS. Anexe o TARGET VOLUMEna nova instância como /dev/xvda.

    Observe onde o dispositivo raiz original foi montado. Na maioria dos casos, deveria ser /dev/xvda.

  2. Inicie sua instância do HVM. Agora deve ser uma duplicata exata do seu sistema fotovoltaico. Se tudo estiver correto, agora você pode excluir sua instância do PV e também SOURCE VOLUME.

tolgamorf
fonte
1
Por que você simplesmente não faz um rm -f /boote cp -a /mnt/source/boot /mnt/target?
Michelem
@ Michelem, se bem me lembro, tentei fazer isso em primeiro lugar. A máquina não inicializou.
22415 tolgamorf
1
@tolgamorf Alguma chance de atualizar a resposta para refletir isso?
Dan Tenenbaum
2
Essas instruções foram realmente úteis (e funcionaram para mim !!), mas tenho uma última sugestão. Como a pergunta original era sobre criar uma AMI da HVM, não deixe essa etapa implícita, adicione uma etapa final para interromper a instância e criar uma AMI a partir dela (e depois encerrar a instância). Além disso, eu tive exatamente os mesmos problemas que o @DanGravell e não estou usando armazenamento magnético, portanto, essas podem ser armadilhas comuns que poderiam ser abordadas na resposta.
Dan Tenenbaum 02/02
1
Muito Obrigado! Isso me salvou muito tempo, editou-o para esclarecer a parte do fstab que me confundiu um pouco. Cuidado durante a etapa (4), de alguma forma excluí a raiz do volume temporário e não os destinos, quebrando esse volume e tive que reiniciar o 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 

Etapas detalhadas:

Respondendo ainda com base na resposta de Jeff Strunk para simplificar as etapas e fornecer um pouco mais de detalhes sobre a imagem do registro ec2:

  1. Crie Instância usando Imagem PV. Faça / atualize as alterações que desejar.

  2. Crie imagem da instância acima.

  3. Encontre o ID do instantâneo usado pela AMI acima em EC2> Elastic Block Store> Instantâneo no EC2 Console.

    ou se você tiver a configuração das ferramentas da API do ec2:

    ec2-description-images ami-id_of_above_created_ami

    e encontre o ID da captura instantânea para o ami

    .. Pressupostos para etapas adicionais: Suas chaves ec2 e ferramentas de API estão definidas e prontas para uso:

  4. Registre uma nova HVM AMI usando o instantâneo acima: exemplo:

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

Onde

  • -d é a descrição da AMI
  • -n é o nome da AMI
  • -s é o ID da captura instantânea da etapa 3.
  • -a é arquitetura
  • --virtualization-type é necessário para torná-lo hvm
  • --sriov é para permitir rede aprimorada, embora possa ser redundante, não tenho certeza.

Para maiores informações:

Anshu Prateek
fonte
2
A menos que eu esteja fazendo algo errado, isso não funcionará para as AMIs do mercado que restringem os tipos de instância. Tentei converter a AMI paravirtual oficial do MongoDB em HVM e, embora eu pudesse criar a HVM AMI, ela não iniciaria uma instância de HVM com ela.
Matt Beckman
@ MattBeckman Eu acho que é sobre o suporte subjacente ao kernel / bootloader em vez da restrição AMI. Acima funciona para o fedora, mas não para o amazon linux. Lá você tem que seguir o caminho, como sugerido originalmente por Jeff Strunk.
Anshu Prateek
1
Funcionou @AnshuPrateek
Atmesh Mishra
2

Você pode fazer isso de dentro da interface da web da AWS. Navegue para os instantâneos , clique no instantâneo desejado que deseja converter para hvm, clique em ações e depois crie a imagem . Na lista suspensa no assistente para criar imagem, selecione HVM .

Justin
fonte
9
Eu apenas tentei isso, mas parece que a instância não inicializa corretamente. Apenas entra no estado parado por alguns instantes depois que eu o inicio.
ovi
1

Tendo tentado todas as sugestões aqui contidas, nenhuma das quais funcionou para mim, encontrei uma excelente entrada de blog sobre o assunto em https://www.opswat.com/blog/aws-2015-why-you-need-switch- pv-hvm .

Os elementos (detalhes) do procedimento são:

  1. Instale grubna instância PV a ser migrada (instância de origem).

  2. Faça uma captura instantânea de precaução do volume raiz na instância de origem (volume de origem, SV).

  3. Crie uma instância temporária da HVM que migrará o volume.

    1. Eu usei uma instância do Amazon Linux
  4. Crie um volume de destino (DV) e conecte este e o SV à instância temporária.

    1. O DV deve ser pelo menos tão grande quanto o SV.

    2. Anexe o SV como /dev/{sd,xvd}fe o DV como /dev/{sd,xvd}g.

    3. Particione o DV:

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

    partprobe /dev/xvdg

    udevadm settle

  5. Redimensione para o tamanho mínimo do FS do SV e use a ddimagem no DV.

    1. Limpe o FS do volume de origem: e2fsck -f /dev/xvdf

    2. Minimize o mesmo: resize2fs -M /dev/xvdf

    3. Observe a saída do resize2fs (por exemplo Resizing the file system on /dev/xvdf to 269020 (4k) blocks) e anote-a no próximo passo.

    4. Duplicar SV para 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 o FS na nova partição: resize2fs /dev/xvdg1

  6. Instale grubno bloco de inicialização do DV

    1. Crie temporariamente arquivos de dispositivo no DV: mount /dev/xvdg1 /mnt; cp -a /dev/xvdg /dev/xvdg1 /mnt/dev/

    2. Instale arquivos grub:

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

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

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

    1. Instale o grub em um ambiente chroot:

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

    device (hd0) /dev/xvdg

    root (hd0,0)

    setup (hd0)

    ARNIE

  7. Depois de fazer outras pequenas alterações no volume de destino, ajuste o volume e faça uma AMI a partir dele.

    1. Arrume os arquivos temporários do dispositivo: rm -f /mnt/dev/xvdg /mnt/dev/xvdg1

    2. Em /mnt/boot/grub/grub.conf, mude root (hd0)para root (hd0,0), adicione (ou substitua console=*) console=ttyS0à linha do kernel e, se necessário, substitua root=*por root=LABEL=/na linha do kernel

    3. Em /mnt/etc/fstab, verifique se a linha do FS raiz contém uma referência rotulada, por exemplo

    LABEL=/ / ext4 defaults,noatime 1 1

    1. Rotule o novo FS raiz com e2label /dev/xvdg1 /

    2. Desmonte o DV da instância temporária, desconecte o SV e o DV da instância temporária.

    3. Encaixe o DV e, a partir desse encaixe, crie uma imagem AMI.

  8. Inicie uma instância HVM dessa HMI. Essa é a sua instância migrada.

MadHatter apoia Monica
fonte