为 Azure 准备 Oracle Linux 虚拟机

适用于: ✔️ Linux 虚拟机 ✔️ 灵活规模集

本文假定你已将 Oracle Linux 操作系统(OS)安装到虚拟硬盘(VHD)。 可使用多种工具创建 .vhd 文件。 一个例子是虚拟化解决方案(如 Hyper-V)。 有关说明,请参阅安装 Hyper-V 角色并配置虚拟机 (VM)

Oracle Linux 安装说明

重要

本文中的远程 NVMe 准备步骤是可选的。 仅当您要创建一个将通过远程 NVMe 磁盘控制器部署的映像时,才填写此项。 如果目标 VM 使用 SCSI,请跳过远程 NVMe 步骤并保留标准设置。

  • 有关如何为 Azure 准备 Linux 的更多提示,请参阅常规 Linux 安装说明
  • Hyper-V 和 Azure 支持使用 Unbreakable Enterprise Kernel (UEK) 或 Red Hat 兼容内核的 Oracle Linux。
  • oracle 的 UEK2 在 Hyper-V 和 Azure 上不受支持,因为它不包括所需的驱动程序。
  • Azure不支持 VHDX 格式,仅支持 fixed VHD。 可使用 Hyper-V 管理器或 convert-vhd cmdlet 将磁盘转换为 VHD 格式。
  • 需要对装载用户定义的函数(UDF)文件系统的内核支持。 在 Azure 上首次启动时,预配配置会通过附加到该来宾虚拟机的 UDF 格式介质传递给 Linux VM。 Azure Linux 代理必须能够装载 UDF 文件系统才能读取其配置和预配 VM。
  • 在安装 Linux 系统时,建议使用标准分区而不是逻辑卷管理器 (LVM)(通常是许多安装的默认设置)。 这些标准分区可避免 LVM 名称与克隆 VM 发生冲突,特别是在 OS 磁盘需要连接到另一台 VM 以进行故障排除的情况下。 LVMRAID 也可在数据磁盘上使用。
  • 低于 2.6.37 的 Linux 内核版本不支持具有更大 VM 大小的 Hyper-V 上的 NUMA。 此问题主要影响使用上游 Red Hat 2.6.32 内核的较旧分发版,并在 Oracle Linux 6.6 及更高版本中修复。
  • 不要在 OS 磁盘上配置交换分区。
  • Azure 上所有 VHD 的虚拟大小必须对齐到 1 MB。 从原始磁盘转换为 VHD 时,必须确保在转换前的原始磁盘大小是 1 MB 的倍数。 有关详细信息,请参阅 Linux 安装说明
  • 确保已启用 Addons 存储库。 编辑文件 /etc/yum.repos.d/public-yum-ol6.repo(Oracle Linux 6)或 /etc/yum.repos.d/public-yum-ol7.repo(Oracle Linux 7)。 将此文件中 [ol6_addons] 或 [ol7_addons] 部分下的 enabled=0 这一行更改为 enabled=1

重要

使用临时资源磁盘的交换指南仅适用于包含本地临时存储的 VM 大小。 远程磁盘控制器类型 SCSI 或 NVMe 无法确定资源磁盘是否可用。

Oracle Linux 6.X

重要

请记住,Oracle Linux 6.x 已经终止支持。 Oracle Linux 版本 6.10 提供 延长生命周期支持,该支持 将于 2024 年 7 月结束

远程 NVMe 不支持 Oracle Linux 6.x。 仅使用 SCSI 磁盘控制器准备和部署此映像。 请勿从 Oracle Linux 7.0 及更高部分添加 NVMe 设置。

必须完成 OS 中的特定配置步骤,VM 才能在Azure中运行。

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

  2. 选择“连接”以打开虚拟机的窗口。

  3. 卸载 NetworkManager

    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. 安装 python-pyasn1

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

    console=ttyS0 earlyprintk=ttyS0
    

    此设置可确保所有控制台消息都发送到第一个串行端口,这有助于Azure 支持调试问题。

    除上述步骤外,建议 删除 以下参数:

    rhgb quiet crashkernel=auto
    

    图形和静默启动在希望所有日志发送到串行端口的云环境中不起作用。

    如果需要,可以保持 crashkernel 的配置。 此参数可将 VM 中的可用内存量减少 128 MB 或更多,当 VM 较小时,这可能会造成问题。

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

  11. 运行以下命令安装 Azure Linux 代理。 最新版本为 2.0.15。

    sudo yum install WALinuxAgent
    

    安装 WALinuxAgent 包会卸载 NetworkManagerNetworkManager-gnome 包(如果尚未卸载这两个包),如步骤 3“卸载 NetworkManager”中所述。

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

    Azure Linux 代理可以使用预配Azure后附加到 VM 的本地资源磁盘来自动配置交换空间。 本地资源磁盘是 临时 磁盘,在取消预配 VM 时可能会清空。 安装 Azure Linux 代理(请参阅上一步)后,请相应地修改以下参数 /etc/waagent.conf

    ResourceDisk.Format=y
    ResourceDisk.Filesystem=ext4
    ResourceDisk.MountPoint=/mnt
    ResourceDisk.EnableSwap=y
    ResourceDisk.SwapSizeMB=2048    ## NOTE: set this to whatever you need it to be.
    
  13. 解除预配 VM 并准备在 Azure 上重新进行预配。

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


Oracle Linux 7.0 及更高版本

如果使用 Oracle Linux 7.0 或更高版本,请遵循后续部分中的步骤。

