为 Azure 准备基于 CentOS 的虚拟机
注意
本文引用了 CentOS,这是一个接近生命周期结束 (EOL) 状态的 Linux 发行版。 请相应地考虑你的使用和规划。 有关详细信息,请参阅 CentOS 生命周期结束指导。
适用于:✔️ Linux VM ✔️ 灵活规模集
了解如何创建和上传包含基于 CentOS 的 Linux 操作系统的 Azure 虚拟硬盘 (VHD)。
必备条件
本文假设已在虚拟硬盘中安装了 CentOS(或类似的衍生产品)Linux 操作系统。 存在多个用于创建 .vhd 文件的工具,例如 Hyper-V 等虚拟化解决方案。 有关说明,请参阅安装 Hyper-V 角色和配置虚拟机。
CentOS 安装说明
- 有关如何为 Azure 准备 Linux 的更多提示,请参阅常规 Linux 安装说明。
- Azure 不支持 VHDX 格式,仅支持固定大小的 VHD。 可使用 Hyper-V 管理器或 convert-vhd cmdlet 将磁盘转换为 VHD 格式。 如果使用的是 VirtualBox,则意味着选择的是“固定大小”,而不是在创建磁盘时动态分配的默认值。
- 必须在内核中启用 vfat 内核模块
- 在安装 Linux 系统时,建议使用标准分区而不是 LVM(通常是许多安装的默认值)。 这会避免 LVM 名称与克隆 VM 发生冲突,特别是在 OS 磁盘需要连接到另一台相同的 VM 以进行故障排除的情况下。 LVM 或 RAID 可以在数据磁盘上使用。
- 需要装载 UDF 文件系统的内核支持。 在 Azure 上首次启动时,预配配置将使用附加到来宾的 UDF 格式媒体传递到 Linux VM。 Azure Linux 代理或 cloud-init 必须装载 UDF 文件系统才能读取其配置和预配 VM。
- 低于 2.6.37 的 Linux 内核版本不支持具有更大 VM 大小的 Hyper-V 上的 NUMA。 此问题主要影响使用上游 Centos 2.6.32 内核的较旧发行版,已在 Centos 6.6 (kernel-2.6.32-504) 中得到解决。 如果系统运行版本低于 2.6.37 的自定义内核或版本低于 2.6.32-504 的基于 RHEL 的内核,则这些系统必须在 grub.conf 中的内核命令行上设置启动参数
numa=off
。 有关详细信息,请参阅 Red Hat KB 436883。 - 不要在 OS 磁盘上配置交换分区。
- Azure 上所有 VHD 的虚拟大小必须已按 1 MB 对齐。 从原始磁盘转换为 VHD 时,必须确保在转换前的原始磁盘大小是 1 MB 的倍数。 有关详细信息,请参阅 Linux 安装说明。
注意
Cloud-init >= 21.2 会删除 udf 要求。 但是,如果未启用 udf 模块,cdrom 将不会在预配期间装载,从而阻止应用自定义数据。 解决方法是使用用户数据应用自定义数据。 但是,与自定义数据不同,用户数据不会加密。 https://cloudinit.readthedocs.io/en/latest/topics/format.html
CentOS 6.x
重要
请注意,CentOS 6 已终止其生命周期 (EOL),已不再受 CentOS 社区支持。 这意味着不会为此版本发布进一步的更新或安全修补程序,从而使其容易受到潜在安全风险的影响。 强烈建议升级到最新版本的 CentOS,以确保系统的安全性和稳定性。 请向 IT 部门或系统管理员咨询,以获取进一步的帮助。
在 Hyper-V 管理器中,选择虚拟机。
单击“连接”打开该虚拟机的控制台窗口。
在 CentOS 6 中,NetworkManager 可能会干扰 Azure Linux 代理。 请运行以下命令来卸载该包:
sudo rpm -e --nodeps NetworkManager
创建或编辑文件
/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
修改 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
通过运行以下命令来确保网络服务会在引导时启动:
sudo chkconfig network on
如果要使用 Azure 数据中心托管的 OpenLogic 镜像,则将
/etc/yum.repos.d/CentOS-Base.repo
文件替换为以下存储库。 此操作还会添加包含 Azure Linux 代理等其他包的 [openlogic] 存储库:[openlogic] name=CentOS-$releasever - openlogic packages for $basearch baseurl=http://olcentgbl.trafficmanager.net/openlogic/$releasever/openlogic/$basearch/ enabled=1 gpgcheck=0 [base] name=CentOS-$releasever - Base #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #released updates [updates] name=CentOS-$releasever - Updates #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/updates/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #additional packages that may be useful [extras] name=CentOS-$releasever - Extras #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/extras/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #additional packages that extend functionality of existing packages [centosplus] name=CentOS-$releasever - Plus #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #contrib - packages by Centos Users [contrib] name=CentOS-$releasever - Contrib #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib&infra=$infra baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/contrib/$basearch/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
注意
本指南的余下部分假设你至少会使用
[openlogic]
存储库,下面将使用该存储库安装 Azure Linux 代理。将下列行添加到 /etc/yum.conf:
http_caching=packages
运行以下命令清除当前 yum 元数据并使用最新包更新系统:
sudo yum clean all
建议将所有包都更新到最新版本,除非要为较旧版本的 CentOS 创建映像:
sudo yum -y update
运行此命令后,可能需要重新启动。
(可选)安装适用于 Linux Integration Services (LIS) 的驱动程序。
重要
此步骤对于 CentOS 6.3 和更早版本是必需的,对于之后的版本是可选的。
sudo rpm -e hypervkvpd ## (may return error if not installed, that's OK) sudo yum install microsoft-hyper-v
此外,可以按照 LIS 下载页上的手动安装说明操作将 RPM 安装到 VM 中。
安装 Azure Linux 代理和依赖项。 启动并启用 waagent 服务:
sudo yum install python-pyasn1 WALinuxAgent sudo service waagent start sudo chkconfig waagent on
如果没有按步骤 3 中所述移除 NetworkManager 包和 NetworkManager-gnome 包,则安装 WALinuxAgent 包时会移除它们。
在 grub 配置中修改内核引导行,以使其包含 Azure 的其他内核参数。 为此,请在文本编辑器中打开
/boot/grub/menu.lst
,并确保默认内核包含以下参数:console=ttyS0 earlyprintk=ttyS0 rootdelay=300
这还将确保所有控制台消息都发送到第一个串行端口,从而可以协助 Azure 支持人员调试问题。
除此之外,建议删除以下参数:
rhgb quiet crashkernel=auto
图形界面式引导和
quiet boot
在云环境中不适用,因为在云环境中,我们希望将所有日志发送到串行端口。 可以根据需要配置crashkernel
选项,但请注意,此参数会导致虚拟机中的可用内存量减少 128MB 或更多,这在较小的虚拟机大小上可能会出现问题。重要
CentOS 6.5 和更早版本还必须设置内核参数
numa=off
。请确保已安装 SSH 服务器且已将其配置为在引导时启动。 这通常是默认设置。
不要在 OS 磁盘上创建交换空间。
Azure Linux 代理可使用在 Azure 上设置后附加到虚拟机的本地资源磁盘自动配置交换空间。 本地资源磁盘是临时磁盘,并可能在取消预配 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.
运行以下命令可取消对虚拟机的预配并且对其进行准备以便在 Azure 上进行预配:
sudo waagent -force -deprovision+user sudo export HISTSIZE=0
注意
如果要迁移特定的虚拟机,但不希望创建通用化映像,请跳过“取消预配”步骤。
- 在 Hyper-V 管理器中单击“操作”->“关闭”。 Linux VHD 现已准备好上传到 Azure。
CentOS 7.0+
CentOS 7(和类似衍生产品)中的更改
为 Azure 准备 CentOS 7 虚拟机与 CentOS 6 类似,但有几个值得注意的重要区别:
NetworkManager 包不再与 Azure Linux 代理冲突。 默认会安装此包,建议不要删除。
GRUB2 现在用作默认引导加载程序,因此用于编辑内核参数的过程已更改(请参见下文)。
XFS 现在是默认文件系统。 如果需要,仍可以使用 ext4 文件系统。
由于 CentOS 8 Stream 和更新版本默认不再包含
network.service
,因此需要手动安装它:sudo yum install network-scripts sudo systemctl enable network.service
配置步骤
在 Hyper-V 管理器中,选择虚拟机。
单击“连接”打开该虚拟机的控制台窗口。
创建或编辑文件
/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 NM_CONTROLLED=no
修改 udev 规则,以免为以太网接口生成静态规则。 在 Azure 或 Hyper-V 中克隆虚拟机时,这些规则可能会引发问题:
sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
如果要使用 Azure 数据中心托管的 OpenLogic 镜像,则将
/etc/yum.repos.d/CentOS-Base.repo
文件替换为以下存储库。 这还会添加包含 Azure Linux 代理包的 [openlogic] 存储库:[openlogic] name=CentOS-$releasever - openlogic packages for $basearch baseurl=http://olcentgbl.trafficmanager.net/openlogic/$releasever/openlogic/$basearch/ enabled=1 gpgcheck=0 [base] name=CentOS-$releasever - Base #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 #released updates [updates] name=CentOS-$releasever - Updates #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/updates/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 #additional packages that may be useful [extras] name=CentOS-$releasever - Extras #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/extras/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 #additional packages that extend functionality of existing packages [centosplus] name=CentOS-$releasever - Plus #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra baseurl=http://olcentgbl.trafficmanager.net/centos/$releasever/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
注意
本指南的余下部分假设你至少会使用
[openlogic]
存储库,下面将使用该存储库安装 Azure Linux 代理。运行以下命令以清除当前 yum 元数据并安装所有更新:
sudo yum clean all
建议将所有包都更新到最新版本,除非要为较旧版本的 CentOS 创建映像:
sudo yum -y update
运行此命令后,可能需要重新启动。
在 grub 配置中修改内核引导行,以使其包含 Azure 的其他内核参数。 为此,请在文本编辑器中打开
/etc/default/grub
并编辑GRUB_CMDLINE_LINUX
参数,例如:GRUB_CMDLINE_LINUX="rootdelay=300 console=ttyS0 earlyprintk=ttyS0 net.ifnames=0"
这还将确保所有控制台消息都发送到第一个串行端口,从而可以协助 Azure 支持人员调试问题。 此外,还会关闭 NIC 的新 CentOS 7 命名约定。 除此之外,建议删除以下参数:
rhgb quiet crashkernel=auto
图形界面式引导和安静引导不适用于云环境,因为在云环境中,我们希望将所有日志发送到串行端口。 可以根据需要配置
crashkernel
选项,但请注意,此参数会导致虚拟机中的可用内存量减少 128MB 或更多,这在较小的虚拟机大小上可能会出现问题。按照上面所示编辑完
/etc/default/grub
后,请运行以下命令以重新生成 grub 配置:sudo grub2-mkconfig -o /boot/grub2/grub.cfg
注意
如果要上传已启用 UEFI 的 VM,则用于更新 grub 的命令会是 grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
。 此外,必须在内核中启用 vfat 内核模块,否则预配会失败。
确保启用“udf”模块。 删除/禁用它们将导致预配/启动失败。 (_Cloud-init >= 21.2 会删除 udf 要求。阅读文档顶部可获取更多详细信息。)
如果要从 VMware、VirtualBox 或 KVM 生成映像:请确保 initramfs 中包含 Hyper-V 驱动程序:
编辑
/etc/dracut.conf
,添加内容:add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
重新生成 initramfs:
sudo dracut -f -v
为 Azure VM 扩展安装 Azure Linux 代理和依赖项:
sudo yum install python-pyasn1 WALinuxAgent sudo systemctl enable waagent
安装 cloud-init 来处理预配
sudo yum install -y cloud-init cloud-utils-growpart gdisk hyperv-daemons
- 为 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
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
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 if [[ -f /mnt/swapfile ]]; then echo Removing swapfile - RHEL uses a swapfile by default swapoff /mnt/swapfile rm /mnt/swapfile -f fi 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
交换配置
不要在操作系统磁盘上创建交换空间。
以前,Azure Linux 代理用于通过在 Azure 上预配虚拟机后附加到虚拟机的本地资源磁盘自动配置交换空间。 但是,现在这由 cloud-init 处理,你不能使用 Linux 代理来格式化资源磁盘以创建交换文件,请在
/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 时,将此代码作为 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"] - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"] EOF
运行以下命令可取消对虚拟机的预配并且对其进行准备以便在 Azure 上进行预配:
注意
如果要迁移特定的虚拟机,但不希望创建通用化映像,请跳过“取消预配”步骤。
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
在 Hyper-V 管理器中单击“操作”->“关闭”。 Linux VHD 现已准备好上传到 Azure。
后续步骤
现在,可以使用 CentOS Linux 虚拟硬盘在 Azure 中创建新的 Azure 虚拟机。 如果是首次将 .vhd 文件上传到 Azure,请参阅从自定义磁盘创建 Linux VM。