Preparar um VHD do Debian para o Azure

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

Pré-requisitos

Esta seção pressupõe que você já instalou um sistema operacional Linux Debian a partir de um arquivo .iso baixado do site do Debian para um VHD (disco rígido virtual). Existem várias ferramentas para criar arquivos .vhd. O Hyper-V é apenas um exemplo. Para obter instruções sobre como usar o Hyper-V, consulte Instalar a função Hyper-V e configurar uma VM (máquina virtual).

Notas de instalação

Importante

A preparação remota do NVMe neste artigo é opcional. Conclua-a somente se você estiver criando uma imagem que pretende implantar com um controlador de disco NVMe remoto. Se a VM de destino usar SCSI, ignore a seção NVMe remota e mantenha as configurações padrão. O NVMe remoto exige uma imagem Gen2. Antes de criar uma imagem NVMe, verifique se a versão do Debian está listada em imagens do sistema operacional com suporte para NVMe remoto e se o tamanho exato da VM de destino anuncia NVMe em sua DiskControllerTypes funcionalidade.

  • Para obter mais dicas sobre como preparar o Linux para o Azure, veja Notas gerais de instalação do Linux.
  • Não há suporte para o formato VHDX mais recente no Azure. Você pode converter o disco em formato VHD usando o Gerenciador do Hyper-V ou o cmdlet convert-vhd.
  • Ao instalar o sistema Linux, recomendamos utilizar partições-padrão em vez do gerenciador de volume lógico (LVM), que geralmente é o padrão para muitas instalações. O uso de partições evita conflitos de nome LVM com VMs clonadas, especialmente se um disco do sistema operacional precisar ser anexado a outra VM para solução de problemas. LVM ou RAID também podem ser usados em discos de dados.
  • Não configure uma partição de permuta no disco do sistema operacional. O agente Linux do Azure pode ser configurado para criar um arquivo de permuta no disco de recursos temporários. Essa informação está disponível nas etapas a seguir.
  • Todos os VHDs no Azure devem ter um tamanho virtual alinhado a 1 MB. Ao converter de um disco não processado para VHD, certifique-se de que o tamanho do disco não processado seja um múltiplo de 1 MB antes da conversão. Para obter mais informações, consulte Notas de Instalação do Linux.

Importante

As diretrizes de troca que usam o disco de recurso temporário se aplicam somente a tamanhos de VM que incluem armazenamento temporário local. O tipo de controlador de disco remoto, SCSI ou NVMe, não determina se um disco de recurso está disponível.

Preparar uma imagem do Debian para o Azure

É possível criar uma imagem base da nuvem do Debian do Azure usando um construtor de imagens de nuvem do FAI (instalação totalmente automática). Para preparar uma imagem sem FAI, confira o artigo etapas genéricas.

Os seguintes comandos git clone e de instalação com apt foram extraídos do repositório de imagens em nuvem do Debian. Comece clonando o repositório e instalando dependências:

$ git clone https://salsa.debian.org/cloud-team/debian-cloud-images.git
$ sudo apt install --no-install-recommends ca-certificates debsums dosfstools \
    fai-server fai-setup-storage make python3 python3-libcloud python3-marshmallow \
    python3-pytest python3-yaml qemu-utils udev
$ cd ./debian-cloud-images

Opcional: Personalize a compilação adicionando scripts (por exemplo, scripts de shell) à ./config_space/scripts/AZURE.

Exemplo de script para personalizar a imagem

$ mkdir -p ./config_space/scripts/AZURE
$ cat > ./config_space/scripts/AZURE/10-custom <<EOF
#!/bin/bash

\$ROOTCMD bash -c "echo test > /usr/local/share/testing"
EOF
$ sudo chmod 755 ./config_space/scripts/AZURE/10-custom

Adicione o prefixo $ROOTCMD a todos os comandos que você deseja usar para personalizar a imagem. É conhecido pelo alias chroot $target.

Validar a configuração do disco Debian

Para ambas as imagens SCSI e NVMe, adicione um script de personalização FAI que valide /etc/fstab e rejeite nomes de disco não persistentes:

$ cat > ./config_space/scripts/AZURE/15-storage-validation <<'EOF'
#!/bin/bash
set -eu

$ROOTCMD findmnt --verify --verbose

if $ROOTCMD grep -Eq '^[[:space:]]*[^#].*[[:space:]]/dev/(sd|nvme)' /etc/fstab; then
    echo 'Replace /dev/sd* and /dev/nvme* entries in /etc/fstab with UUIDs or another persistent identifier.' >&2
    exit 1
fi
EOF
$ sudo chmod 755 ./config_space/scripts/AZURE/15-storage-validation

Preparar a imagem de Debian para NVMe remoto

Conclua esta seção somente se você estiver criando uma imagem para um controlador de disco NVMe remoto. Caso contrário, continue a criar a imagem Azure Debian sem adicionar esse script.

Adicione outro script de personalização de FAI antes de criar a imagem NVMe. O script disponibiliza os drivers NVMe durante a inicialização antecipada e define o tempo limite de E/S do NVMe Azure.

$ cat > ./config_space/scripts/AZURE/20-nvme <<'EOF'
#!/bin/bash
set -eu

