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

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

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

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

注意

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

Hyper-V 管理器

该部分介绍如何使用 Hyper-V 管理器准备 RHEL 6RHEL 7RHEL 8 VM。

先决条件

本部分假定已经从 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 将不会在预配期间装载,这会阻止应用自定义数据。 解决方法是使用用户数据应用自定义数据。 与自定义数据不同,用户数据不会加密。 有关详细信息,请参阅用户数据格式

RHEL 6(使用 Hyper-V 管理器)

重要

2020 年 11 月 30 日,RHEL 6 已结束维护阶段。 维护阶段之后是扩展生命阶段。 由于 RHEL 6 结束了完整/维护阶段,因此强烈建议升级到 RHEL 7、8 或 9。 如果必须停留在 RHEL 6 上,建议添加 RHEL 扩展生命周期支持附加产品。

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

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

  3. 在 RHEL 6 中,NetworkManager 可能会干扰 Azure Linux 代理。 卸载此包:

    sudo rpm -e --nodeps NetworkManager
    
  4. 创建或编辑 /etc/sysconfig/network 文件并添加以下文本:

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

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    TYPE=Ethernet
    USERCTL=no
    PEERDNS=yes
    IPV6INIT=no
    
  6. 移动(或删除)udev 规则,以避免产生以太网接口的静态规则。 在 Azure 或 Hyper-V 中克隆 VM 时,这些规则会引发问题:

    警告

    许多“v5”和更新的 VM 大小都需要加速网络。 如果未启用,NetworkManager 会将相同的 IP 地址分配给所有虚拟函数接口。 若要防止重复的 IP 地址,请确保在迁移到较新的大小时包含此 udev 规则。

    sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
    sudo rm -f /etc/udev/rules.d/70-persistent-net.rules
    

    注意

    使用加速网络时,创建的合成接口必须使用 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 transparentlybonded to the synthetic interface,
    # so NetworkManager should just ignore any SRIOV interfaces.
    SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION!="remove", ENV{NM_UNMANAGED}="1"
    EOF
    
  7. 确保网络服务在引导时启动:

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

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  9. WALinuxAgent 包 WALinuxAgent-<version> 已推送到 Red Hat extras 存储库。 启用额外的存储库:

    sudo subscription-manager repos --enable=rhel-6-server-extras-rpms
    
  10. 在 grub 配置中修改内核引导行,以包含 Azure 的其他内核参数。 要执行此修改,请在文本编辑器中打开 /boot/grub/menu.lst。 确保默认内核包含以下参数:

    console=ttyS0 earlyprintk=ttyS0
    

    此操作还可确保所有控制台消息都发送到第一个串行端口,从而可以协助 Azure 支持人员调试问题。

    我们还建议删除以下参数:

    rhgb quiet crashkernel=auto
    

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

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

    ClientAliveInterval 180
    
  12. 安装 Azure Linux 代理:

    sudo yum install WALinuxAgent
    sudo chkconfig waagent on
    

    如果尚未在步骤 3 中移除 NetworkManager 包和 NetworkManager-gnome 包,则安装 WALinuxAgent 包会移除它们。

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

    Azure Linux 代理可使用在 Azure 上预配 VM 后附加到 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 whatever you need it to be.
    
  14. 取消注册订阅(如有必要):

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

    注意

    如果要迁移特定的 VM,但不希望创建通用化映像,请跳过取消预配步骤。

        sudo waagent -force -deprovision
        sudo export HISTSIZE=0
    
  16. 在 Hyper-V 管理器中选择“操作”>“关闭”。 Linux VHD 现已准备好上传到 Azure

RHEL 7(使用 Hyper-V 管理器)

  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 transparentlybonded 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) 的新 RHEL 7 命名约定。

    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 cat > /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 >> /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
      
      
  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 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/resource"]
          - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
        EOF
        
  14. 如果想要取消注册订阅,运行以下命令:

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

    注意

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

    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
    
  16. 在 Hyper-V 管理器中选择“操作”>“关闭”。 Linux VHD 现已准备好上传到 Azure

