社群支援和非背書散發套件的資訊

適用於:✔️ Linux VM ✔️ 彈性擴展集

只有使用其中一個背書散發套件時,Azure 平台 SLA 才適用於執行 Linux OS 的虛擬機器。 對於這些背書的發行版本,預先設定的 Linux 映像均可在 Azure Marketplace 中取得。

在 Azure 上執行的所有其他非 Azure Marketplace 散發套件都有一些必要條件。 本文無法完整詳述,因為每個發行版本都不同。 即使您符合下列所有準則,還是可能需要對您的 Linux 系統進行大幅調整,以使其正常執行。

本文將著重於在 Azure 上執行 Linux 發行版本時的一般指導。

一般 Linux 安裝注意事項

  1. Azure 中不支援 Hyper-V 虛擬硬碟 (VHDX) 格式,只支援「固定 VHD」。 您可以使用 Hyper-V 管理員或 Convert-VHD \(英文\) Cmdlet,將磁碟轉換為 VHD 格式。 如果您使用的是 VirtualBox,即會在建立磁碟時選取 [固定大小] 而不是預設值 (動態配置的)。

  2. Azure 支援 Gen1 (BIOS 開機) & Gen2 (UEFI 開機) 虛擬機器。

  3. 允許的 VHD 大小上限為 1023 GB。

  4. 安裝 Linux 系統時,建議您使用標準磁碟分割而不是邏輯磁碟區管理員 (LVM),此為許多安裝的預設值。 使用標準磁碟分割將可避免 LVM 名稱與複製的 VM 發生衝突,特別是為了疑難排解而一律要將 OS 磁碟連接至另一個相同的 VM 時。 如果願意,您可以在資料磁碟上使用 LVMRAID

  5. 需要裝載 UDF 檔案系統的核心支援。 在 Azure 上第一次開機時,會使用連接客體的 UDF 格式媒體,將佈建設定傳遞至 Linux VM。 Azure Linux 代理程式必須裝載 UDF 檔案系統,才能讀取其設定並佈建 VM。

  6. 早於 2.6.37 的 Linux 核心版本不支援具較大 VM 大小之 Hyper-V 上的 NUMA。 這個問題主要會影響使用上游 Red Hat 2.6.32 核心的較舊發行版本,而且已在 Red Hat Enterprise Linux (RHEL) 6.6 (kernel-2.6.32-504) 中加以修正。 執行的自訂核心是 2.6.37 以前版本的系統,或 2.6.32-504 以前的 RHEL 型核心必須在 grub.conf 的核心命令列上設定開機參數 numa=off。 如需詳細資訊,請參閱 Red Hat KB 436883 \(英文\)。

  7. 請勿在 OS 磁碟上設定交換磁碟分割。 您可以設定 Linux 代理程式,在暫存資源磁碟上建立交換檔,如下列步驟中所述。

  8. Azure 上的所有 VHD 必須具有與 1 MB (1024 × 1024 位元組) 對應的虛擬大小。 從原始磁碟轉換為 VHD 時,您必須在轉換前先確定原始磁碟大小是 1 MB 的倍數,如下列步驟中所述。

  9. 使用最新的散發套件版本、套件和軟體。

  10. 移除使用者和系統帳戶、公開金鑰、敏感性資料、不必要的軟體和應用程式。

安裝不含 Hyper-V 的核心模組

Azure 會在 Hyper-V Hypervisor 上執行,因此 Linux 要求在 Azure 中執行某些核心模組。 如果您的 VM 是在 Hyper-V 外部建立的,除非 VM 偵測到其執行環境為 Hyper-V 環境,否則 Linux 安裝程式在初始的 ramdisk (initrd 或 initramfs) 中可能不會包含 Hyper-V 的驅動程式。 使用不同的虛擬化系統 (例如 VirtualBox、KVM 等等) 來準備您的 Linux 映像時,可能需要重新建置 initrd,因此,在初始的 ramdisk 上至少有 hv_vmbus 和 hv_storvsc 核心模組可供使用。 這個已知問題適用於以上游 Red Hat 發行版本為基礎的系統,而且可能還有其他系統。

