为 Azure 准备基于 CentOS 的虚拟机

注意

本文引用了 CentOS,这是一个接近生命周期结束 (EOL) 状态的 Linux 发行版。 请相应地考虑使用和规划。 有关详细信息,请参阅 CentOS 生命周期结束指导

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

了解如何创建和上传包含基于 CentOS 的 Linux 操作系统 (OS) 的 Azure 虚拟硬盘 (VHD)。 有关详细信息,请参阅:

先决条件

本文假设已在 VHD 中安装了 CentOS(或类似的衍生产品)Linux OS。 可使用多种工具创建 .vhd 文件。 一个例子是虚拟化解决方案(如 Hyper-V)。 有关说明,请参阅安装 Hyper-V 角色和配置 VM

CentOS 安装说明

  • 有关如何为 Azure 准备 Linux 的更多提示,请参阅常规 Linux 安装说明
  • Azure 不支持 VHDX 格式,仅支持固定大小的 VHD。 可使用 Hyper-V 管理器或 convert-vhd cmdlet 将磁盘转换为 VHD 格式。 如果使用 VirtualBox,则选择“固定大小”,而不是在创建磁盘时动态分配的默认值。
  • 必须在内核中启用 vfat 内核模块。
  • 在安装 Linux 系统时,建议使用标准分区而不是逻辑卷管理器 (LVM)(通常是许多安装的默认设置)。 使用分区可避免 LVM 名称与克隆 VM 发生冲突,特别是在 OS 磁盘需要连接到另一台相同的 VM 以进行故障排除的情况下。 LVMRAID 也可在数据磁盘上使用。
  • 需要对装载用户定义的函数 (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 的基于 Red Hat Enterprise Linux (RHEL) 的内核,则这些系统必须在 grub.conf 中的内核命令行上设置启动参数 numa=off。 有关详细信息,请参阅 Red Hat KB 436883
  • 不要在 OS 磁盘上配置交换分区。
  • Azure 上所有 VHD 的虚拟大小必须已按 1 MB 对齐。 从原始磁盘转换为 VHD 时,必须确保在转换前的原始磁盘大小是 1 MB 的倍数。 有关详细信息,请参阅 Linux 安装说明

注意

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

CentOS 6.x

重要

CentOS 6 已到达其 EOL,不再受 CentOS 社区支持。 不会为此版本发布进一步的更新或安全修补程序,从而使其容易受到潜在安全风险的影响。 强烈建议升级到更新版本的 CentOS,以确保系统的安全性和稳定性。 如需进一步的帮助,请向 IT 部门或系统管理员咨询。

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

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

  3. 在 CentOS 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 时,这些规则可能会引发问题:

    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
    
  7. 确保网络服务在引导时启动:

    sudo chkconfig network on
    
  8. 若要使用 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 might 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 代理。

  9. 将以下行添加到 /etc/yum.conf

    http_caching=packages
    
  10. 清除当前 yum 元数据并使用最新包更新系统:

    sudo yum clean all
    

    建议将所有包都更新到最新版本,除非要为较旧版本的 CentOS 创建映像:

    sudo yum -y update
    

    运行此命令后,可能需要重新启动。

  11. 可选:安装适用于 Linux Integration Services (LIS) 的驱动程序。

    重要

    此步骤对于 CentOS 6.3 和更早版本是必需的,对于之后的版本是可选的。

    sudo rpm -e hypervkvpd  ## (might return an error if not installed, that's OK)
    sudo yum install microsoft-hyper-v
    

    此外,可以按照 LIS 下载页上的手动安装说明操作将 RPM 安装到 VM 中。

  12. 安装 Azure Linux 代理和依赖项。 启动并启用 waagent 服务:

    sudo yum install python-pyasn1 WALinuxAgent
    sudo service waagent start
    sudo chkconfig waagent on
    

    如果尚未按步骤 3 所述移除 NetworkManager 包和 NetworkManager-gnome 包,则 WALinuxAgent 包会移除它们。

  13. 在 grub 配置中修改内核引导行,以包含 Azure 的其他内核参数。 若要执行此步骤,请在文本编辑器中打开 /boot/grub/menu.lst,并确保默认内核包含以下参数:

    console=ttyS0 earlyprintk=ttyS0 rootdelay=300
    

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

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

    rhgb quiet crashkernel=auto
    

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

    重要

    CentOS 6.5 和更早版本还必须设置内核参数 numa=off

  14. 确保已安装安全外壳服务器且已将其配置为在引导时启动。 此设置通常是默认设置。

  15. 不要在 OS 磁盘上创建交换空间。

    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. 取消对 VM 的预配并且对其进行准备以便在 Azure 上进行预配:

    sudo waagent -force -deprovision+user
    sudo export HISTSIZE=0
    

    注意

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

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

CentOS 7.0+

如果使用 CentOS 7.0+,请执行后续部分中的步骤。

CentOS 7(和类似衍生产品)中的更改

为 Azure 准备 CentOS 7 VM 的操作与 CentOS 6 类似。 有几个显著的差异值得注意:

  • NetworkManager 包不再与 Azure Linux 代理冲突。 默认安装此包,建议不要删除它。

  • GRUB2 现在用作默认引导加载程序,因此用于编辑内核参数的过程已更改。 (请参阅“配置步骤”部分。)

  • XFS 现在是默认文件系统。 如果需要,仍可以使用 ext4 文件系统。

  • 由于 CentOS 8 Stream 和更新版本默认不再包含 network.service,因此需要手动安装它:

    sudo yum install network-scripts
    sudo systemctl enable network.service
    

配置步骤

  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
    NM_CONTROLLED=no
    
  5. 修改 udev 规则,以避免产生以太网接口的静态规则。 在 Azure 或 Hyper-V 中克隆 VM 时,这些规则可能会引发问题:

    sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
    
  6. 如果想要使用 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 might 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 代理。

  7. 清除当前 yum 元数据并安装所有更新:

    sudo yum clean all
    

    建议将所有包都更新到最新版本,除非要为较旧版本的 CentOS 创建映像:

    sudo yum -y update
    

    运行此命令后,可能需要重新启动。

  8. 在 grub 配置中修改内核引导行,以包含 Azure 的其他内核参数。 若要执行此步骤,请在文本编辑器中打开 /etc/default/grub 并编辑 GRUB_CMDLINE_LINUX 参数。 例如:

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

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

    rhgb quiet crashkernel=auto
    

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

  9. 编辑完 /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 要求。有关详细信息,请阅读文档顶部的内容。)

  10. 如果要从 VMware、VirtualBox 或 KVM 生成映像,请确保 initramfs 中包含 Hyper-V 驱动程序:

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

      add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
      
    2. 重新生成 initramfs:

      sudo dracut -f -v
      
  11. 为 Azure VM 扩展安装 Azure Linux 代理和依赖项:

    sudo yum install python-pyasn1 WALinuxAgent
    sudo systemctl enable waagent
    
  12. 安装 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
    
  13. 交换配置:

    1. 不要在 OS 磁盘上创建交换空间。

      以前,Azure Linux 代理用于通过在 Azure 上预配 VM 后附加到 VM 的本地资源磁盘自动配置交换空间。 但是,现在由 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
      
    2. 如果要挂载、格式化和创建交换文件,你可以:

      • 请在每次创建 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
        
  14. 运行以下命令可取消对 VM 的预配并且对其进行准备以便在 Azure 上进行预配。

    注意

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

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

现在可以使用 CentOS Linux VHD 在 Azure 中创建新的 VM 了。 如果是首次将 .vhd 文件上传到 Azure,请参阅从自定义磁盘创建 Linux VM