Preparar o Linux para criação de imagem no Azure

Aplica-se a: ✔️ Linux VMs ✔️ Conjuntos de escala flexível

O acordo de nível de serviço (SLA) da plataforma Azure aplica-se às máquinas virtuais (VMs) que executam o sistema operativo Linux apenas quando está a usar uma das distribuições endossadas. Para distribuições endossadas, o Azure Marketplace fornece imagens Linux pré-configuradas. Para obter mais informações, consulte:

Todas as outras distribuições a correr no Azure, incluindo distribuições apoiadas pela comunidade e não endossadas, têm alguns pré-requisitos.

Este artigo foca-se em orientações gerais para executar a sua distribuição Linux no Azure. Este artigo não pode ser abrangente, porque cada distribuição é diferente. Mesmo que cumpra todos os critérios que este artigo descreve, pode ser necessário ajustar significativamente o seu sistema Linux para que funcione corretamente.

Notas gerais de instalação do Linux

  • Azure não suporta o formato Hyper-V disco rígido virtual (VHDX). O Azure suporta apenas VHD fixo. Pode converter o disco para formato VHD usando Hyper-V Manager ou o cmdlet Convert-VHD. Se estiveres a usar o VirtualBox, seleciona Tamanho Fixo em vez do padrão (Alocado Dinamicamente) ao criar o disco.

  • O Azure suporta máquinas virtuais Gen1 (arranque BIOS) e Gen2 (arranque UEFI).

  • O módulo do kernel da tabela virtual de alocação de ficheiros (VFAT) deve estar ativado no kernel.

  • O tamanho máximo permitido para o VHD é de 1.023 GB.

  • Ao instalar o sistema Linux, recomendamos que use partições padrão em vez do Logical Volume Manager (LVM). O LVM é o padrão para muitas instalações.

    Usar partições padrão evitará conflitos de nomes LVM com VMs clonadas, especialmente se um disco do sistema operativo for ligado a outra VM idêntica para resolução de problemas. Pode usar LVM ou RAID em discos de dados.

  • É necessário o suporte do kernel para montar sistemas de ficheiros de função definida pelo utilizador (UDF). No primeiro arranque no Azure, a configuração de provisionamento é passada para a VM Linux através de media formatada em UDF que está ligada ao convidado. O agente Azure Linux deve montar o sistema de ficheiros UDF para ler a sua configuração e provisionar a VM.

  • As versões do kernel Linux anteriores à 2.6.37 não suportam Acesso à Memória Não Uniforme (NUMA) em Hyper-V com VMs de maior dimensão. Este problema afeta principalmente distribuições mais antigas que utilizam o kernel upstream Red Hat 2.6.32. Foi corrigido no Red Hat Enterprise Linux (RHEL) 6.6 (kernel-2.6.32-504).

    Sistemas a executar kernels personalizados anteriores à 2.6.37, ou kernels baseados em RHEL anteriores à 2.6.32-504, devem definir o parâmetro numa=off de arranque na linha de comandos do kernel em grub.conf. Para obter mais informações, consulte Red Hat KB 436883.

  • Não configures uma partição swap no disco do sistema operativo. Pode configurar o agente Linux para criar um ficheiro de swap no disco de recurso temporário, conforme descrito mais adiante neste artigo.

  • Todos os VHDs no Azure devem ter um tamanho virtual alinhado a 1 MB (1024 x 1024 bytes). Quando estiver a converter de um disco bruto para VHD, certifique-se de que o tamanho bruto do disco é múltiplo de 1 MB antes da conversão, conforme descrito mais adiante neste artigo.

  • Use a versão da distribuição, os pacotes e o software mais atualizados.

  • Remover utilizadores e contas do sistema, chaves públicas, dados sensíveis, software e aplicações desnecessários.

Note

A versão 21.2 ou posterior do cloud-init remove o requisito UDF. Mas sem o udf módulo ativado, o CD-ROM não monta durante o provisionamento, o que impede que os dados personalizados sejam aplicados. Uma solução alternativa é aplicar dados do utilizador. No entanto, ao contrário dos dados personalizados, os dados do utilizador não estão encriptados. Para mais informações, consulte formatos de dados de utilizador na documentação cloud-init.

