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

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

本文介绍如何准备 Red Hat Enterprise Linux (RHEL) 虚拟机,以供在 Azure 中使用。 本文介绍的 RHEL 版本为 6.X、7.X 和 8.X。 本文所述的用于准备工作的虚拟机监控程序为 Hyper-V、基于内核的虚拟机 (KVM) 和 VMware。 有关参与 Red Hat 云访问计划的资格要求的详细信息,请参阅 Red Hat 的云访问网站在 Azure 上运行 RHEL。 有关自动构建 RHEL 映像的方法,请参阅 Azure 映像生成器

注意

请注意生命周期结束 (EOL) 且不再受 Redhat 支持的版本。 在合理的业务努力基础上,将支持在 EOL 时及之后上传的图像。 指向 Redhat 的产品生命周期 的链接

Hyper-V 管理器

本部分说明如何使用 Hyper-V 管理器准备 RHEL 6RHEL 7RHEL 8 虚拟机。

先决条件

本部分假定已经从 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 引导)虚拟机。

  • VHD 允许的最大大小为 1,023 GB。

  • 必须在内核中启用 vfat 内核模块。

  • 支持逻辑卷管理器 (LVM),该管理器可以在 Azure 虚拟机中的 OS 磁盘或数据磁盘上使用。 但是,通常建议在 OS 磁盘而不是 LVM 上使用标准分区。 这种做法可以避免 LVM 名称与克隆的虚拟机冲突,尤其是当需要将操作系统磁盘附加到另一台相同的虚拟机进行故障排除时。 请参阅 LVMRAID 文档。

  • 对装载通用磁盘格式 (UDF) 文件系统的内核支持是必需的。 在 Azure 上首次启动时,附加到来宾的 UDF 格式媒体会将预配配置传递到 Linux 虚拟机。 Azure Linux 代理必须能够装载 UDF 文件系统以读取其配置并预配虚拟机,如果没有此支持,预配将失败!

  • 不要在操作系统磁盘上配置交换分区。 可以在以下步骤中找到有关此内容的详细信息。

  • Azure 上的所有 VHD 必须已将虚拟大小调整为 1MB。 从原始磁盘转换为 VHD 时,必须确保在转换前原始磁盘大小是 1MB 的倍数。 可以在以下步骤中找到更多详细信息。 有关详细信息,另请参阅 Linux 安装说明

注意

Cloud-init >= 21.2 会删除 udf 要求。 但是,如果未启用 udf 模块,cdrom 将不会在预配期间装载,从而阻止应用自定义数据。 解决方法是使用用户数据应用自定义数据。 但是,与自定义数据不同,用户数据不会加密。 https://cloudinit.readthedocs.io/en/latest/topics/format.html

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

重要

从 2020 年 11 月 30 起,Red Hat Enterprise Linux 6 的维护阶段结束。 维护阶段之后是扩展生命阶段。 由于 Red Hat Enterprise Linux 6 结束了完整/维护阶段,因此强烈建议升级到 Red Hat Enterprise Linux 7、8 或 9。 如果客户必须保留 Red Hat Enterprise Linux 6,建议添加 Red Hat Enterprise Linux 扩展生命周期支持 (ELS) 附加产品。

  1. 在 Hyper-V 管理器中,选择虚拟机。

  2. 单击“连接”打开该虚拟机的控制台窗口。

  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 中克隆虚拟机时,这些规则会引发问题:

    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
    

注意

** 使用加速网络 (AN) 时,创建的合成接口必须使用 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=="add", ENV{NM_UNMANAGED}="1"
EOF
  1. 通过运行以下命令,确保网络服务会在引导时启动:

    sudo chkconfig network on
    
  2. 注册 Red Hat 订阅,以通过运行以下命令来启用来自 RHEL 存储库中的包的安装:

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  3. WALinuxAgent 包 WALinuxAgent-<version> 已推送到 Red Hat extras 存储库。 通过运行以下命令启用 extras 存储库:

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

    console=ttyS0 earlyprintk=ttyS0
    

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

    除此之外,建议删除以下参数:

    rhgb quiet crashkernel=auto
    

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

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

    ClientAliveInterval 180
    
  6. 通过运行以下命令来安装 Azure Linux 代理:

    sudo yum install WALinuxAgent
    sudo chkconfig waagent on
    

    如果步骤 3 中没有删除 NetworkManager 包和 NetworkManager-gnome 包,则安装 WALinuxAgent 包将删除它们。

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

    Azure Linux 代理可使用在 Azure 上预配虚拟机后附加到虚拟机的本地资源磁盘自动配置交换空间。 请注意,本地资源磁盘是临时磁盘,可能在取消预配虚拟机后被清空。 在上一步中安装 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.
    
  8. 通过运行以下命令取消注册订阅(如有必要):

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

