为 Azure 准备基于 Red Hat 的虚拟机

适用于:✔️ Linux VM ✔️ 灵活规模集 ✔️ 统一规模集

本文介绍如何准备 Red Hat Enterprise Linux (RHEL) 虚拟机 (VM),以供在 Azure 中使用。 本文介绍的 RHEL 版本为 7.X、8.X 和 9.X。 本文所述的用于准备工作的虚拟机监控程序为 Hyper-V、基于内核的 VM (KVM)、VMware 和 Kickstart。

有关参与 Red Hat 云访问计划的资格要求的详细信息,请参阅 Red Hat Cloud Access 网站在 Azure 上运行 RHEL。 有关自动构建 RHEL 映像的方法,请参阅 Azure 映像生成器

注意

请注意已终止生命周期 (EOL) 且不再受 Red Hat 支持的版本。 在合理的业务努力基础上,支持处于或超出 EOL 的上传映像。 有关详细信息,请参阅 Red Hat 产品生命周期

先决条件

本部分假定已经从 Red Hat 网站获取 ISO 文件并将 RHEL 映像安装到虚拟硬盘 (VHD)。 有关如何使用 Hyper-V 管理器来安装操作系统映像的详细信息,请参阅安装 Hyper-V 角色和配置虚拟机

RHEL 安装说明

  • Azure 不支持 VHDX 格式。 Azure 仅支持固定 VHD。 可使用 Hyper-V 管理器将磁盘转换为 VHD 格式,也可以使用 convert-vhd cmdlet。 如果使用 VirtualBox,则选择“固定大小”,而不是在创建磁盘时默认动态分配选项。
  • Azure 支持 Gen1(BIOS 引导)和 Gen2(UEFI 引导)VM。
  • VHD 允许的最大大小为 1,023 GB。
  • 必须在内核中启用 vfat 内核模块。
  • 支持逻辑卷管理器 (LVM),该管理器可以在 Azure VM 中的 OS 磁盘或数据磁盘上使用。 通常建议在 OS 磁盘而不是 LVM 上使用标准分区。 这种做法可以避免 LVM 名称与克隆的 VM 冲突,尤其是当需要将操作系统磁盘附加到另一台相同的 VM 进行故障排除时。 有关详细信息,请参阅 LVMRAID 文档。
  • 对装载通用磁盘格式 (UDF) 文件系统的内核支持是必需的。 在 Azure 上首次启动时,附加到来宾的 UDF 格式媒体会将预配配置传递给 Linux VM。 Azure Linux 代理必须能够装载 UDF 文件系统才能读取其配置和预配 VM。 如果不执行此步骤,预配会失败。
  • 不要在操作系统磁盘上配置交换分区。 有关详细信息,请阅读以下步骤。
  • Azure 上所有 VHD 的虚拟大小必须已按 1 MB 对齐。 从原始磁盘转换为 VHD 时,必须确保在转换前的原始磁盘大小是 1 MB 的倍数。 有关详细信息,请阅读以下步骤。 另请参阅 Linux 安装说明

注意