RHEL 8+(使用 Hyper-V 管理器)

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

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

  3. 确保网络管理器服务在引导时启动:

    sudo systemctl enable NetworkManager.service
    
  4. 将网络接口配置为在引导时自动启动,并使用动态主机配置协议:

    sudo nmcli con mod eth0 connection.autoconnect yes ipv4.method auto
    

    注意

    使用加速网络时,创建的合成接口必须使用 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 transparentlybonded 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. 注册 Red Hat 订阅,以启用来自 RHEL 存储库中的包的安装:

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  6. 在 grub 配置中修改内核引导行,使其包含 Azure 的其他内核参数并启用串行控制台。

  7. 删除当前的 GRUB 参数:

    sudo grub2-editenv - unset kernelopts
    
  8. 在文本编辑器中编辑 /etc/default/grub,并添加以下参数:

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

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

  9. 建议同时移除以下参数:

    rhgb quiet crashkernel=auto
    

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

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

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

    对于启用了 UEFI 的 VM,请运行以下命令:

    sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
    
  11. 请确保 SSH 服务器已安装且已配置为在引导时启动(默认采用此配置)。 修改 /etc/ssh/sshd_config 以包含以下行:

    ClientAliveInterval 180
    
  12. 安装 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
    
  13. 配置 cloud-init 来处理预配:

    1. cloud-init 配置 waagent

      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
      

      注意

      如果要迁移特定的 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 cat > /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 defaul
      swapoff /mnt/resource/swapfile
      rm /mnt/resource/swapfile -f
      fi
      
    5. 配置 cloud-init 日志记录:

      sudo echo "Add console log file"
      sudo 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
      
  14. 交换配置:

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

      以前,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 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/resource"]
          - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.device-timeout=2,x-systemd.requires=cloud-init.service", "0", "0"]
        EOF
        
  15. 如果想要取消注册订阅,运行以下命令:

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

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

    注意

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

  17. 在 Hyper-V 管理器中选择“操作”>“关闭”。 Linux VHD 现已准备好上传到 Azure

KVM

本部分介绍如何使用 KVM 准备要上传到 Azure 的 RHEL 6RHEL 7 发行版。

RHEL 6(使用 KVM)

重要