重新建置 initrd 或 initramfs 映像的機制會根據散發套件而有所不同。 請參閱散發套件的文件或洽支援人員,以了解適當程序。 以下是使用 mkinitrd 公用程式重新建置 initrd 的範例之一:

  1. 備份現有的 initrd 映像:

    cd /boot
    sudo cp initrd-`uname -r`.img  initrd-`uname -r`.img.bak
    
  2. 使用 hv_vmbushv_storvsc 核心模組重新建置 initrd

    sudo mkinitrd --preload=hv_storvsc --preload=hv_vmbus -v -f initrd-`uname -r`.img `uname -r`
    

調整 VHD 的大小

Azure 上的 VHD 映像必須具有與 1 MB 對齊的虛擬大小。 一般而言,使用 Hyper-V 建立的 VHD 均會正確地對應儲存。 如果 VHD 並未正確地對應儲存,則當您嘗試從 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).

在此案例中,您可以使用 Hyper-V 管理員主控台或 Resize-VHD \(英文\) PowerShell Cmdlet 來調整 VM 的大小。 如果您不是在 Windows 環境中執行,建議使用 qemu-img 來轉換 VHD (如果需要) 並調整其大小。

注意

qemu-img 版本 >=2.2.1 中已知的錯誤會導致 VHD 的格式不正確。 此問題已在 QEMU 2.6 中修正。 我們建議使用 qemu-img 2.2.0 或更早版本,或是 2.6 或更新版本。

  1. 直接使用工具 (例如 qemu-imgvbox-manage) 調整 VHD 的大小,可能會導致 VHD 無法開機。 我們建議先將 VHD 轉換為 RAW 磁碟映像。 如果已將 VM 映像建立為 RAW 磁碟映像 (有些 Hypervisor 的預設值,例如 KVM),則您可以省略此步驟。

    qemu-img convert -f vpc -O raw MyLinuxVM.vhd MyLinuxVM.raw
    
  2. 計算所需的磁碟映像大小,如此一來,虛擬大小即會對應儲存為 1 MB。 下列 Bash 殼層指令碼會使用 qemu-img info 來判斷磁碟映像的虛擬大小,然後計算到下一個 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. 使用 $rounded_size 調整原始磁碟,如上方所設定。

    qemu-img resize MyLinuxVM.raw $rounded_size
    
  4. 現在,將 RAW 磁碟轉換回固定大小的 VHD。

    qemu-img convert -f raw -o subformat=fixed -O vpc MyLinuxVM.raw MyLinuxVM.vhd
    

    或者,使用 qemu 版本 2.6+,包含 force_size 選項。

    qemu-img convert -f raw -o subformat=fixed,force_size -O vpc MyLinuxVM.raw MyLinuxVM.vhd
    

Linux Kernel 需求

適用於 Hyper-V 和 Azure 的 Linux Integration Services (LIS) 驅動程式會直接提供給上游 Linux Kernel。 許多包括最新 Linux 核心版本 (例如 3.x) 的發行版本已經有這些驅動程式可供使用,或透過其核心來提供這些驅動程式的向後移植版本。 在上游核心中會透過新的修正和功能不斷更新這些驅動程式,因此,如果可能,建議您執行包含這些修正與更新的背書發行版本

如果您執行的是 Red Hat Enterprise Linux 版本 6.0 到 6.3 的變體,則您必須安裝 Hyper-V 的最新 LIS 驅動程式。 從 RHEL 6.4+ (及衍生項目) 開始,核心就已經隨附 LIS 驅動程式,因此無需額外的安裝套件。

如果需要自訂核心,建議您使用最新的核心版本 (例如 3.8+)。 針對發行版本或自行維護核心的廠商,您需要定期將 LIS 驅動程式從上游核心向後移植到您的自訂核心。 即使您已經在執行相對較新的核心版本,還是強烈建議您持續追蹤 LIS 驅動程式中的任何上游修正,並視需要向後移植它們。 LIS 驅動程式原始程式檔的位置均指定於 Linux 核心來源樹狀目錄的 MAINTAINERS 檔案中:

    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/