Cloud-init >= 21.2 会删除 UDF 要求。 但如果未启用 UDF 模块,CD-ROM 将不会在预配期间装载,这会阻止应用自定义数据。 解决方法是使用用户数据应用自定义数据。 与自定义数据不同,用户数据不会加密。 有关详细信息,请参阅用户数据格式

  1. 在 Hyper-V 管理器中选择 VM。

  2. 选择“连接”打开 VM 的控制台窗口。

  3. 创建或编辑 /etc/sysconfig/network 文件并添加以下文本:

    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    
  4. 创建或编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 文件并添加以下文本:

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    TYPE=Ethernet
    USERCTL=no
    PEERDNS=yes
    IPV6INIT=no
    PERSISTENT_DHCLIENT=yes
    NM_CONTROLLED=yes
    

    注意

    使用加速网络时,创建的合成接口必须使用 udev 规则配置为非托管。 此操作会阻止 NetworkManager 向其分配与主接口相同的 IP。

    若要应用它:

    sudo cat <<EOF>> /etc/udev/rules.d/68-azure-sriov-nm-unmanaged.rules
    # Accelerated Networking on Azure exposes a new SRIOV interface to the VM.
    # This interface is transparently bonded to the synthetic interface,
    # so NetworkManager should just ignore any SRIOV interfaces.
    SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION!="remove", ENV{NM_UNMANAGED}="1"
    EOF
    
  5. 确保网络服务在引导时启动:

    sudo systemctl enable network
    
  6. 注册 Red Hat 订阅,以启用来自 RHEL 存储库中的包的安装:

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  7. 在 grub 配置中修改内核引导行,以包含 Azure 的其他内核参数。 若要执行此修改,请在文本编辑器中打开 /etc/default/grub 并编辑 GRUB_CMDLINE_LINUX 参数。 例如:

    GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200n8 earlyprintk=ttyS0 net.ifnames=0"
    GRUB_TERMINAL_OUTPUT="serial console"
    GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
    ENABLE_BLSCFG=true
    

    注意

    如果 /etc/default/grub 中存在 ENABLE_BLSCFG=false,而不是 ENABLE_BLSCFG=true,则 grubedit 或 gubby 等依赖于启动加载程序规范 (BLS) 来管理启动条目和配置的工具在 RHEL 8 和 9 中可能无法正常工作。 如果 ENABLE_BLSCFG 不存在,则默认行为是 false

    此修改还可确保所有控制台消息都发送到第一个串行端口并启用与串行控制台的交互,从而可以协助 Azure 支持人员调试问题。 此配置还会禁用网络接口卡 (NIC) 的新命名约定。

    rhgb quiet crashkernel=auto
    

    图形界面式引导和安静引导在云环境中不适用,在云环境中,需要将所有日志都发送到串行端口。 如果需要,可以保留配置的 crashkernel 选项。 此参数可将 VM 中的可用内存量减少 128 MB 或更多,当 VM 较小时,这可能会造成问题。

  8. 完成 /etc/default/grub 编辑后,运行以下命令以重新生成 grub 配置:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    

    注意

    如果要上传已启用 UEFI 的 VM,则用于更新 grub 的命令会是 grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

  9. 请确保 SSH 服务器已安装且已配置为在引导时启动(默认采用此配置)。 修改 /etc/ssh/sshd_config 以包含以下行:

    ClientAliveInterval 180
    
  10. WALinuxAgent 包 WALinuxAgent-<version> 已推送到 Red Hat extras 存储库。 启用额外的存储库:

    sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
    
  11. 安装 Azure Linux 代理、cloud-init 和其他必要的实用程序:

    sudo yum install -y WALinuxAgent cloud-init cloud-utils-growpart gdisk hyperv-daemons
    sudo systemctl enable waagent.service
    sudo systemctl enable cloud-init.service
    
  12. 配置 cloud-init 来处理预配:

    1. cloud-init 配置 waagent

      sudo sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=auto/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
      

      注意

      如果要迁移特定的 VM,但不希望创建通用化映像,请在 /etc/waagent.conf 配置上设置 Provisioning.Agent=disabled

    2. 配置装载:

      sudo 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
      
    3. 配置 Azure 数据源:

      sudo echo "Allow only Azure datasource, disable fetching network setting via IMDS"
      sudo tee /etc/cloud/cloud.cfg.d/91-azure_datasource.cfg <<EOF
      datasource_list: [ Azure ]
      datasource:
          Azure:
              apply_network_config: False
      EOF
      
    4. 如果配置了现有交换文件,请将其移除:

      if [[ -f /mnt/resource/swapfile ]]; then
      echo "Removing swapfile" #RHEL uses a swapfile by default
      swapoff /mnt/resource/swapfile
      rm /mnt/resource/swapfile -f
      fi
      
    5. 配置 cloud-init 日志记录:

      sudo echo "Add console log file"
      sudo cat <<EOF tee  /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
      
  13. 交换配置:

    • 不要在操作系统磁盘上创建交换空间。

      以前,Azure Linux 代理用于通过在 Azure 上预配 VM 后附加到 VM 的本地资源磁盘自动配置交换空间。 此操作现在由 cloud-init 处理。 你不能使用 Linux 代理来格式化资源磁盘或创建交换文件。/etc/waagent.conf 中适当地修改以下参数:

      ResourceDisk.Format=n
      ResourceDisk.EnableSwap=n
      
    • 如果要装载、格式化和创建交换文件,可以:

      • 请在每次通过自定义数据创建 VM 时将此代码作为 cloud-init 配置传入。 我们建议使用此方法。

      • 使用融入映像中的 cloud-init 指令,该指令在每次创建 VM 时执行此步骤。

        sudo echo 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' >> /etc/systemd/system.conf
        sudo tee /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/resource"]
          - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
        EOF
        
  14. 配置 cloud-init 遥测,以帮助排除预配故障:

            sudo tee >> /etc/cloud/cloud.cfg.d/10-azure-kvp.cfg << EOF
            # This config enables cloud-init to report provisioning telemetry to aid with troubleshooting
            Reporting:
              logging:
                 type: log
              telemetry:
                 type: hyperv
    EOF
    
  15. 如果想要取消注册订阅,运行以下命令:

    
    sudo subscription-manager unregister
    
  16. 取消对 VM 的预配并且对其进行准备以便在 Azure 上进行预配:

    注意

    如果要迁移特定的 VM,但不希望创建通用化映像,请跳过取消预配步骤。 运行命令 waagent -force -deprovision+user 会使源计算机不可用。 此步骤仅用于创建通用映像。

    sudo rm -f /var/log/waagent.log
    sudo cloud-init clean --logs --seed
    sudo waagent -force -deprovision+user
    sudo rm -f ~/.bash_history
    sudo export HISTSIZE=0
    
  17. 在 Hyper-V 管理器中选择“操作”>“关闭”。 Linux VHD 现已准备好上传到 Azure