$ROOTCMD bash -c "printf '%s\n' nvme nvme_core >> /etc/initramfs-tools/modules"
$ROOTCMD update-initramfs -u -k all
$ROOTCMD sed -i '/^GRUB_CMDLINE_LINUX_DEFAULT=/ s/"$/ nvme_core.io_timeout=240"/' /etc/default/grub
$ROOTCMD update-grub

$ROOTCMD modinfo nvme
$ROOTCMD modinfo nvme_core
$ROOTCMD bash -c "lsinitramfs /boot/initrd.img-\$(ls /lib/modules | sort -V | tail -1) | grep -Eq 'nvme(_core)?\\.ko'"
EOF
$ sudo chmod 755 ./config_space/scripts/AZURE/20-nvme

Importante

Revise a linha de comando do GRUB gerada e /etc/initramfs-tools/modules para verificar se há entradas duplicadas, caso sua configuração do FAI já defina esses valores. Ambos nvme e nvme_core devem estar presentes nos initramfs gerados.

Criar uma imagem do Debian do Azure

$ make image_[release]_azure_amd64

Este comando gera como saída diversos arquivos no diretório atual, sobretudo o arquivo de imagem image_[release]_azure_amd64.raw.

Converta a imagem bruta em VHD para o Azure:

rawdisk="image_[release]_azure_amd64.raw"
vhddisk="image_[release]_azure_amd64.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))
rounded_size_adjusted=$(($rounded_size + 512))

echo "Rounded Size Adjusted = $rounded_size_adjusted"

sudo qemu-img resize "$rawdisk" $rounded_size
qemu-img convert -f raw -o subformat=fixed,force_size -O vpc "$rawdisk" "$vhddisk"

Esse processo cria um VHD image_[release]_azure_amd64.vhd com um tamanho arredondado para que ele possa ser copiado com êxito para um disco do Azure.

Observação

Em vez de clonar o repositório salsa e gerar imagens localmente, as imagens estáveis atuais podem ser geradas e baixadas a partir do FAI.

Depois de criar uma imagem VHD estável do Debian e antes de carregar, verifique se os seguintes pacotes estão instalados:

sudo apt update
sudo apt install hyperv-daemons
sudo apt install waagent # *(Optional but recommended for password resets and the use of extensions)*
sudo apt-get install cloud-init

Em seguida, execute uma atualização completa:

sudo apt full-upgrade

Agora, os recursos do Azure precisam ser criados para essa imagem. Este exemplo usa a variável $rounded_size_adjusted, portanto, ela deve ser de dentro do mesmo processo de shell da etapa anterior.

Defina a geração Hyper-V antes de criar o disco gerenciado. O exemplo define V1 como padrão para uma imagem SCSI padrão. Só altere para V2 se você concluir a seção de preparação do NVMe remota ou preparar uma imagem de Geração 2.

HYPER_V_GENERATION=V1

az group create -l $LOCATION -n $RG

az disk create \
    -n $DISK \
    -g $RG \
    -l $LOCATION \
    --for-upload --upload-size-bytes "$rounded_size_adjusted" \
    --sku standard_lrs --hyper-v-generation $HYPER_V_GENERATION

ACCESS=$(az disk grant-access \
    -n $DISK -g $RG \
    --access-level write \
    --duration-in-seconds 86400 \
    --query accessSas -o tsv)

azcopy copy "$vhddisk" "$ACCESS" --blob-type PageBlob

az disk revoke-access -n $DISK -g $RG
az image create \
    -g $RG \
    -n $IMAGE \
    --os-type linux \
    --hyper-v-generation $HYPER_V_GENERATION \
    --source $(az disk show \
        -g $RG \
        -n $DISK \
        --query id -o tsv)
az vm create \
    -g $RG \
    -n $VM \
    --ssh-key-value $SSH_KEY_VALUE \
    --public-ip-address-dns-name $VM \
    --image $(az image show \
        -g $RG \
        -n $IMAGE \
        --query id -o tsv)

Se a largura de banda entre sua máquina local e o disco do Azure estiver fazendo com que o upload com azcopy demore muito, você pode usar uma VM jumpbox no Azure para acelerar o processo. Veja como esse processo pode ser feito:

  1. Crie um arquivo tar com o VHD na sua máquina local: tar -czvf ./image_buster_azure_amd64.vhd.tar.gz ./image_[release]_azure_amd64.vhd.
  2. Crie uma VM do Linux no Azure (usando a distribuição de sua escolha). Verifique se ela foi criada com um disco grande o suficiente para conter o VHD extraído.
  3. Baixe um utilitário azcopy para a VM do Linux no Azure. Você pode obtê-lo em Introdução ao AzCopy.
  4. Copie o tarball para a VM: scp ./image_buster_azure_amd64.vhd.tar.gz <vm>:~.
  5. Na VM, extraia o VHD: tar -xf ./image_buster_azure_amd64.vhd.tar.gz. Essa etapa leva um pouco de tempo, com base no tamanho do arquivo.
  6. Por fim, na VM, copie o VHD para o disco do Azure usando azcopy (o comando anterior).

Agora você está pronto para usar o VHD do Debian Linux para criar VMs no Azure. Se esta é a primeira vez que você está carregando o arquivo .vhd para o Azure, consulte Criar uma VM do Linux a partir de um disco personalizado.

Para uma VM Azure existente que você precisa mover do SCSI para o NVMe, use Converter Linux e Windows VMs do SCSI para o NVMe. Para obter informações de arquitetura e suporte, consulte a visão geral do NVMe.