為 Azure 準備 Debian VHD

適用於:✔️ Linux 虛擬機 ✔️ 彈性規模設定

Prerequisites

本節假設你已從 Debian 網站 下載的 .iso 檔案安裝 Debian Linux 作業系統到虛擬硬碟(VHD)。 有多項工具可用來建立 .vhd 檔案。 Hyper-V 只是其中一個例子。 關於如何使用 Hyper-V,請參見「安裝 Hyper-V 角色並設定虛擬機(VM)」。

安裝附註

Important

本文中遠端 NVMe 準備是可選的。 只有在您要建立將搭配遠端 NVMe 磁碟控制器部署的映像檔時,才需填寫此項。 如果目標虛擬機使用 SCSI,則跳過遠端 NVMe 區段,保留標準設定。 遠端 NVMe 需要 Gen2 映像檔。 在建立 NVMe 映像檔前,請確認 Debian 版本是否列在 遠端 NVMe 支援的作業系統映像檔 中,且目標虛擬機大小是否標示 NVMe 具備其 DiskControllerTypes 功能。

  • 如需準備 Linux 以供 Azure 使用的更多秘訣,請參閱一般 Linux 安裝注意事項。
  • 較新的 VHDX 格式在 Azure 中不支援。 您可以使用 Hyper-V 管理員或 convert-vhd Cmdlet 將磁碟轉換為 VHD 格式。
  • 在安裝 Linux 系統時,建議您使用標準磁碟分割,而不是許多安裝預設使用的邏輯磁碟區管理員 (LVM)。 使用分割區可避免與複製虛擬機發生 LVM 名稱衝突,特別是當作業系統磁碟需要連接到另一台虛擬機進行故障排除時。 LVM 或 RAID 也可以用於資料磁碟。
  • 不要在作業系統磁碟上設定交換分割區。 Azure Linux 代理程式可以設定在暫存資源磁碟上建立交換檔案。 更多資訊可參考以下步驟。
  • Azure 上的所有 VHD 必須具有與 1 MB 對應的虛擬大小。 從原始磁碟轉換成 VHD 時,您必須在轉換前先確保原始磁碟大小是 1 MB 的倍數。 如需詳細資訊,請參閱 Linux 安裝注意事項。

Important

使用暫存資源磁碟的交換指引僅適用於包含本地暫存儲存的虛擬機大小。 遠端磁碟控制器類型(SCSI 或 NVMe)並不決定是否有資源磁碟可用。

為 Azure 準備 Debian 映像

你可以用全自動安裝(FAI)雲端映像建構器建立基礎的 Azure Debian 雲端映像檔。 要製作沒有FAI的圖片,請參考 通用步驟文章。

以下的 git clone 和 apt 安裝指令是從 Debian 雲端映像庫中擷取的。 先從複製倉庫並安裝相依性開始:

$ 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

可選:將腳本(例如 Shell 指令碼)新增至 ./config_space/scripts/AZURE,以自訂建置。

自訂影像的腳本範例

$ 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

請在您要用來自訂映像的任何命令前面加上$ROOTCMD。 它被別名為 chroot $target。

驗證 Debian 磁碟配置

對於 SCSI 與 NVMe 映像檔,請新增一個 FAI 自訂腳本,以驗證 /etc/fstab 並拒絕非永久性磁碟名稱:

$ 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

準備 Debian 映像檔以供遠端 NVMe 使用。

只有 當你正在為遠端 NVMe 磁碟控制器建立映像檔時,才請完成此部分。 否則,繼續建置 Azure Debian 映像檔,但不加這個腳本。

在建立 NVMe 映像前,先再加一個 FAI 自訂腳本。 此腳本會讓 NVMe 驅動程式在早期開機期間可用,並設定 Azure NVMe I/O 逾時值。

$ 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

Important

檢查產生的 GRUB 命令列,並 /etc/initramfs-tools/modules 檢查是否有重複項目,如果 FAI 設定已經設定了這些數值。 在產生的 initramfs 中,nvme 和 nvme_core 都必須存在。

建置 Azure Debian 映像

$ make image_[release]_azure_amd64

此指令會輸出目前目錄中的幾個檔案,最顯著的是 image_[release]_azure_amd64.raw 影像檔。

將原始影像轉成 Azure 的 VHD:

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"

此程序會建立一個大小經過四捨五入的 VHD image_[release]_azure_amd64.vhd,以便能夠成功複製到 Azure 磁碟。

Note

與其複製莎莎醬倉庫並在本地建置映像檔,不如直接從 FAI 建立並下載現有的穩定映像檔。

在建立穩定的 Debian VHD 映像檔並上傳前,請確認以下套件已安裝:

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

接著進行完整升級:

sudo apt full-upgrade

現在必須為這個映像建立 Azure 資源。 這個範例使用了 $rounded_size_adjusted 變數,因此它應該來自前一步驟中的同一個 shell 行程。

在建立管理磁碟前,先設定 Hyper-V 世代。 範例預設會使用 V1 作為標準 SCSI 映像檔。 僅在您已完成遠端 NVMe 準備章節,或另外準備了第 2 代映像時,才將其變更為 V2。

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)

如果從本機到 Azure 磁碟的頻寬,導致使用 azcopy 處理上傳作業耗時過久,你可以使用 Azure VM 跳板機來加快此流程。 這個過程可以如何進行:

  1. 在你本地機器上建立一個 VHD 的 tarball: tar -czvf ./image_buster_azure_amd64.vhd.tar.gz ./image_[release]_azure_amd64.vhd。
  2. 建立一個 Azure Linux 虛擬機(你選擇的發行版)。 請確保建立時使用容量足夠大的磁碟,以容納擷取出的 VHD。
  3. 將這個azcopy工具下載到 Azure Linux 虛擬機。 你可以從 Get Start with AzCopy 取得。
  4. 將 tar 封存檔複製到 VM:scp ./image_buster_azure_amd64.vhd.tar.gz <vm>:~。
  5. 在 VM 上,擷取出 VHD:tar -xf ./image_buster_azure_amd64.vhd.tar.gz。 這步驟會根據檔案大小花費一些時間。
  6. 最後,在虛擬機上,用(前述指令)將 VHD 複製到 Azure 磁碟azcopy。

你現在準備好用你的 Debian Linux VHD 在 Azure 中建立新的虛擬機了。 如果這是您第一次將 .vhd 檔案上傳至 Azure,請參閱從自訂磁碟建立 Linux 虛擬機器。

對於需要從 SCSI 轉移到 NVMe 的現有 Azure 虛擬機,請使用 Convert Linux 和 Windows 虛擬機從 SCSI 轉到 NVMe。 有關架構與支援資訊,請參閱 NVMe 概述。