下列修補程式必須隨附於核心中。 對於所有發行版本而言,此清單並不完整。

Azure Linux 代理程式

Azure Linux 代理程式waagent 會在 Azure 中佈建 Linux 虛擬機器。 您可以在 Linux 代理程式 GitHub 存放庫 \(英文\) 中取得最新版本、檔案問題或提交提取要求。

  • Linux 代理程式已在 Apache 2.0 授權下發行。 許多散發套件都已經提供代理程式的 RPM 或 Deb 套件,而這些套件均可輕鬆進行安裝及更新。
  • Azure Linux 代理程式需要 Python v2.6+。
  • 代理程式還需要 python-pyasn1 模組。 大多數的發行版本都會以可個別安裝的套件形式提供此模組。
  • 在某些情況下,Azure Linux 代理程式可能與 NetworkManager 不相容。 散發套件所提供的許多 RPM/deb 套件都會將 NetworkManager 設定為與 waagent 套件的衝突。 在這些情況下,當您安裝 Linux 代理程式套件時,將會解除安裝 NetworkManager。
  • Azure Linux 代理程式必須等於或高於最小支援版本

注意

確定已啟用 'udf' (cloud-init >= 21.2) 和 'vfat' 模組。 封鎖列出 udf 模組會導致佈建失敗,而將 vfat 模組加入黑名單會導致佈建和開機失敗。 Cloud-init < 21.2 不會受到影響,而且不需要這項變更。