注意

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

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

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

  1. 在 Hyper-V 管理器中,选择虚拟机。

  2. 单击“连接” 以打开该虚拟机的控制台窗口。

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

    rhgb quiet crashkernel=auto
    

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

  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 存储库。 通过运行以下命令启用 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
    

    注意

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

    1. 配置装载:
    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
    
    1. 配置 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
    
    1. 如果已配置,则删除现有的交换文件:
    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
    
    1. 配置 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 上预配虚拟机后附加到虚拟机的本地资源磁盘自动配置交换空间。 但是,现在这由 cloud-init 处理,你不能使用 Linux 代理来格式化资源磁盘以创建交换文件,请在 /etc/waagent.conf 中相应地修改以下参数:

    ResourceDisk.Format=n
    ResourceDisk.EnableSwap=n
    

    如果需要装载、格式化和创建交换文件,可以使用以下任一方法:

    • 在每次通过 customdata 创建 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. 预配

    运行以下命令可取消对虚拟机的预配并且对其进行准备以便在 Azure 上进行预配:

    注意

    如果要迁移特定的虚拟机,但不希望创建通用化映像,请跳过“取消预配”步骤。 运行命令 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 管理器中,选择虚拟机。

  2. 单击“连接” 以打开该虚拟机的控制台窗口。

  3. 通过运行以下命令,确保网络管理器服务会在引导时启动:

    sudo systemctl enable NetworkManager.service
    
  4. 将网络接口配置为在启动时自动启动,并使用 DHCP:

    sudo nmcli con mod eth0 connection.autoconnect yes ipv4.method auto
    
  5. 注册 Red Hat 订阅,以通过运行以下命令来启用来自 RHEL 存储库中的包的安装:

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

    1. 删除当前的 GRUB 参数:
    sudo grub2-editenv - unset kernelopts
    
    1. 在文本编辑器中编辑 /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 的新命名约定。

    1. 另外,还建议删除以下参数:
    rhgb quiet crashkernel=auto
    

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

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

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

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

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

    ClientAliveInterval 180
    
  9. 通过运行以下命令安装 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
    
  10. 配置 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
    

    注意

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

    1. 配置装载:
    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
    
    1. 配置 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
    
    1. 如果已配置,则删除现有的交换文件:
    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
    
    1. 配置 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
    
  11. 交换配置:不要在操作系统磁盘上创建交换空间。

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

    ResourceDisk.Format=n
    ResourceDisk.EnableSwap=n
    
    • 在每次通过 customdata 创建 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
      
  12. 如果想要取消注册订阅,运行以下命令:

    sudo subscription-manager unregister
    
  13. 预配

    运行以下命令可取消对虚拟机的预配并且对其进行准备以便在 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
    

    注意

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

  14. 在 Hyper-V 管理器中单击“操作”>“关闭”。 现在,已准备好将 Linux VHD 上传到 Azure

KVM

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

RHEL 6(使用 KVM)

重要

从 2020 年 11 月 30 起,Red Hat Enterprise Linux 6 的维护阶段结束。 维护阶段之后是扩展生命阶段。 由于 Red Hat Enterprise Linux 6 结束了完整/维护阶段,因此强烈建议升级到 Red Hat Enterprise Linux 7、8 或 9。 如果客户必须保留 Red Hat Enterprise Linux 6,建议添加 Red Hat Enterprise Linux 扩展生命周期支持 (ELS) 附加产品。

  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
    

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

  3. 在 KVM 中通过 qcow2 映像创建虚拟机。 将磁盘类型设置为 qcow2,将虚拟网络接口设备型号设置为 virtio。 然后启动虚拟机,并以 root 身份登录。

  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 中克隆虚拟机时,这些规则会引发问题:

    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
    

