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

Cuidado

Este artigo faz referência ao CentOS, uma distribuição do Linux que está se aproximando do status de EOL (fim da vida útil). Considere seu uso e planeje adequadamente. Para obter mais informações, veja as Diretrizes sobre fim da vida útil do CentOS.

Aplica-se a: ✔️ VMs do Linux ✔️ Conjuntos de dimensionamento flexíveis

O contrato de nível de serviço (SLA) da plataforma Azure se aplica a máquinas virtuais (VMs) que executam o sistema operacional Linux somente quando você estiver usando uma das distribuições endossadas. Para distribuições endossadas, o Azure Marketplace fornece imagens do Linux pré-configuradas. Para saber mais, veja:

Todas as outras distribuições em execução no Azure, incluindo distribuições com suporte da comunidade e não endossadas, têm alguns pré-requisitos.

Este artigo concentra-se na orientação geral para executar a distribuição do Linux no Azure. Este artigo pode não ser abrangente porque cada distribuição é diferente. Mesmo que atenda a todos os critérios descritos neste artigo, talvez você precise ajustar seu sistema Linux de forma significativa para que ele seja executado corretamente.

Observações gerais de instalação do Linux

  • O Azure não dá suporte ao formato de disco rígido virtual (VHDX) no Hyper-V. O Azure dá suporte apenas ao VHD fixo. Você pode converter o disco para o formato VHD usando o Gerenciador do Hyper-V ou o cmdlet Convert-VHD. Se estiver usando o VirtualBox, selecione Tamanho fixo em vez do padrão (Alocado Dinamicamente) quando você criar o disco.

  • O Azure dá suporte a máquinas virtuais Gen1 (inicialização do BIOS) e Gen2 (inicialização de UEFI).

  • O módulo do kernel da tabela de alocação de arquivos virtuais (VFAT) precisa estar habilitado no kernel.

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

  • Quando estiver instalando o sistema Linux, recomendamos que você use partições padrão em vez do Gerenciador de Volume Lógico (LVM). O LVM é padrão para muitas instalações.

    Usar partições padrão evitará conflitos de nome do LVM com VMs clonadas, especialmente se um disco de SO já estiver conectado a outra VM idêntica para solução de problemas. Você pode usar LVM ou RAID nos discos de dados.

  • É necessário o suporte do kernel à montagem de sistemas de arquivos com função definida pelo usuário (UDF). Na primeira inicialização no Azure, a configuração do provisionamento é transmitida à VM do Linux por meio das mídias formatadas como UDF que são anexadas ao convidado. O agente Linux do Azure deve montar o sistema de arquivos UDF para ler a configuração e provisionar a VM.

  • As versões do kernel do Linux anteriores à 2.6.37 não dão suporte ao Acesso à Memória Não Uniforme (NUMA) no Hyper-V com tamanhos de VM maiores. Esse problema afeta, principalmente, as distribuições mais antigas que usam o kernel 2.6.32 do Red Hat upstream. O problema foi corrigido no Red Hat Enterprise Linux (RHEL) 6.6 (kernel-2.6.32-504).

    Os sistemas que executam kernels personalizados anteriores a 2.6.37 ou kernels baseados no RHEL anteriores a 2.6.32-504 precisam definir o parâmetro de inicialização numa=off na linha de comando do kernel no grub.conf. Para obter mais informações, consulte o KB 436883 do Red Hat.

  • Não configure uma partição de permuta no disco do sistema operacional. Você pode configurar o agente do Linux para criar um arquivo de swap no disco de recurso temporário, conforme descrito mais à frente neste artigo.

  • Todos os VHDs no Azure devem ter um tamanho virtual alinhado a 1 MB (1024 × 1024 bytes). Ao converter um disco não formatado para VHD, certifique-se de que o tamanho do disco não formatado seja um múltiplo de 1 MB antes da conversão, conforme descrito mais à frente neste artigo.

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

  • Remova usuários e contas do sistema, chaves públicas, dados confidenciais, softwares desnecessários e aplicativos.

Observação

O cloud-init versão 21.2 ou posterior remove o requisito de UDF. Porém, sem o módulo udf habilitado, o CD-ROM não será montado durante o provisionamento, o que impede que os dados personalizados sejam aplicados. Uma solução alternativa é aplicar os dados do usuário. No entanto, ao contrário dos dados personalizados, os dados do usuário não são criptografados. Para obter mais informações, confira Formatos de dados do usuário na documentação do cloud-init.

Instalação dos módulos do kernel sem Hyper-V

O Azure é executado no Hipervisor Hyper-V, portanto, o Linux exige que determinados módulos do kernel sejam executados no Azure. Se você tiver uma VM que foi criada fora do Hyper-V, os instaladores do Linux talvez não incluam os drivers para Hyper-V no disco de RAM inicial (initrd ou initramfs), a não ser que a VM detecte que ele está em execução em um ambiente Hyper-V.