Instale módulos do kernel sem Hyper-V

Azure corre no hipervisor Hyper-V, por isso o Linux exige que certos módulos do kernel corram em Azure. Se tiveres uma VM criada fora do Hyper-V, os instaladores Linux podem não incluir os drivers para Hyper-V no disco RAM inicial (initrd ou initramfs), a menos que a VM detete que está a correr num ambiente Hyper-V.

Quando estás a usar um sistema de virtualização diferente (como o VirtualBox ou o KVM) para preparar a tua imagem Linux, poderás ter de reconstruir o initrd para que, pelo menos, os módulos do kernel hv_vmbus e hv_storvsc estejam disponíveis no disco RAM inicial. Este problema conhecido aplica-se a sistemas baseados na distribuição upstream do Red Hat, e possivelmente a outros.

O mecanismo para reconstruir a imagem initrd ou initramfs pode variar, dependendo da distribuição. Consulte a documentação correspondente ou o suporte técnico da sua distribuição para obter o procedimento adequado. Aqui está um exemplo para reconstruir o Initrd usando a mkinitrd utilidade:

  1. Faça backup da imagem original existente:

    cd /boot
    sudo cp initrd-`uname -r`.img  initrd-`uname -r`.img.bak
    
  2. Reconstrua o initrd utilizando os módulos do kernel hv_vmbus e hv_storvsc:

    sudo mkinitrd --preload=hv_storvsc --preload=hv_vmbus -v -f initrd-`uname -r`.img `uname -r`
    

Redimensionar VHDs

As imagens VHD no Azure devem ter um tamanho virtual alinhado a 1 MB. Normalmente, os VHDs criados através de Hyper-V estão alinhados corretamente. Se o VHD não estiver alinhado corretamente, pode receber uma mensagem de erro semelhante ao exemplo seguinte quando tentar criar uma imagem a partir do seu VHD:

The VHD http://<mystorageaccount>.blob.core.windows.net/vhds/MyLinuxVM.vhd has an unsupported virtual size of 21475270656 bytes. The size must be a whole number (in MBs).

Neste caso, redimensione a VM usando a consola Hyper-V Manager ou o cmdlet PowerShell Redimension-VHD. Se não estiver a correr num ambiente Windows, recomendamos usar qemu-img para converter (se necessário) e redimensionar o VHD.

Note

