为 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 进行故障排除时。 有关详细信息,请参阅 LVM 和 RAID 文档。
- 对装载通用磁盘格式 (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 7(使用 Hyper-V 管理器)
- RHEL 8+/9+(使用 Hyper-V 管理器)
- RHEL 7(使用 KVM)
- RHEL 8+/9+(使用 KVM)
- RHEL 7(使用 VMware)
- RHEL 8+/9+(使用 VMware)
- RHEL 7(使用 Kickstart)
- RHEL 8+/9+(使用 Kickstart)
在 Hyper-V 管理器中选择 VM。
选择“连接”打开 VM 的控制台窗口。
创建或编辑
/etc/sysconfig/network
文件并添加以下文本:NETWORKING=yes HOSTNAME=localhost.localdomain
创建或编辑
/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
确保网络服务在引导时启动:
sudo systemctl enable network
注册 Red Hat 订阅,以启用来自 RHEL 存储库中的包的安装:
sudo subscription-manager register --auto-attach --username=XXX --password=XXX
在 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 较小时,这可能会造成问题。完成
/etc/default/grub
编辑后,运行以下命令以重新生成 grub 配置:sudo grub2-mkconfig -o /boot/grub2/grub.cfg
注意
如果要上传已启用 UEFI 的 VM,则用于更新 grub 的命令会是
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
。请确保 SSH 服务器已安装且已配置为在引导时启动(默认采用此配置)。 修改
/etc/ssh/sshd_config
以包含以下行:ClientAliveInterval 180
WALinuxAgent 包
WALinuxAgent-<version>
已推送到 Red Hat extras 存储库。 启用额外的存储库:sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
安装 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
配置
cloud-init
来处理预配:为
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
。配置装载:
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
配置 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
如果配置了现有交换文件,请将其移除:
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
配置
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
交换配置:
不要在操作系统磁盘上创建交换空间。
以前,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
配置
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
如果想要取消注册订阅,运行以下命令:
sudo subscription-manager unregister
取消对 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
在 Hyper-V 管理器中选择“操作”>“关闭”。 Linux VHD 现已准备好上传到 Azure。