Oracle Linux 7 中的更改

准备用于Azure的 Oracle Linux 7 VM 与 Oracle Linux 6 类似,但有几个差异值得注意:

  • Azure支持具有不可破企业内核(UEK)或 Red Hat 兼容内核的 Oracle Linux。 建议将 Oracle Linux 与 UEK 配合使用。
  • NetworkManager 包不再与 Azure Linux 代理冲突。 此包默认安装,建议不要将其删除。
  • GRUB2 现在用作默认启动加载程序,因此编辑内核参数的过程已更改。 (请参阅“配置步骤”部分。
  • XFS 现在是默认文件系统。 如果需要,仍可使用 ext4 文件系统。

配置步骤

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

    sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
    
  6. 确保网络服务在启动时启动:

    sudo systemctl enable NetworkManager
    
  7. 安装 python-pyasn1 包:

    sudo yum install python3-pyasn1
    
  8. 清除当前 yum 元数据并安装任何更新:

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

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

    此修改还可确保所有控制台消息都发送到第一个串行端口,这可以帮助 Azure 支持调试问题。 它还使用 UEK 关闭 Oracle Linux 7 中网络接口卡的命名约定。 我们还建议 删除 以下参数:

       rhgb quiet crashkernel=auto
    

    图形和静默启动在希望所有日志发送到串行端口的云环境中不起作用。

    如果需要,可以保持 crashkernel 的配置。 此参数可将 VM 中的可用内存量减少 128 MB 或更多,当 VM 较小时,这可能会造成问题。

  10. 完成编辑 /etc/default/grub后,重新生成 grub 配置:

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

    注意

    对于 UEFI 安装,GRUB 配置路径可能有所不同。 如果要上传启用了 UEFI 的(Gen2)VM,请按照你的发行版文档中说明的 EFI 配置路径重新构建 GRUB,例如使用 /boot/efi/EFI/redhat/grub.cfg,而不是 /boot/grub2/grub.cfg

  11. 仅当为远程 NVMe 磁盘控制器创建映像时,请验证支持、配置超时并准备初始 RAM 磁盘。 否则,请跳过此步骤。

    1. 通过创建 dracut 配置文件,使 NVMe 驱动程序在将来的 initramfs 映像中持久保存,然后重新生成当前的 initramfs:

      sudo tee /etc/dracut.conf.d/azure-nvme.conf > /dev/null <<EOF
      add_drivers+=" nvme nvme_core "
      EOF
      sudo dracut --force --verbose
      
    2. 将Azure NVMe I/O 超时添加到内核命令行,以便设置在重新启动时保留:

      sudo grubby --update-kernel=ALL --args="nvme_core.io_timeout=240"
      
    3. 确认这两个 NVMe 模块都存在于内核的模块树中,以便将其打包到 initramfs 中。 此检查会读取磁盘上的模块文件,因此即使在 SCSI 准备 VM 上也成功,并且并不表示 NVMe 已加载或使用:

      modinfo nvme
      modinfo nvme_core
      

      每个命令必须返回模块详细信息。 如果找不到任一模块,请在继续之前按照 Oracle Linux 文档安装或启用它。

  12. 确认重新生成的 initramfs 包包含两个 NVMe 驱动程序。 此检查确认映像已准备就绪:

    sudo lsinitrd /boot/initramfs-$(uname -r).img | grep -E 'nvme(_core)?\.ko'
    

    输出必须同时列出 nvme 驱动程序和 nvme_core 驱动程序。 在 NVMe VM 上启动映像后,通过运行 cat /sys/module/nvme_core/parameters/io_timeout验证运行时超时;预期值为 240

  13. 对于 SCSI 和 NVMe 映像,请使用文件系统 UUID 或其他永久性标识符 /etc/fstab。 请勿使用 /dev/sd*/dev/nvme* 设备名称,因为设备名称可以在重新启动或磁盘控制器更改时更改。

    1. 列出块设备及其持久标识符,以便将它们与 /etc/fstab 中的条目进行比较:

      sudo blkid
      
    2. 检查 /etc/fstab 中的语法错误、无效的挂载选项以及无法解析的引用:

      sudo findmnt --verify --verbose
      
  14. 请确保已安装 SSH 服务器且已将其配置为在引导时启动。 此设置通常是默认设置。

  15. 安装 Azure Linux 代理和依赖项:

    sudo yum install WALinuxAgent
    sudo systemctl enable waagent
    
  16. 安装 cloud-init 以处理预配:

    sudo yum install -y cloud-init cloud-utils-growpart gdisk hyperv-daemons
    
  17. 配置waagentcloud-init

    sudo sed -i 's/Provisioning.UseCloudInit=n/Provisioning.UseCloudInit=y/g' /etc/waagent.conf
    sudo sed -i 's/Provisioning.Enabled=y/Provisioning.Enabled=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
    
    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/resource/swapfile ]]; then
    echo Removing swapfile - Oracle Linux 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
    
  18. 交换配置:

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

      先前,在 Azure 上预配 VM 后,Azure Linux 代理会自动使用附加到该 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 时,使用预先嵌入映像中的指令来执行此步骤:
      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/resource"]
        - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
      EOF
      
  19. 解除预配 VM 并准备在 Azure 上重新进行预配。

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

    注意

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

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

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

对于需要从 SCSI 迁移到 NVMe 的现有Azure VM,请使用将 Linux 和 Windows VM 从 SCSI 转换为 NVMe