为 Azure 准备 Oracle Linux 虚拟机

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

本文假定已在虚拟硬盘中安装了 Oracle Linux 操作系统。 存在多个用于创建 .vhd 文件的工具,例如 Hyper-V 等虚拟化解决方案。 有关说明,请参阅安装 Hyper-V 角色和配置虚拟机

Oracle Linux 安装说明

  • 另请参阅常规 Linux 安装说明,获取更多有关如何为 Azure 准备 Linux 的提示。
  • Hyper-V 和 Azure 支持具有 Unbreakable Enterprise Kernel (UEK) 或 Red Hat 兼容内核的 Oracle Linux。
  • Hyper-V 和 Azure 不支持 Oracle 的 UEK2,因为它不包括所需的驱动程序。
  • Azure 不支持 VHDX 格式,仅支持 固定大小的 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

Oracle Linux 6.X

重要

请注意,Oracle Linux 6.x 已经 EOL。 Oracle Linux 版本 6.10 提供 ELS 支持,但该支持将于 2024 年 7 月结束

必须在操作系统中完成特定的配置步骤才能使虚拟机在 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 中克隆虚拟机时,这些规则可能会引发问题:

    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 选项,但请注意,此参数会导致虚拟机中的可用内存量减少 128MB 或更多,这在较小的虚拟机大小上可能会出现问题。

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

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

    sudo yum install WALinuxAgent
    

    如果未按步骤 2 所述移除 NetworkManager 包和 NetworkManager-gnome 包,则安装 WALinuxAgent 包将移除它们。

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

    Azure Linux 代理可使用在 Azure 上设置后附加到虚拟机的本地资源磁盘自动配置交换空间。 本地资源磁盘是临时磁盘,并可能在取消预配 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. 运行以下命令可取消对虚拟机的预配并且对其进行准备以便在 Azure 上进行预配:

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


Oracle Linux 7.0 及更高版本

Oracle Linux 7 中的更改

为 Azure 准备 Oracle Linux 7 虚拟机非常类似于 Oracle Linux 6,但有几个值得注意的重要区别:

  • Azure 支持具有 Unbreakable Enterprise Kernel (UEK) 或 Red Hat 兼容内核的 Oracle Linux。 建议使用具有 UEK 的 Oracle Linux。
  • NetworkManager 包不再与 Azure Linux 代理冲突。 默认会安装此包,建议不要删除。
  • GRUB2 现在用作默认引导加载程序,因此用于编辑内核参数的过程已更改(请参见下文)。
  • XFS 现在是默认文件系统。 如果需要,仍可以使用 ext4 文件系统。

配置步骤

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

    sudo ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
    
  6. 通过运行以下命令来确保网络服务会在引导时启动:

    sudo chkconfig network on
    
  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 支持人员调试问题。 它还会关闭具有 Unbreakable Enterprise Kernel 的 Oracle Linux 7 中 NIC 的命名约定。 除此之外,建议删除以下参数:

       rhgb quiet crashkernel=auto
    

    图形界面式引导和安静引导在云环境中不适用,在云环境中,我们希望所有日志都发送到串行端口。

    可以根据需要配置 crashkernel 选项,但请注意,此参数会导致虚拟机中的可用内存量减少 128MB 或更多,这在较小的虚拟机大小上可能会出现问题。

  10. 按照上面所示完成编辑“/etc/default/grub”后,运行以下命令以重新生成 grub 配置:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  11. 请确保已安装 SSH 服务器且将其配置为在引导时启动。 这通常是默认设置。

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

    sudo yum install WALinuxAgent
    sudo systemctl enable waagent
    
  13. 安装 cloud-init 来处理预配

    sudo yum install -y cloud-init cloud-utils-growpart gdisk hyperv-daemons
    
  14. 为 cloud-init 配置 waagent

    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
    
  15. 交换配置。 不要在操作系统磁盘上创建交换空间。

    以前,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 时执行此操作:
    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
    
  16. 运行以下命令可取消对虚拟机的预配并且对其进行准备以便在 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
    

    注意

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

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

后续步骤

现在,已准备就绪,可以使用 Oracle Linux .vhd 在 Azure 中创建新的虚拟机了。 如果是首次将 .vhd 文件上传到 Azure,请参阅从自定义磁盘创建 Linux VM