Quando estiver usando um sistema de virtualização diferente (como VirtualBox ou KVM) para preparar sua imagem do Linux, talvez você precise recriar o initrd para que pelo menos os módulos hv_vmbus e hv_storvsc do kernel fiquem disponíveis no disco de RAM inicial. Esse problema conhecido é para sistemas com base na distribuição anterior do Red Hat e, possivelmente, em outros.

O mecanismo para recriar a imagem initrd ou initramfs pode variar, dependendo da distribuição. Consulte a documentação da distribuição ou suporte para o procedimento adequado. Aqui temos um exemplo para recriar o initrd usando o utilitário mkinitrd:

  1. Faça o backup da imagem initrd existente:

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

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

Redimensionar VHDs

As imagens de VHD no Azure devem ter um tamanho virtual alinhado para 1MB. De modo geral, os VHDs criados por meio do Hyper-V são alinhados corretamente. Se o VHD não estiver alinhado corretamente, você poderá receber uma mensagem de erro semelhante à do exemplo a seguir ao tentar criar uma imagem 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).

Nesse caso, redimensione a VM usando o console do Gerenciador do Hyper-V ou o cmdlet do PowerShell Resize-VHD. Se você não estiver executando em um ambiente Windows, é recomendável usar qemu-img para converter (se necessário) e redimensionar o VHD.

Observação

Existe um bug conhecido na qemu-img para QEMU versão 2.2.1 e algumas versões posteriores que resultam em um VHD formatado incorretamente. Esse problema foi corrigido no QEMU 2.6. Recomendamos o uso da versão 2.2.0 ou anterior ou da versão 2.6 ou posterior.

  1. Redimensionar o VHD diretamente, usando ferramentas como qemu-img ou vbox-manage, poderá resultar em um VHD que não pode ser inicializado. Recomendamos, primeiro, converter o VHD em uma imagem de disco não formatado usando o código a seguir.

    Se a imagem da VM tiver sido criada como uma imagem de disco não formatado, você poderá ignorar essa etapa. Criar a imagem de VM como uma imagem de disco não formatado é o padrão em alguns hipervisores, como a 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 seja alinhado a 1 MB. O script de shell Bash a seguir usa a qemu-img info para determinar o tamanho virtual da imagem do disco e, em seguida, calcula o tamanho para o 1 MB mais próximo:

    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 não formatado usando $rounded_size:

    sudo qemu-img resize MyLinuxVM.raw $rounded_size
    
  4. Converta o disco não formatado 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 as versões do QEMU anteriores a 2.6, remova a opção force_size:

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

Requisitos do kernel do Linux

Os drivers LIS (Serviços de Integração do Linux) para Hyper-V e Azure são obtidos diretamente no kernel upstream do Linux. Muitas distribuições que incluem uma versão recente do kernel do Linux (como 3.x) já possuem esses drivers disponíveis ou, caso contrário, fornecem versões portadas desses drivers com seus kernels.

Os drivers do LIS estão constantemente sendo atualizados no kernel upstream com novas correções e recursos. Sempre que possível, recomendamos executar uma distribuição endossada que inclua essas correções e atualizações.

Se estiver executando uma variante das versões 6.0 a 6.3 do RHEL, você precisará instalar os drivers do LIS para Hyper-V mais recentes. Começando com o RHEL 6.4+ (e derivados), os drivers do LIS já estão incluídos no kernel e, portanto, você não precisa de nenhum pacote de instalação adicional.

Se um kernel personalizado for necessário, é recomendável uma versão recente do kernel (como 3.8+). No caso das distribuições ou fornecedores que mantêm seus próprios kernels, você precisará regularmente fazer o backport dos drivers do LIS do kernel upstream para o seu kernel personalizado.

Mesmo se você já estiver executando uma versão do kernel relativamente recente, recomendamos fortemente que você acompanhe todas as correções upstream nos drivers do LIS e faça o backport conforme necessário. Os locais dos arquivos de origem do driver LIS são especificados no arquivo MAINTAINERS na árvore de origem do kernel do 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 precisa incluir os patches a seguir. Esta lista não pode ser completa para todas as distribuições.

Agente Linux do Azure

O Agente do Linux do Azure (waagent) provisiona uma máquina virtual do Linux no Azure. Você pode obter a versão mais recente, notificar problemas com arquivos ou enviar solicitações de pull no repositório do Agente do Linux no GitHub.

Aqui estão algumas considerações sobre como usar o Agente do Linux do Azure:

  • O agente Linux consta na licença do Apache 2.0. Muitas distribuições já fornecem pacotes .rpm ou .deb para o agente. Você pode instalar e atualizar esses pacotes com facilidade.
  • O agente Linux do Azure requer Python v2.6+.
  • O agente também requer o módulo python-pyasn1. A maioria das distribuições fornece esse módulo como um pacote separado a ser instalado.
  • Em alguns casos, é possível que o Agente do Linux do Azure não seja compatível com o NetworkManager. Muitos dos pacotes (.rpm ou .deb) fornecidos pelas distribuições configuram o NetworkManager como um conflito com o pacote waagent. Nesses casos, o agente irá desinstalar o NetworkManager quando você instalar o pacote do agente do Linux.
  • O agente Linux do Azure deve estar na ou acima da versão mínima com suporte.