Há um bug conhecido no qemu-img para a versão 2.2.1 do QEMU e algumas versões posteriores que resulta num VHD mal formatado. O problema foi corrigido no QEMU 2.6. Recomendamos usar a versão 2.2.0 ou anterior, ou a versão 2.6 ou posterior.

  1. Redimensionar diretamente o VHD utilizando ferramentas como qemu-img ou vbox-manage pode resultar num VHD não arrancável. Recomendamos primeiro converter o VHD para uma imagem de disco raw usando o seguinte código.

    Se a imagem da VM foi criada como imagem de disco bruto, podes saltar este passo. Criar a imagem da VM como imagem de disco bruto é o padrão em alguns hipervisores, como o KVM.

    sudo qemu-img convert -f vpc -O raw MyLinuxVM.vhd MyLinuxVM.raw
    
  2. Calcule o tamanho necessário da imagem de disco para que o tamanho virtual fique alinhado a 1 MB. O seguinte script shell Bash usa qemu-img info para determinar o tamanho virtual da imagem de disco, e depois calcula o tamanho para o próximo 1 MB:

    rawdisk="MyLinuxVM.raw"
    vhddisk="MyLinuxVM.vhd"
    
    MB=$((1024*1024))
    size=$(qemu-img info -f raw --output json "$rawdisk" | \
    gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    
    rounded_size=$(((($size+$MB-1)/$MB)*$MB))
    
    echo "Rounded Size = $rounded_size"
    
  3. Redimensione o disco bruto usando $rounded_size:

    sudo qemu-img resize MyLinuxVM.raw $rounded_size
    
  4. Converter o disco bruto de volta para um VHD de tamanho fixo:

    sudo qemu-img convert -f raw -o subformat=fixed,force_size -O vpc MyLinuxVM.raw MyLinuxVM.vhd
    

    Ou, com versões do QEMU anteriores à 2.6, remover a force_size opção:

    sudo qemu-img convert -f raw -o subformat=fixed -O vpc MyLinuxVM.raw MyLinuxVM.vhd
    

Requisitos do kernel Linux

Os controladores dos Serviços de Integração Linux (LIS) para Hyper-V e Azure são integrados diretamente no kernel principal do Linux. Muitas distribuições que incluem uma versão recente do kernel Linux (como a 3.x) já têm estes drivers disponíveis, ou de outra forma fornecem versões retroportadas desses drivers com os seus kernels.

Os drivers LIS estão constantemente a ser atualizados no kernel principal com correções e novas funcionalidades. Sempre que possível, recomendamos executar uma distribuição endossada que inclua estas correções e atualizações.

Se estiver a usar uma variante do RHEL, nas versões 6.0 a 6.3, tem de instalar os drivers LIS mais recentes para Hyper-V. A partir do RHEL 6.4+ (e derivados), os drivers LIS já estão incluídos no kernel, por isso não precisas de pacotes de instalação adicionais.

Se for necessário um kernel personalizado, recomendamos uma versão recente do kernel (como a 3.8+). Para distribuições ou fornecedores que mantêm o seu próprio kernel, é necessário retroportar regularmente os controladores LIS do kernel principal para o seu kernel personalizado.

Mesmo que já esteja a usar uma versão do kernel relativamente recente, recomendamos vivamente que acompanhe eventuais correções introduzidas a montante nos controladores LIS e as retroporte conforme necessário. As localizações dos ficheiros fonte do driver LIS são especificadas no ficheiro MAINTAINERS na árvore de código-fonte do kernel Linux:

    F:    arch/x86/include/asm/mshyperv.h
    F:    arch/x86/include/uapi/asm/hyperv.h
    F:    arch/x86/kernel/cpu/mshyperv.c
    F:    drivers/hid/hid-hyperv.c
    F:    drivers/hv/
    F:    drivers/input/serio/hyperv-keyboard.c
    F:    drivers/net/hyperv/
    F:    drivers/scsi/storvsc_drv.c
    F:    drivers/video/fbdev/hyperv_fb.c
    F:    include/linux/hyperv.h
    F:    tools/hv/

O kernel ativo da VM deve incluir os seguintes patches. Esta lista não pode estar completa para todas as distribuições.

Agente Linux do Azure

O Azure Linux Agent (waagent) prevê uma máquina virtual Linux em Azure. Pode obter a versão mais recente, reportar problemas ou submeter pull requests no Linux Agent GitHub repositório.

Aqui estão algumas considerações para usar o Azure Linux Agent:

  • O agente Linux é lançado sob a licença Apache 2.0. Muitas distribuições já fornecem pacotes .rpm ou .deb para o agente. Pode instalar e atualizar facilmente estes pacotes.
  • O Azure Linux Agent requer Python v2.6+.
  • O agente também necessita do python-pyasn1 módulo. A maioria das distribuições fornece este módulo como um pacote separado para ser instalado.
  • Em alguns casos, o Azure Linux Agent pode não ser compatível com o NetworkManager. Muitos dos pacotes (.rpm ou .deb) fornecidos pelas distribuições configuram o NetworkManager como um conflito com o waagent pacote. Nestes casos, o agente desinstala o NetworkManager quando instala o pacote do agente Linux.
  • O Azure Linux Agent deve estar igual ou acima da versão mínima suportada.

Note

Certifica-te de que os udf módulos e vfat estão ativados. Desativar o udf módulo causará uma falha de provisionamento. Desativar o vfat módulo causa falhas tanto no provisionamento como no arranque. Cloud-init versão 21.2 ou posterior pode provisionar VMs sem necessidade de UDF se ambas as condições existirem:

  • Criaste a VM usando chaves públicas SSH e não palavras-passe.
  • Não forneceste quaisquer dados personalizados.

Requisitos gerais do sistema Linux

  1. Modifique a linha de inicialização do kernel no GRUB ou GRUB2 para incluir os seguintes parâmetros, para que todas as mensagens do console sejam enviadas para a primeira porta serial. Estas mensagens podem ajudar o suporte do Azure a depurar quaisquer problemas.

    GRUB_CMDLINE_LINUX="rootdelay=300 console=ttyS0 earlyprintk=ttyS0 net.ifnames=0"
    

    Recomendamos também a remoção dos seguintes parâmetros, caso existam:

    rhgb quiet crashkernel=auto
    

    O arranque gráfico e silencioso não são úteis num ambiente na cloud, onde queres que todos os registos sejam enviados para a porta serial. Pode deixar a crashkernel opção configurada se necessário, mas este parâmetro reduz a quantidade de memória disponível na VM em pelo menos 128 MB. Reduzir a memória disponível pode ser problemático para VMs de tamanhos mais pequenos.

  2. Depois de terminares de editar /etc/default/grub, executa o seguinte comando para reconstruir a configuração do GRUB:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  3. Adicione o módulo Hyper-V para initramfs usando dracut:

    cd /boot
    sudo cp initramfs-<kernel-version>.img <kernel-version>.img.bak
    sudo dracut -f -v initramfs-<kernel-version>.img <kernel-version> --add-drivers "hv_vmbus hv_netvsc hv_storvsc"
    sudo grub-mkconfig -o /boot/grub/grub.cfg
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    

    Adicione o módulo Hyper-V para initrd usando mkinitramfs:

    cd /boot
    sudo cp initrd.img-<kernel-version>  initrd.img-<kernel-version>.bak
    sudo mkinitramfs -o initrd.img-<kernel-version> <kernel-version>  --with=hv_vmbus,hv_netvsc,hv_storvsc
    sudo update-grub
    
  4. Certifique-se de que o servidor SSH está instalado e configurado para iniciar no momento da inicialização. Esta configuração é geralmente a padrão.

  5. Instala o Azure Linux Agent.

    O Azure Linux Agent é necessário para provisionar uma imagem Linux no Azure. Muitas distribuições fornecem o agente como um pacote .rpm ou .deb. O pacote é normalmente chamado WALinuxAgent ou walinuxagent. Também pode instalar o agente manualmente seguindo os passos do guia Azure Linux Agent.

    Note

    Certifica-te de que os udf módulos e vfat estão ativados. Removê-los ou desativá-los pode causar uma falha de provisionamento ou de arranque. A versão 21.2 ou posterior do cloud-init remove o requisito UDF.

    Instale o Azure Linux Agent, o cloud-init e outras utilidades necessárias executando um dos seguintes comandos.

    Use este comando para Red Hat ou CentOS:

    sudo yum install -y WALinuxAgent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    Use este comando para Ubuntu/Debian:

    sudo apt install walinuxagent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    Use este comando para a SUSE:

    sudo zypper install python-azure-agent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    Depois ativa o agente e o cloud-init em todas as distribuições:

    sudo systemctl enable waagent.service
    sudo systemctl enable cloud-init.service
    
  6. Não cries espaço de troca no disco do sistema operativo.

    Podes usar o Azure Linux Agent ou o cloud-init para configurar swap space através do disco de recurso local. Este disco de recurso é ligado à VM após o provisionamento no Azure. O disco de recurso local é um disco temporário e pode ser esvaziado quando a VM é desprovisionada. Os blocos seguintes mostram como configurar esta troca.

    Se escolheres Azure Linux Agent, modifica os seguintes parâmetros em /etc/waagent.conf:

    ResourceDisk.Format=y
    ResourceDisk.Filesystem=ext4
    ResourceDisk.MountPoint=/mnt/resource
    ResourceDisk.EnableSwap=y
    ResourceDisk.SwapSizeMB=2048    ## NOTE: Set this to your desired size.
    

    Se escolher cloud-init, configure o cloud-init para gerir o provisionamento:

    sudo sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=cloud-init/g' /etc/waagent.conf
    sudo sed -i 's/ResourceDisk.Format=y/ResourceDisk.Format=n/g' /etc/waagent.conf
    sudo sed -i 's/ResourceDisk.EnableSwap=y/ResourceDisk.EnableSwap=n/g' /etc/waagent.conf
    

    Para configurar o cloud-init para formatar e criar espaço de troca, tens duas opções:

    • Forneça uma configuração cloud-init sempre que criar uma VM através de customdata. Recomendamos este método.
    • Utilize uma diretiva cloud-init na imagem para configurar o espaço de swap sempre que a VM for criada.

    Crie um ficheiro .cfg para configurar swap space usando cloud-init:

    echo 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' | sudo tee -a /etc/systemd/system.conf
    cat << EOF | sudo tee /etc/cloud/cloud.cfg.d/00-azure-swap.cfg
    #cloud-config
    # Generated by Azure cloud image build
    disk_setup:
      ephemeral0:
        table_type: mbr
        layout: [66, [33, 82]]
        overwrite: True
    fs_setup:
      - device: ephemeral0.1
        filesystem: ext4
      - device: ephemeral0.2
        filesystem: swap
    mounts:
      - ["ephemeral0.1", "/mnt/resource"]
      - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
    EOF
    
  7. Configure o cloud-init para gerir o provisionamento:

    1. Configurar waagent para cloud-init:

      sudo sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=cloud-init/g' /etc/waagent.conf
      sudo sed -i 's/ResourceDisk.Format=y/ResourceDisk.Format=n/g' /etc/waagent.conf
      sudo sed -i 's/ResourceDisk.EnableSwap=y/ResourceDisk.EnableSwap=n/g' /etc/waagent.conf
      

      Se estiveres a migrar uma máquina virtual específica e não quiseres criar uma imagem generalizada, define Provisioning.Agent=disabled a configuração /etc/waagent.conf .

    2. Configurar pontos de montagem:

      echo "Adding mounts and disk_setup to init stage"
      sudo sed -i '/ - mounts/d' /etc/cloud/cloud.cfg
      sudo sed -i '/ - disk_setup/d' /etc/cloud/cloud.cfg
      sudo sed -i '/cloud_init_modules/a\\ - mounts' /etc/cloud/cloud.cfg
      sudo sed -i '/cloud_init_modules/a\\ - disk_setup' /etc/cloud/cloud.cfg
      
      
    3. Configure a fonte de dados do Azure:

      echo "Allow only Azure datasource, disable fetching network setting via IMDS"
      cat << EOF | sudo tee /etc/cloud/cloud.cfg.d/91-azure_datasource.cfg
      datasource_list: [ Azure ]
      datasource:
         Azure:
           apply_network_config: False
      EOF
      
    4. Remova o ficheiro de swap existente se tiver configurado um:

      if [[ -f /mnt/resource/swapfile ]]; then
      echo "Removing swapfile" #RHEL uses a swap file by default
      swapoff /mnt/resource/swapfile
      rm /mnt/resource/swapfile -f
      fi
      
    5. Configure o registo do cloud-init:

      echo "Add console log file"
      cat << EOF | sudo tee -a /etc/cloud/cloud.cfg.d/05_logging.cfg
      
      # This tells cloud-init to redirect its stdout and stderr to
      # 'tee -a /var/log/cloud-init-output.log' so the user can see output
      # there without needing to look on the console.
      output: {all: '| tee -a /var/log/cloud-init-output.log'}
      EOF
      
  8. Execute os seguintes comandos para desprovisionar a máquina virtual.

    Atenção

    Se estás a migrar uma máquina virtual específica e não quiseres criar uma imagem generalizada, salta a etapa de desprovisionamento. Executar o comando waagent -force -deprovision+user torna a máquina de origem inutilizável. Esta etapa destina-se apenas a criar uma imagem generalizada.

    sudo rm -f /var/log/waagent.log
    sudo cloud-init clean
    sudo waagent -force -deprovision+user
    sudo rm -f ~/.bash_history
    sudo export HISTSIZE=0
    

    No VirtualBox, pode aparecer uma mensagem de erro após a execução waagent -force -deprovision que diz [Errno 5] Input/output error. Esta mensagem de erro não é crítica e pode ignorá-la.

  9. Desliga a máquina virtual e carrega o VHD para o Azure.

Passos seguintes

Crie uma VM Linux a partir de um disco personalizado usando o CLI do Azure