Preparar o Linux para criação de imagens no Azure
Cuidado
Este artigo faz referência ao CentOS, uma distribuição Linux que está em status de fim do serviço (EOL). 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:
- Distribuições endossadas do Linux no Azure
- Suporte para Linux e tecnologia de código aberto no Azure
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
:
Faça o backup da imagem initrd existente:
cd /boot sudo cp initrd-`uname -r`.img initrd-`uname -r`.img.bak
Recrie o initrd usando os módulos
hv_vmbus
ehv_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.
Redimensionar o VHD diretamente, usando ferramentas como
qemu-img
ouvbox-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
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"
Redimensione o disco não formatado usando
$rounded_size
:sudo qemu-img resize MyLinuxVM.raw $rounded_size
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.
- ata_piix: adie os discos para os drivers Hyper-V por padrão
- storvsc: conta para pacotes em trânsito no caminho RESET
- storvsc: evite o uso de WRITE_SAME
- storvsc: desabilite WRITE SAME para RAID e drivers do adaptador de host virtual
- storvsc: correção de desreferência de ponteiro NULL
- storvsc: as falhas do buffer de anéis podem resultar em congelamento de E/S
- scsi_sysfs: proteger contra a execução dupla de __scsi_remove_device
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
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.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
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
Confira se o servidor SSH está instalado e configurado para iniciar no tempo de inicialização. Essa configuração geralmente é a padrão.
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
ouwalinuxagent
. 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
evfat
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
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-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 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:
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
- Transmitir uma configuração do cloud-init a cada vez que você criar uma VM por meio de
Configurar o cloud-init para lidar com o provisionamento:
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.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
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
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
Configurar o registro em log 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
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.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