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

Atenção

Este artigo faz referência ao CentOS, uma distribuição Linux com status de Fim de Vida (EOL). Por favor, considere o seu uso e planeje de acordo. Para obter mais informações, consulte as diretrizes de Fim da Vida Útil do CentOS.

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

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

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

Este artigo se concentra em orientações gerais para executar sua distribuição Linux no Azure. Este artigo não pode ser abrangente, porque cada distribuição é diferente. Mesmo que você atenda a todos os critérios descritos neste artigo, talvez seja necessário ajustar significativamente seu sistema Linux para que ele funcione corretamente.

Notas gerais de instalação do Linux

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

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

  • O módulo do kernel da tabela de alocação de arquivos virtuais (VFAT) deve ser ativado no kernel.

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

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

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

  • É necessário suporte kernel para a montagem de sistemas de ficheiros de função definida pelo utilizador (UDF). Na primeira inicialização no Azure, a configuração de provisionamento é passada para a VM Linux por meio de mídia formatada em UDF anexada ao convidado. O agente Linux do Azure deve montar o sistema de arquivos UDF para ler sua configuração e provisionar a VM.

  • As versões do kernel Linux anteriores à 2.6.37 não suportam acesso não uniforme à memória (NUMA) no Hyper-V com tamanhos de VM maiores. Esse problema afeta principalmente distribuições mais antigas que usam o kernel upstream do Red Hat 2.6.32. Foi corrigido no Red Hat Enterprise Linux (RHEL) 6.6 (kernel-2.6.32-504).

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

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

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

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

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

Nota

Cloud-init versão 21.2 ou posterior remove o requisito UDF. Mas sem o udf módulo ativado, o CD-ROM não será montado durante o provisionamento, o que impede que os dados personalizados sejam aplicados. Uma solução alternativa é aplicar 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, consulte Formatos de dados do usuário na documentação cloud-init.

Instalar módulos do kernel sem Hyper-V

O Azure é executado no hipervisor Hyper-V, portanto, o Linux requer determinados módulos do kernel para ser executado no Azure. Se você tiver uma VM criada fora do Hyper-V, os instaladores do Linux podem não incluir os drivers para o Hyper-V no disco RAM inicial (initrd ou initramfs), a menos que a VM detete que está sendo executada em um ambiente Hyper-V.

Quando você estiver usando um sistema de virtualização diferente (como VirtualBox ou KVM) para preparar sua imagem do Linux, talvez seja necessário reconstruir o initrd para que pelo menos os módulos e hv_storvsc o hv_vmbus kernel estejam disponíveis no disco RAM inicial. Esse problema conhecido é para sistemas baseados na distribuição upstream da Red Hat e possivelmente outros.

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

  1. Faça backup da imagem initrd existente:

    cd /boot
    sudo cp initrd-`uname -r`.img  initrd-`uname -r`.img.bak
    
  2. Reconstrua o initrd usando os módulos e hv_storvsc kernelhv_vmbus:

    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 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 ao exemplo a seguir ao tentar criar uma imagem a partir do 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 Resize-VHD PowerShell. Se você não estiver executando em um ambiente Windows, recomendamos usar qemu-img para converter (se necessário) e redimensionar o VHD.

Nota

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

  1. Redimensionar o VHD diretamente usando ferramentas como qemu-img ou vbox-manage pode resultar em um VHD não inicializável. Recomendamos primeiro converter o VHD em uma imagem de disco bruto usando o código a seguir.

    Se a imagem da VM foi criada como uma imagem de disco bruto, você pode ignorar esta etapa. Criar a imagem da VM como uma 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 seja alinhado a 1 MB. O seguinte shell script Bash usa qemu-img info para determinar o tamanho virtual da imagem de disco e, em seguida, 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. Converta 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 QEMU anteriores à 2.6, remova 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 drivers do Linux Integration Services (LIS) para Hyper-V e Azure são contribuídos diretamente para o kernel Linux upstream. Muitas distribuições que incluem uma versão recente do kernel Linux (como 3.x) já têm esses drivers disponíveis, ou de outra forma fornecem versões backported desses drivers com seus kernels.

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

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

Se for necessário um kernel personalizado, recomendamos uma versão recente do kernel (como 3.8+). Para distribuições ou fornecedores que mantêm seu próprio kernel, você precisa fazer backport regularmente dos drivers LIS do kernel upstream para o kernel personalizado.

Mesmo que você já esteja executando uma versão relativamente recente do kernel, é altamente recomendável manter o controle de quaisquer correções upstream nos drivers LIS e backportá-los conforme necessário. Os locais dos arquivos de origem do driver LIS são especificados no arquivo 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 ser completa para todas as distribuições.

Agente Linux do Azure

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

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

  • O agente Linux é lançado sob a licença Apache 2.0. Muitas distribuições já fornecem pacotes .rpm ou .deb para o agente. Você pode facilmente instalar e atualizar esses pacotes.
  • O Agente Linux do Azure requer Python v2.6+.
  • O agente também requer o python-pyasn1 módulo. A maioria das distribuições fornece este módulo como um pacote separado a ser instalado.
  • Em alguns casos, o Agente Linux do Azure 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. Nesses casos, o agente desinstalará o NetworkManager quando você instalar o pacote do agente Linux.
  • O Agente Linux do Azure deve estar na versão mínima suportada ou acima dela.

Nota

Certifique-se de que os udf módulos e vfat estão ativados. A desativação do udf módulo causará uma falha de provisionamento. A desativação do vfat módulo causará falhas de provisionamento e inicialização. A versão 21.2 ou posterior do Cloud-init pode provisionar VMs sem exigir UDF se ambas as condições 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 GRUB2 para incluir os seguintes parâmetros, para que todas as mensagens do console sejam enviadas para a primeira porta serial. Essas mensagens podem ajudar o suporte do Azure com a depuração de quaisquer problemas.

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

    Também recomendamos a remoção dos seguintes parâmetros, se existirem:

    rhgb quiet crashkernel=auto
    

    A inicialização gráfica e silenciosa não é útil em um ambiente de nuvem, onde você deseja que todos os logs sejam enviados para a porta serial. Você pode deixar a crashkernel opção configurada, se necessário, mas esse 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 tamanhos menores de VM.

  2. Depois de concluir a edição do /etc/default/grub, execute 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. Essa configuração geralmente é o padrão.

  5. Instale o Agente Linux do Azure.

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

    Nota

    Certifique-se de que os udf módulos e vfat estão ativados. Removê-los ou desativá-los causará uma falha de provisionamento ou inicialização. Cloud-init versão 21.2 ou posterior remove o requisito UDF.

    Instale o Agente Linux do Azure, cloud-init e outros utilitários necessários 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 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 permuta no disco do SO.

    Você pode usar o Agente Linux do Azure ou cloud-init para configurar o espaço de permuta por meio do disco de recursos 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 Linux do Azure, modifique 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 você escolher cloud-init, configure cloud-init para lidar com 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, você tem duas opções:

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

    Crie um arquivo .cfg para configurar o espaço de permuta 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 lidar com o provisionamento:

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

    2. Configurar montagens:

      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 arquivo de permuta existente se você configurou 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 registro em log de inicialização na nuvem:

      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 você 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á 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, você pode ver uma mensagem de erro depois de executar waagent -force -deprovision que diz [Errno 5] Input/output error. Essa mensagem de erro não é crítica e você pode ignorá-la.

  9. Desligue a máquina virtual e carregue o VHD no Azure.

Próximos passos

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