Observação

Certifique-se de que os módulos udf e vfat estejam habilitados. Desabilitar o módulo udf causará uma falha de provisionamento. Desabilitar o módulo vfat causará falhas tanto de provisionamento quanto de inicialização. O cloud-init versão 21.2 ou posterior pode provisionar VMs sem necessidade de UDF se ambas as condições a seguir existirem:

  • Você criou a VM usando chaves públicas SSH e não senhas.
  • Você não forneceu nenhum dado personalizado.

Requisitos gerais do sistema Linux

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

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

    Além disso, recomendamos remover os seguintes parâmetros, se existirem:

    rhgb quiet crashkernel=auto
    

    As inicializações gráfica e silenciosa não são úteis em um ambiente de nuvem, no qual você quer que todos os logs sejam enviados para a porta serial. Você pode deixar a opção crashkernel configurada se necessário, mas esse parâmetro reduz a quantidade de memória disponível na VM em pelo menos 128 MB. A redução da memória disponível pode ser problemática para as VMs de tamanhos menores.

  2. Após terminar de editar /etc/default/grub, execute o seguinte comando para recriar a configuração do GRUB:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  3. Adicione o módulo de 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 de 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. Confira se o servidor SSH está instalado e configurado para iniciar no tempo de inicialização. Essa configuração geralmente é a padrão.

  5. Instale o Agente Linux do Azure.

    O agente Linux do Azure é necessário para garantir o provisionamento de uma imagem Linux no Azure. Muitas distribuições fornecem o agente como um pacote .rpm ou .deb. O pacote normalmente é chamado WALinuxAgent ou walinuxagent. Você também pode instalar o agente manualmente seguindo as etapas no guia do Agente do Linux do Azure.

    Observação

    Certifique-se de que os módulos udf e vfat estejam habilitados. Removê-los ou desabilitá-los causará uma falha de provisionamento ou inicialização. O cloud-init versão 21.2 ou posterior remove o requisito de UDF.

    Instale o Agente do Linux do Azure, o cloud-init e outros utilitários necessários executando os comandos a seguir.

    Use esse comando para Red Hat ou CentOS:

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

    Use esse comando para Ubuntu/Debian:

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

    Use esse comando para SUSE:

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

    Em seguida, habilite 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 crie espaço de troca no disco do sistema operacional.

    Você pode usar o Agente do Linux do Azure ou o cloud-init para configurar o espaço de swap por meio do disco de recurso local. Esse disco de recurso é anexado à 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 a seguir mostram como configurar essa troca.

    Se você escolher o Agente do Linux do Azure, modifique os parâmetros a seguir 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 você escolher o cloud-init, configure o cloud-init para se encarregar do provisionamento:

    sudo sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=cloud-auto/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 o espaço de swap, você tem duas opções:

    • Transmitir uma configuração do cloud-init a cada vez que você criar uma VM por meio de customdata. Este método é recomendável.
    • Usar uma diretiva do cloud-init na imagem para configurar o espaço de swap a cada vez que a VM for criada.

    Crie um arquivo .cfg para configurar o espaço de swap usando o cloud-init:

    sudo echo 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' >> /etc/systemd/system.conf
    sudo cat > /etc/cloud/cloud.cfg.d/00-azure-swap.cfg << EOF
    #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. Configurar o cloud-init para lidar com o provisionamento:

    1. Configurar o waagent para o 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 estiver migrando uma máquina virtual específica e não quiser criar uma imagem generalizada, configure Provisioning.Agent=disabled na configuração /etc/waagent.conf.

    2. Configurar montagens:

      sudo 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:

      sudo echo "Allow only Azure datasource, disable fetching network setting via IMDS"
      sudo cat > /etc/cloud/cloud.cfg.d/91-azure_datasource.cfg <<EOF
      datasource_list: [ Azure ]
      datasource:
         Azure:
           apply_network_config: False
      EOF
      
    4. Remova o arquivo de swap existente se você 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. Configurar o registro em log do cloud-init:

      sudo echo "Add console log file"
      sudo cat >> /etc/cloud/cloud.cfg.d/05_logging.cfg <<EOF
      
      # 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.

    Cuidado

    Se estiver migrando uma máquina virtual específica e não quiser criar uma imagem generalizada, ignore a etapa de desprovisionamento. A execução do comando waagent -force -deprovision+user tornará o computador de origem inutilizável. Essa etapa se destina 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, você poderá ver uma mensagem de erro após executar um waagent -force -deprovision, dizendo [Errno 5] Input/output error. Essa mensagem de erro não é crítica e você pode ignorá-la.

  9. Desligar a máquina virtual e carregar o VHD no Azure.

Próximas etapas

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