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:
Faça backup da imagem initrd existente:
cd /boot sudo cp initrd-`uname -r`.img initrd-`uname -r`.img.bak
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.
Redimensionar o VHD diretamente usando ferramentas como
qemu-img
ouvbox-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
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"
Redimensione o disco bruto usando
$rounded_size
:sudo qemu-img resize MyLinuxVM.raw $rounded_size
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.
- ata_piix: adiar 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: Desative WRITE SAME para RAID e drivers de adaptador de host virtual
- storvsc: correção de desreferência de ponteiro NULL
- storvsc: falhas de buffer de anel podem resultar em congelamento de E/S
- scsi_sysfs: proteger contra a dupla execução de __scsi_remove_device
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
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.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
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
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.
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 evfat
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
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
- Passe uma configuração cloud-init sempre que criar uma VM através do
Configure o cloud-init para lidar com o provisionamento:
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 .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 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
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
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.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