注意

** 使用加速网络 (AN) 时,创建的合成接口必须使用 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=="add", ENV{NM_UNMANAGED}="1"
EOF
  1. 通过运行以下命令,确保网络服务会在引导时启动:

    sudo chkconfig network on
    
  2. 注册 Red Hat 订阅,以通过运行以下命令来启用来自 RHEL 存储库中的包的安装:

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

    console=ttyS0 earlyprintk=ttyS0
    

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

    除此之外,建议删除以下参数:

    rhgb quiet crashkernel=auto
    

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

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

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

    add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
    

    重新生成 initramfs:

    sudo dracut -f -v
    
  5. 卸载 cloud-init:

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

    sudo chkconfig sshd on
    

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

    PasswordAuthentication yes
    ClientAliveInterval 180
    
  7. WALinuxAgent 包 WALinuxAgent-<version> 已推送到 Red Hat extras 存储库。 通过运行以下命令启用 extras 存储库:

    sudo subscription-manager repos --enable=rhel-6-server-extras-rpms
    
  8. 通过运行以下命令来安装 Azure Linux 代理:

    sudo yum install WALinuxAgent
    sudo chkconfig waagent on
    
  9. Azure Linux 代理可使用在 Azure 上预配虚拟机后附加到虚拟机的本地资源磁盘自动配置交换空间。 请注意,本地资源磁盘是临时磁盘,可能在取消预配虚拟机后被清空。 在上一步中安装 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.
    
  10. 通过运行以下命令取消注册订阅(如有必要):

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

    注意

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

    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
    
  12. 关闭 KVM 中的虚拟机。

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

    注意

    2.2.1 及更高版本的 qemu-img 中有一个已知 bug 会导致 VHD 格式不正确。 QEMU 2.6 中已修复此问题。 建议使用 qemu-img 2.2.0 或更低版本,或者更新到 2.6 或更高版本。 请参考: https://bugs.launchpad.net/qemu/+bug/1490611

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

    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
    

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

  3. 在 KVM 中通过 qcow2 映像创建虚拟机。 将磁盘类型设置为 qcow2,将虚拟网络接口设备型号设置为 virtio。 然后启动虚拟机,并以 root 身份登录。

  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
    
  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 选项。 请注意,此参数可以将虚拟机中的可用内存量减少 128 MB 或更多,遇到较小的虚拟机大小时,此配置可能会有问题。

  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 存储库。 通过运行以下命令启用 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 虚拟机”中的步骤 12“安装 cloud-init 来处理预配”。

  16. 交换配置

    不要在操作系统磁盘上创建交换空间。 执行“从 Hyper-V 管理器准备 RHEL 7 虚拟机”中的步骤 13“交换配置”

  17. 通过运行以下命令取消注册订阅(如有必要):

    sudo subscription-manager unregister
    
  18. 预配

    执行“从 Hyper-V 管理器准备 RHEL 7 虚拟机”中的步骤 15“取消预配”

  19. 关闭 KVM 中的虚拟机。

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

    注意

    2.2.1 及更高版本的 qemu-img 中有一个已知 bug 会导致 VHD 格式不正确。 QEMU 2.6 中已修复此问题。 建议使用 qemu-img 2.2.0 或更低版本,或者更新到 2.6 或更高版本。 请参考: https://bugs.launchpad.net/qemu/+bug/1490611

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

    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 版本 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
    

VMware

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

先决条件

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

  • 在安装 Linux 操作系统时,建议使用标准分区而不是 LVM,这通常是许多安装的默认设置。 这种做法可以避免 LVM 名称与克隆的虚拟机名称冲突,尤其是在需要将操作系统磁盘附加到另一台虚拟机进行故障排除时。 如果需要,可以在数据磁盘上使用 LVM 或 RAID。
  • 不要在操作系统磁盘上配置交换分区。 可将 Linux 代理配置为在临时资源磁盘上创建交换文件。 可以在下面的步骤中找到有关此操作的详细信息。
  • 创建虚拟硬盘时,选择“将虚拟磁盘存储为单个文件”。