2020 年 11 月 30 日,RHEL 6 已结束维护阶段。 维护阶段之后是扩展生命阶段。 由于 RHEL 6 结束了完整/维护阶段,因此强烈建议升级到 RHEL 7、8 或 9。 如果必须停留在 RHEL 6 上,建议添加 RHEL 扩展生命周期支持附加产品。

  1. 从 Red Hat 网站上下载 RHEL 6 的 KVM 映像。

  2. 设置 root 密码。

    生成加密密码,并复制命令的输出:

    sudo openssl passwd -1 changeme
    

    使用 guestfish 设置 root 密码:

    sudo guestfish --rw -a <image-name>
    > <fs> run
    > <fs> list-filesystems
    > <fs> mount /dev/sda1 /
    > <fs> vi /etc/shadow
    > <fs> exit
    

    将根用户的第二个字段从 !! 更改为加密密码。

  3. 从 qcow2 映像创建 KVM 中的 VM。 将磁盘类型设置为 qcow2,将虚拟网络接口设备型号设置为 virtio。 然后启动 VM,并以根用户身份登录。

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

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

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    TYPE=Ethernet
    USERCTL=no
    PEERDNS=yes
    IPV6INIT=no
    
  6. 移动(或删除)udev 规则,以避免产生以太网接口的静态规则。 在 Azure 或 Hyper-V 中克隆 VM 时,这些规则会引发问题:

    sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
    sudo rm -f /etc/udev/rules.d/70-persistent-net.rules
    

    注意

    使用加速网络时,创建的合成接口必须使用 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
    
  7. 确保网络服务在引导时启动:

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

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  9. 在 grub 配置中修改内核引导行,以包含 Azure 的其他内核参数。 要执行此配置,请在文本编辑器中打开 /boot/grub/menu.lst。 确保默认内核包含以下参数:

    console=ttyS0 earlyprintk=ttyS0
    

    此步骤还可确保所有控制台消息都发送到第一个串行端口,从而可以协助 Azure 支持人员调试问题。

    我们还建议删除以下参数:

    rhgb quiet crashkernel=auto
    

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

  10. 将 Hyper-V 模块添加到 initramfs 中:

    编辑 /etc/dracut.conf 并添加以下内容:

    add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
    

    重新生成 initramfs:

    sudo dracut -f -v
    
  11. 卸载 cloud-init

    sudo yum remove cloud-init
    
  12. 确保已安装 SSH 服务器且已将其配置为在引导时启动。

    sudo chkconfig sshd on
    

    修改 /etc/ssh/sshd_config 以包含以下行:

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

    sudo subscription-manager repos --enable=rhel-6-server-extras-rpms
    
  14. 安装 Azure Linux 代理:

    sudo yum install WALinuxAgent
    sudo chkconfig waagent on
    
  15. Azure Linux 代理可使用在 Azure 上预配 VM 后附加到 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 whatever you need it to be.
    
  16. 取消注册订阅(如有必要):

    sudo subscription-manager unregister
    
  17. 运行以下命令可取消对 VM 的预配并且对其进行准备以便在 Azure 上进行预配。

    注意

    如果要迁移特定的 VM,但不希望创建通用化映像,请跳过取消预配步骤。

    sudo rm -rf /var/lib/waagent/
    sudo rm -f /var/log/waagent.log
    sudo waagent -force -deprovision+user
    sudo rm -f ~/.bash_history
    sudo export HISTSIZE=0
    
  18. 关闭 KVM 中的 VM。

  19. 将 qcow2 映像转换为 VHD 格式。

    注意

    2.2.1 和更高版本的 qemu-img 中有一个已知 bug,会导致 VHD 格式不正确。 QEMU 2.6 中已修复此问题。 建议使用 qemu-img 2.2.0 或更低版本,或者更新到 2.6 或更高版本。 有关详细信息,请参阅此网站

    首先将此映像转换为原始格式:

    sudo qemu-img convert -f qcow2 -O raw rhel-6.9.qcow2 rhel-6.9.raw
    

    请确保原始映像大小为 1 MB。 如果不是,请将大小四舍五入,使其等于 1 MB:

    MB=$((1024*1024))
    size=$(qemu-img info -f raw --output json "rhel-6.9.raw" | \
    gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    rounded_size=$((($size/$MB + 1)*$MB))
    sudo qemu-img resize rhel-6.9.raw $rounded_size
    

    将原始磁盘转换为固定大小的 VHD:

    sudo qemu-img convert -f raw -o subformat=fixed -O vpc rhel-6.9.raw rhel-6.9.vhd
    

    或者,对于 qemu 版本 2.6+,包括 force_size 选项:

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

RHEL 7(使用 KVM)

  1. 从 Red Hat 网站上下载 RHEL 7 的 KVM 映像。 此过程以 RHEL 7 为例。

  2. 设置 root 密码。

    生成加密密码,并复制命令的输出:

    sudo openssl passwd -1 changeme
    

    使用 guestfish 设置 root 密码:

    sudo  guestfish --rw -a <image-name>
    > <fs> run
    > <fs> list-filesystems
    > <fs> mount /dev/sda1 /
    > <fs> vi /etc/shadow
    > <fs> exit
    

    将根用户的第二个字段从 !! 更改为加密密码。

  3. 从 qcow2 映像创建 KVM 中的 VM。 将磁盘类型设置为 qcow2,将虚拟网络接口设备型号设置为 virtio。 然后启动 VM,并以根用户身份登录。

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

    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    
  5. 创建或编辑 /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 transparentlybonded to the synthetic interface,
    # so NetworkManager should just ignore any SRIOV interfaces.
    SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION!="remove", ENV{NM_UNMANAGED}="1"
    EOF
    
  6. 确保网络服务在引导时启动:

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

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

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

    此命令还会确保所有控制台消息都发送到第一个串行端口,从而可以协助 Azure 支持人员调试问题。 此命令还会关闭 NIC 的新 RHEL 7 命名约定。 我们还建议删除以下参数:

    rhgb quiet crashkernel=auto
    

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

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

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  10. 将 Hyper-V 模块添加到 initramfs 中。

    编辑 /etc/dracut.conf 并添加以下内容:

    add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
    

    重新生成 initramfs:

    sudo dracut -f -v
    
  11. 卸载 cloud-init

    sudo yum remove cloud-init
    
  12. 确保已安装 SSH 服务器且已将其配置为在引导时启动。

    sudo systemctl enable sshd
    

    修改 /etc/ssh/sshd_config 以包含以下行:

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

    sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
    
  14. 安装 Azure Linux 代理:

    sudo yum install WALinuxAgent
    

    启用 waagent 服务:

    sudo systemctl enable waagent.service
    
  15. 安装 cloud-init

    执行“从 Hyper-V 管理器准备 RHEL 7 VM”中的步骤 12“安装 cloud-init 来处理预配”。

  16. 交换配置:

    • 不要在操作系统磁盘上创建交换空间。
    • 执行“从 Hyper-V 管理器准备 RHEL 7 VM”中的步骤 13“交换配置”。
  17. 取消注册订阅(如有必要):

    sudo subscription-manager unregister
    
  18. 通过执行“从 Hyper-V 管理器准备 RHEL 7 VM”中的步骤 15“取消预配”来取消预配。

  19. 关闭 KVM 中的 VM。

  20. 将 qcow2 映像转换为 VHD 格式。

    注意

    1.1.1 和更高版本的 qemu-img 中有一个已知 bug,会导致 VHD 格式不正确。 QEMU 1.6 中已修复此问题。 建议使用 qemu-img 1.1.0 或更低版本,或者更新到 1.6 或更高版本。 有关详细信息,请参阅此网站

    首先将此映像转换为原始格式:

    sudo qemu-img convert -f qcow2 -O raw rhel-7.4.qcow2 rhel-7.4.raw
    

    请确保原始映像大小为 1 MB。 如果不是,请将大小四舍五入,使其等于 1 MB:

    MB=$((1024*1024))
    size=$(qemu-img info -f raw --output json "rhel-7.4.raw" | \
    gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    rounded_size=$((($size/$MB + 1)*$MB))
    sudo qemu-img resize rhel-7.4.raw $rounded_size
    

    将原始磁盘转换为固定大小的 VHD:

    sudo qemu-img convert -f raw -o subformat=fixed -O vpc rhel-7.4.raw rhel-7.4.vhd
    

    或者,对 qemu 版本 1.6+ 包含 force_size 选项:

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

VMware

本部分介绍如何从 VMware 准备 RHEL 6RHEL 7 发行版。

先决条件

本部分假设已在 VMware 中安装了 RHEL VM。 有关如何在 VMware 中安装操作系统的信息,请参阅 VMware 来宾操作系统安装指南

  • 在安装 Linux 操作系统时,建议使用标准分区而不是 LVM,这通常是许多安装的默认设置。 使用分区可避免 LVM 与克隆 VM 发生名称冲突,特别是在操作系统磁盘需要连接到另一台 VM 以进行故障排除的情况下。 如果需要,可以在数据磁盘上使用 LVM 或 RAID。
  • 不要在操作系统磁盘上配置交换分区。 可将 Linux 代理配置为在临时资源磁盘上创建交换文件。 有关详细信息,请阅读以下步骤。
  • 创建 VHD 时,选择“将虚拟磁盘存储为单个文件”

RHEL 6(使用 VMware)

重要

2020 年 11 月 30 日,RHEL 6 已结束维护阶段。 维护阶段之后是扩展生命阶段。 由于 RHEL 6 结束了完整/维护阶段,因此强烈建议升级到 RHEL 7、8 或 9。 如果必须停留在 RHEL 6 上,建议添加 RHEL 扩展生命周期支持附加产品。

  1. 在 RHEL 6 中,NetworkManager 可能会干扰 Azure Linux 代理。 卸载此包:

    sudo rpm -e --nodeps NetworkManager
    
  2. 在包含以下文本的 /etc/sysconfig/ 目录中创建一个名为 network 的文件:

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

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    TYPE=Ethernet
    USERCTL=no
    PEERDNS=yes
    IPV6INIT=no
    
  4. 移动(或删除)udev 规则,以避免产生以太网接口的静态规则。 在 Azure 或 Hyper-V 中克隆 VM 时,这些规则会引发问题:

    sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
    sudo rm -f /etc/udev/rules.d/70-persistent-net.rules
    

    注意

    使用加速网络时,创建的合成接口必须使用 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 chkconfig network on
    
  6. 注册 Red Hat 订阅,以启用来自 RHEL 存储库中的包的安装:

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  7. WALinuxAgent 包 WALinuxAgent-<version> 已推送到 Red Hat extras 存储库。 启用额外的存储库:

    sudo subscription-manager repos --enable=rhel-6-server-extras-rpms
    
  8. 在 grub 配置中修改内核引导行,以包含 Azure 的其他内核参数。 若要执行此步骤,请在文本编辑器中打开 /etc/default/grub 并编辑 GRUB_CMDLINE_LINUX 参数。 例如:

    GRUB_CMDLINE_LINUX="console=ttyS0 earlyprintk=ttyS0"
    

    此步骤还可确保所有控制台消息都发送到第一个串行端口,从而可以协助 Azure 支持人员调试问题。 我们还建议删除以下参数:

    rhgb quiet crashkernel=auto
    

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

  9. 将 Hyper-V 模块添加到 initramfs 中:

    编辑 /etc/dracut.conf 并添加以下内容:

    add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
    

    重新生成 initramfs:

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

    ClientAliveInterval 180
    
  11. 安装 Azure Linux 代理:

    sudo yum install WALinuxAgent
    sudo chkconfig waagent on
    
  12. 不要在操作系统磁盘上创建交换空间。

    Azure Linux 代理可使用在 Azure 上预配 VM 后附加到 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 whatever you need it to be.
    
  13. 取消注册订阅(如有必要):

    sudo subscription-manager unregister
    
  14. 运行以下命令可取消对 VM 的预配并且对其进行准备以便在 Azure 上进行预配:

    注意

    如果要迁移特定的 VM,但不希望创建通用化映像,请跳过取消预配步骤。

    sudo rm -rf /var/lib/waagent/
    sudo rm -f /var/log/waagent.log
    sudo waagent -force -deprovision+user
    sudo rm -f ~/.bash_history
    sudo export HISTSIZE=0
    
  15. 关闭 VM,并将 VMDK 文件转换为 .vhd 文件。

    注意

    2.2.1 和更高版本的 qemu-img 中有一个已知 bug,会导致 VHD 格式不正确。 QEMU 2.6 中已修复此问题。 建议使用 qemu-img 2.2.0 或更低版本,或者更新到 2.6 或更高版本。 有关详细信息,请参阅此网站

    首先将此映像转换为原始格式:

    sudo qemu-img convert -f vmdk -O raw rhel-6.9.vmdk rhel-6.9.raw
    

    请确保原始映像大小为 1 MB。 如果不是,请将大小四舍五入,使其等于 1 MB:

    MB=$((1024*1024))
    size=$(qemu-img info -f raw --output json "rhel-6.9.raw" | \
    gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    rounded_size=$((($size/$MB + 1)*$MB))
    sudo qemu-img resize rhel-6.9.raw $rounded_size
    

    将原始磁盘转换为固定大小的 VHD:

    sudo qemu-img convert -f raw -o subformat=fixed -O vpc rhel-6.9.raw rhel-6.9.vhd
    

    或者,对于 qemu 版本 2.6+,包括 force_size 选项:

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

RHEL 7(使用 VMware)

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

    NETWORKING=yes
    HOSTNAME=localhost.localdomain
    
  2. 创建或编辑 /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 transparentlybonded to the synthetic interface,
    # so NetworkManager should just ignore any SRIOV interfaces.
    SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION!="remove", ENV{NM_UNMANAGED}="1"
    EOF
    
  3. 确保网络服务在引导时启动:

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

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

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

    此配置还会确保所有控制台消息都发送到第一个串行端口,从而可以协助 Azure 支持人员调试问题。 此外,还会关闭 NIC 的新 RHEL 7 命名约定。 除此之外,建议删除以下参数:

    rhgb quiet crashkernel=auto
    

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

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

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  7. 将 Hyper-V 模块添加到 initramfs 中:

    编辑 /etc/dracut.conf,添加内容:

    add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
    

    重新生成 initramfs:

    sudo dracut -f -v
    
  8. 请确保已安装 SSH 服务器且将其配置为在引导时启动。 此设置通常是默认设置。 修改 /etc/ssh/sshd_config 以包含以下行:

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

    sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
    
  10. 安装 Azure Linux 代理:

    sudo yum install WALinuxAgent
    sudo systemctl enable waagent.service
    
  11. 安装 cloud-init

    执行“从 Hyper-V 管理器准备 RHEL 7 VM”中的步骤 12“安装 cloud-init 来处理预配”。

  12. 交换配置:

    • 不要在操作系统磁盘上创建交换空间。
    • 执行“从 Hyper-V 管理器准备 RHEL 7 VM”中的步骤 13“交换配置”。
  13. 如果想要取消注册订阅,运行以下命令:

    sudo subscription-manager unregister
    
  14. 通过执行“从 Hyper-V 管理器准备 RHEL 7 VM”中的步骤 15“取消预配”来取消预配。

  15. 关闭 VM,并将 VMDK 文件转换为 VHD 格式。

    注意

    2.2.1 和更高版本的 qemu-img 中有一个已知 bug,会导致 VHD 格式不正确。 QEMU 2.6 中已修复此问题。 建议使用 qemu-img 2.2.0 或更低版本,或者更新到 2.6 或更高版本。 有关详细信息,请参阅此网站

    首先将此映像转换为原始格式:

    sudo qemu-img convert -f vmdk -O raw rhel-7.4.vmdk rhel-7.4.raw
    

    请确保原始映像大小为 1 MB。 如果不是,请将大小四舍五入,使其等于 1 MB:

    MB=$((1024*1024))
    size=$(qemu-img info -f raw --output json "rhel-7.4.raw" | \
    gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
    rounded_size=$((($size/$MB + 1)*$MB))
    sudo qemu-img resize rhel-7.4.raw $rounded_size
    

    将原始磁盘转换为固定大小的 VHD:

    sudo qemu-img convert -f raw -o subformat=fixed -O vpc rhel-7.4.raw rhel-7.4.vhd
    

    或者,对于 qemu 版本 2.6+,包括 force_size 选项:

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

Kickstart 文件

本部分介绍如何使用 kickstart 文件从 ISO 准备 RHEL 7 发行版。

RHEL 7(使用 kickstart 文件)

  1. 创建包括以下内容的 kickstart 文件,并保存该文件。 有关 kickstart 安装的信息,请参阅 Kickstart 安装指南

    # Kickstart for provisioning a RHEL 7 Azure VM
    
    # System authorization information
      auth --enableshadow --passalgo=sha512
    
    # Use graphical install
    text
    
    # Don't run the Setup Agent on first boot
    firstboot --disable
    
    # Keyboard layouts
    keyboard --vckeymap=us --xlayouts='us'
    
    # System language
    lang en_US.UTF-8
    
    # Network information
    network  --bootproto=dhcp
    
    # Root password
    rootpw --plaintext "to_be_disabled"
    
    # System services
    services --enabled="sshd,waagent,NetworkManager"
    
    # System timezone
    timezone Etc/UTC --isUtc --ntpservers 0.rhel.pool.ntp.org,1.rhel.pool.ntp.org,2.rhel.pool.ntp.org,3.rhel.pool.ntp.org
    
    # Partition clearing information
    clearpart --all --initlabel
    
    # Clear the MBR
    zerombr
    
    # Disk partitioning information
    part /boot --fstype="xfs" --size=500
    part / --fstyp="xfs" --size=1 --grow --asprimary
    
    # System bootloader configuration
    bootloader --location=mbr
    
    # Firewall configuration
    firewall --disabled
    
    # Enable SELinux
    selinux --enforcing
    
    # Don't configure X
    skipx
    
    # Power down the machine after install
    poweroff
    
    %packages
    @base
    @console-internet
    chrony
    sudo
    parted
    -dracut-config-rescue
    
    %end
    
    %post --log=/var/log/anaconda/post-install.log
    
    #!/bin/bash
    
    # Register Red Hat Subscription
    subscription-manager register --username=XXX --password=XXX --auto-attach --force
    
    # Install latest repo update
    yum update -y
    
    # Enable extras repo
    subscription-manager repos --enable=rhel-7-server-extras-rpms
    
    # Install WALinuxAgent
    yum install -y WALinuxAgent
    
    # Unregister Red Hat subscription
    subscription-manager unregister
    
    # Enable waaagent at boot-up
    systemctl enable waagent
    
    # Install cloud-init
    yum install -y cloud-init cloud-utils-growpart gdisk hyperv-daemons
    
    # Configure waagent for cloud-init
    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
    
    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
    
    # Disable the root account
    usermod root -p '!!'
    
    # Configure swap using cloud-init
    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.device-timeout=2,x-systemd.requires=cloud-init.service", "0", "0"]
    EOF
    
    # Set the cmdline
    sed -i 's/^\(GRUB_CMDLINE_LINUX\)=".*"$/\1="console=tty1 console=ttyS0 earlyprintk=ttyS0"/g' /etc/default/grub
    
    # Enable SSH keepalive
    sed -i 's/^#\(ClientAliveInterval\).*$/\1 180/g' /etc/ssh/sshd_config
    
    # Build the grub cfg
    grub2-mkconfig -o /boot/grub2/grub.cfg
    
    # Configure network
    cat << EOF > /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
    EOF
    
    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 transparentlybonded to the synthetic interface,
    # so NetworkManager should just ignore any SRIOV interfaces.
    SUBSYSTEM=="net", DRIVERS=="hv_pci", ACTION!="remove", ENV{NM_UNMANAGED}="1"
    EOF
    
    # Deprovision and prepare for Azure if you are creating a generalized image
    sudo cloud-init clean --logs --seed
    sudo rm -rf /var/lib/cloud/
    sudo rm -rf /var/lib/waagent/
    sudo rm -f /var/log/waagent.log
    
    sudo waagent -force -deprovision+user
    rm -f ~/.bash_history
    export HISTSIZE=0
    
    %end
    
  2. 将 kickstart 文件放在安装系统可以访问的位置。

  3. 在 Hyper-V 管理器中,创建新的 VM。 在“连接虚拟硬盘”页上,选择“稍后附加虚拟硬盘”,并完成“新建虚拟机”向导

  4. 打开 VM 设置:

    1. 将新 VHD 附加到 VM。 请务必选择“VHD 格式”和“固定大小” 。

    2. 将安装 ISO 附加到 DVD 光驱。

    3. 将 BIOS 设置为从 CD 启动。

  5. 启动 VM。 当安装指南出现时,请选择 Tab 键来配置启动选项

  6. 在启动选项的末尾输入 inst.ks=<the location of the kickstart file>,并选择 Enter 键

  7. 等待安装完成。 完成后,VM 自动关闭。 现在,准备将 Linux VHD 上传到 Azure。

已知问题

以下问题是已知的。

使用非 Hyper-V 虚拟机监控程序时,初始 RAM 磁盘未包含 Hyper-V 驱动程序

在某些情况下,Linux 安装程序可能无法在初始 RAM 磁盘(initrd 或 initramfs)中包含 Hyper-V 驱动程序,除非 Linux 检测到它正在 Hyper-V 环境中运行。

使用不同虚拟化系统(如 VirtualBox 或 Xen)来准备 Linux 映像时,可能需要重新生成 initrd,以确保至少 hv_vmbushv_storvsc 内核模块可在初始 RAM 磁盘上使用。 至少在基于上游 Red Hat 分发的系统上这是一个已知问题。

要解决此问题,请将 Hyper-V 模块添加到 initramfs 并进行重新生成:

编辑 /etc/dracut.conf 并添加以下内容:

add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "

重新生成 initramfs:

sudo dracut -f -v

有关详细信息,请参阅重新生成 initramfs

  • 现在可以使用 RHEL VHD 在 Azure 中创建新的 VM 了。 如果是首次将 .vhd 文件上传到 Azure,请参阅从自定义磁盘创建 Linux VM
  • 有关经认证可运行 RHEL 的虚拟机监控程序的详细信息,请参阅 Red Hat 网站