一般的 Linux 系統需求

  1. 修改 GRUB 或 GRUB2 中的核心開機行以包含下列參數,如此便會將所有主控台訊息傳送到第一個序列埠。 這些訊息均可協助 Azure 支援來偵錯任何問題。

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

    我們也建議「移除」下列參數 (如果有的話)。

    rhgb quiet crashkernel=auto
    

    在雲端環境中,我們想要將所有記錄傳送到序列埠,因此不適合使用圖形化和無訊息開機。 您可以視需要保留 crashkernel 選項的設定,但請注意,此參數會減少 VM 中至少 128 MB 的可用記憶體數量,這在較小的 VM 大小中可能是個問題。

  2. 在您完成編輯 /etc/default/grub 之後,請執行下列命令以重建 grub 設定:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  3. 為 initrd 和 initramfs 指示 (Dracut) 新增 Hyper-V 模組。

  4. 重建 initrd 或 initramfs Initramfs

    cp /boot/initramfs-$(uname -r).img /boot/initramfs-[latest kernel version ].img.bak 
    dracut -f -v /boot/initramfs-[latest kernel version ].img  [depending on the version of grub] 
    grub-mkconfig -o /boot/grub/grub.cfg 
    grub2-mkconfig -o /boot/grub2/grub.cfg 
    

    Initrd

    mv /boot/[initrd kernel] /boot/[initrd kernel]-old 
    mkinitrd /boot/initrd.img-[initrd kernel]-generic /boot/[initrd kernel]-generic-old 
    update-initramfs -c -k [initrd kernel] 
    update-grub 
    
  5. 確定 SSH 伺服器已安裝並設定為在開機時啟動。 此設定通常是預設值。

  6. 安裝 Azure Linux 代理程式。 如需在 Azure 上佈建 Linux 映像,您需要 Azure Linux 代理程式。 許多發行版本都會以 RPM 或 .deb 套件 (此套件通常稱為 WALinuxAgent 或 walinuxagent) 的形式提供代理程式。 您也可以遵循 Linux 代理程式指南中的步驟來手動安裝代理程式。

    執行下列命令,以安裝 Azure Linux 代理程式、cloud-init 和其他必要的公用程式:

    Redhat/Centos

    sudo yum install -y [waagent] cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    Ubuntu/Debian

    sudo apt install walinuxagent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    Suse

    sudo zypper install python-azure-agent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    

    然後使用下列方式,在所有散發套件上啟用代理程式和 cloud-init:

    sudo systemctl enable waagent.service
    sudo systemctl enable cloud-init.service
    
  7. 請不要在 OS 磁碟上建立交換空間。 Azure Linux 代理程式可在 VM 佈建於 Azure 後,使用附加至 VM 的本機資源磁碟自動設定交換空間。 本機資源磁碟是「暫存」磁碟,可能會在 VM 取消佈建時清空。 安裝 Azure Linux 代理程式之後,視需要在 /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.
    
  8. 設定 cloud-init 來處理佈建:

    1. 設定 cloud-init 的 waagent:
      sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=cloud-init/g' /etc/waagent.conf
      sed -i 's/ResourceDisk.Format=y/ResourceDisk.Format=n/g' /etc/waagent.conf
      sed -i 's/ResourceDisk.EnableSwap=y/ResourceDisk.EnableSwap=n/g' /etc/waagent.conf
      
      如果您要遷移特定的虛擬機器,但不想建立一般化映像,請在 /etc/waagent.conf 設定中設定 Provisioning.Agent=disabled
    2. 設定掛接:
      echo "Adding mounts and disk_setup to init stage"
      sed -i '/ - mounts/d' /etc/cloud/cloud.cfg
      sed -i '/ - disk_setup/d' /etc/cloud/cloud.cfg
      sed -i '/cloud_init_modules/a\\ - mounts' /etc/cloud/cloud.cfg
      sed -i '/cloud_init_modules/a\\ - disk_setup' /etc/cloud/cloud.cfg
      
    3. 設定 Azure 資料庫:
      echo "Allow only Azure datasource, disable fetching network setting via IMDS"
      cat > /etc/cloud/cloud.cfg.d/91-azure_datasource.cfg <<EOF
      datasource_list: [ Azure ]
      datasource:
         Azure:
           apply_network_config: False
      EOF
      
    4. 如果已設定,請移除現有的 swapfile:
      if [[ -f /mnt/resource/swapfile ]]; then
      echo "Removing swapfile" #RHEL uses a swapfile by defaul
      swapoff /mnt/resource/swapfile
      rm /mnt/resource/swapfile -f
      fi
      
  9. 設定 cloud-init 記錄:

    echo "Add console log file"
    cat >> /etc/cloud/cloud.cfg.d/05_logging.cfg <<EOF
    
    # 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
    
  10. 交換設定。 請勿在作業系統磁碟上建立交換空間。 在過去,Azure Linux 代理程式會在虛擬機器佈建於 Azure 後,使用連結至虛擬機器的本機資源磁碟自動設定交換空間。 不過,cloud-init 現在已處理此情況,您不得使用 Linux 代理程式來格式化資源磁碟建立分頁檔,並在 /etc/waagent.conf 中適當地修改下列參數:

    ResourceDisk.Format=n
    ResourceDisk.EnableSwap=n
    

    如果您想要掛接、格式化及建立交換,可以:1. 每次透過 customdata 建立 VM 時,以 cloud-init 設定形式將此傳入。 這是建議的方法。 2. 使用模擬到映像中的 cloud-init 指示詞,每次建立 VM 時都會執行此動作。

           echo 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' >> /etc/systemd/system.conf
           cat > /etc/cloud/cloud.cfg.d/00-azure-swap.cfg << EOF
           #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"]
             - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
           EOF
    
         ```
    
    
  11. 取消佈建。

    警告

    如果您要遷移特定的虛擬機器,但不想建立一般化映像,請略過取消佈建步驟。 執行 waagent -force -deprovision+user 命令會轉譯無法使用的來源電腦,此步驟僅供建立一般化映像。

    執行下列命令以取消佈建虛擬機器。

    # sudo rm -f /var/log/waagent.log
    # sudo cloud-init clean
    # waagent -force -deprovision+user
    # rm -f ~/.bash_history
    # export HISTSIZE=0
    # logout
    

    注意

    在 Virtualbox 上,您可能會在執行 waagent -force -deprovision 之後看到下列錯誤,指出 [Errno 5] Input/output error。 此錯誤訊息並不重要,您可以忽略。

  12. 關閉虛擬機器,並將 VHD 上傳至 Azure。

後續步驟

使用 Azure CLI 從自訂磁碟建立 Linux VM