RHEL 6(使用 VMware)

重要

从 2020 年 11 月 30 起,Red Hat Enterprise Linux 6 的维护阶段结束。 维护阶段之后是扩展生命阶段。 由于 Red Hat Enterprise Linux 6 结束了完整/维护阶段,因此强烈建议升级到 Red Hat Enterprise Linux 7、8 或 9。 如果客户必须保留 Red Hat Enterprise Linux 6,建议添加 Red Hat Enterprise Linux 扩展生命周期支持 (ELS) 附加产品。

  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 中克隆虚拟机时,这些规则会引发问题:

    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
    

注意

** 使用加速网络 (AN) 时,创建的合成接口必须使用 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=="add", ENV{NM_UNMANAGED}="1"
EOF
  1. 通过运行以下命令,确保网络服务会在引导时启动:

    sudo chkconfig network on
    
  2. 注册 Red Hat 订阅,以通过运行以下命令来启用来自 RHEL 存储库中的包的安装:

    sudo subscription-manager register --auto-attach --username=XXX --password=XXX
    
  3. WALinuxAgent 包 WALinuxAgent-<version> 已推送到 Red Hat extras 存储库。 通过运行以下命令启用 extras 存储库:

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

    GRUB_CMDLINE_LINUX="console=ttyS0 earlyprintk=ttyS0"
    

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

    rhgb quiet crashkernel=auto
    

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

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

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

    add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
    

    重新生成 initramfs:

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

    ClientAliveInterval 180
    
  7. 通过运行以下命令来安装 Azure Linux 代理:

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

    Azure Linux 代理可使用在 Azure 上预配虚拟机后附加到虚拟机的本地资源磁盘自动配置交换空间。 请注意,本地资源磁盘是临时磁盘,可能在取消预配虚拟机后被清空。 在上一步中安装 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.
    
  9. 通过运行以下命令取消注册订阅(如有必要):

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

    注意

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

    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
    
  11. 关闭虚拟机,并将 VMDK 文件转换为 .vhd 文件。

    注意

    2.2.1 及更高版本的 qemu-img 中有一个已知 bug 会导致 VHD 格式不正确。 QEMU 2.6 中已修复此问题。 建议使用 qemu-img 2.2.0 或更低版本,或者更新到 2.6 或更高版本。 请参考: https://bugs.launchpad.net/qemu/+bug/1490611

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

    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
    
  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 选项。 请注意,此参数可以将虚拟机中的可用内存量减少 128 MB 或更多,遇到较小的虚拟机大小时,此配置可能会有问题。

  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 存储库。 通过运行以下命令启用 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 虚拟机”中的步骤 12“安装 cloud-init 来处理预配”。

  12. 交换配置

    不要在操作系统磁盘上创建交换空间。 执行“从 Hyper-V 管理器准备 RHEL 7 虚拟机”中的步骤 13“交换配置”

  13. 如果想要取消注册订阅,运行以下命令:

    sudo subscription-manager unregister
    
  14. 预配

    执行“从 Hyper-V 管理器准备 RHEL 7 虚拟机”中的步骤 15“取消预配”

  15. 关闭虚拟机,将 VMDK 文件转换为 VHD 格式。

    注意

    2.2.1 及更高版本的 qemu-img 中有一个已知 bug 会导致 VHD 格式不正确。 QEMU 2.6 中已修复此问题。 建议使用 qemu-img 2.2.0 或更低版本,或者更新到 2.6 或更高版本。 请参考: https://bugs.launchpad.net/qemu/+bug/1490611

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

    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
    
    # 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 管理器中,创建新的虚拟机。 在“连接虚拟硬盘”页上,选择“稍后附加虚拟硬盘”,并完成新建虚拟机向导 。

  4. 打开虚拟机设置:

    1. 将新的虚拟硬盘附加到虚拟机。 请务必选择“VHD 格式”和“固定大小” 。

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

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

  5. 启动虚拟机。 当安装指南出现时,请按 Tab 键来配置启动选项。

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

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

已知问题

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

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

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

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

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

add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "

重新生成 initramfs:

sudo dracut -f -v

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

后续步骤

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