你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

为 Azure 准备 SLES 或 openSUSE Leap 虚拟机

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

在某些情况下,你可能希望在 Azure 环境中使用自定义的 SUSE 或 openSUSE Leap Linux VM,并能够通过自动化来生成这些类型的 VM。 本文演示如何创建和上传包含 SUSE Linux 操作系统的自定义 Azure 虚拟硬盘 (VHD)。

先决条件

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

SLES/openSUSE Leap 安装说明

  • 有关为 Azure 准备 Linux 映像的更多提示,请参阅常规 Linux 安装说明
  • Azure 不支持 VHDX 格式,仅支持固定大小的 VHD。 可使用 Hyper-V 管理器或 convert-vhd cmdlet 将磁盘转换为 VHD 格式。
  • Azure 支持 Gen1(BIOS 引导)和 Gen2(UEFI 引导)虚拟机。
  • 必须在内核中启用 vfat 内核模块
  • 在安装 Linux 操作系统时,请使用标准分区而不是逻辑卷管理器 (LVM) 托管分区(通常是许多安装的默认设置)。 使用标准选项会避免 LVM 与克隆 VM 发生名称冲突,特别是在 OS 磁盘需要连接到另一台 VM 以进行故障排除的情况下。 如果需要,可以在数据磁盘上使用 LVMRAID
  • 不要在 OS 磁盘上配置交换分区。 可以配置 Linux 代理,以在临时资源磁盘上创建交换文件。 有关配置交换空间的详细信息,请参阅以下步骤。
  • Azure 上所有 VHD 的虚拟大小必须已按 1 MB 对齐。 从原始磁盘转换为 VHD 时,必须确保在转换前的原始磁盘大小是 1 MB 的倍数。 有关详细信息,请参阅 Linux 安装说明

备注

(Cloud-init >= 21.2 删除了 udf 要求。)但是,如果未启用 udf 模块,cdrom 将无法在预配期间装载,从而无法应用自定义数据。 解决方法是使用用户数据来应用自定义数据,但与自定义数据不同,用户数据未加密。 https://cloudinit.readthedocs.io/en/latest/topics/format.html

使用 SUSE Studio

SUSE Studio 可以轻松创建和管理 Azure 和 Hyper-V 的 SLES 和 openSUSE Leap 映像。 要自定义用户自己的 SUSE 和 openSUSE Leap 映像,推荐的方法是 SUSE Studio。

作为一种构建你自己的 VHD 的替代方法,SUSE 也会在 VM Depot 上发布 SLES 的 BYOS(自带订阅)映像。

准备 SUSE Linux Enterprise Server for Azure

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

  2. 单击“连接” 打开虚拟机窗口。

  3. 注册 SUSE Linux Enterprise 系统以允许其下载更新并安装程序包。

  4. 使用最新修补程序更新系统:

    sudo zypper update
    
  5. 安装 Azure Linux 代理和 cloud-init

    SUSEConnect -p sle-module-public-cloud/15.2/x86_64  (SLES 15 SP2)
    sudo zypper refresh
    sudo zypper install python-azure-agent
    sudo zypper install cloud-init
    
  6. 启用 waagent 和 cloud-init 以便在引导时启动

    sudo -i
    chkconfig waagent on
    systemctl enable cloud-init-local.service
    systemctl enable cloud-init.service
    systemctl enable cloud-config.service
    systemctl enable cloud-final.service
    systemctl daemon-reload
    cloud-init clean
    exit
    
  7. 更新 waagent 和 cloud-init 配置

    sed -i 's/Provisioning.UseCloudInit=n/Provisioning.UseCloudInit=auto/g' /etc/waagent.conf
    sed -i 's/Provisioning.Enabled=y/Provisioning.Enabled=n/g' /etc/waagent.conf
    
    sh -c 'printf "datasource:\n  Azure:" > /etc/cloud/cloud.cfg.d/91-azure_datasource.cfg'
    sh -c 'printf "reporting:\n  logging:\n    type: log\n  telemetry:\n    type: hyperv" > /etc/cloud/cloud.cfg.d/10-azure-kvp.cfg'
    exit
    
  8. 编辑“/etc/default/grub”文件,通过添加以下行来确保将控制台日志发送到串行端口:

    console=ttyS0 earlyprintk=ttyS0 
    

    接下来,通过运行以下命令应用此更改:

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

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

  9. 确保“/etc/fstab”文件使用磁盘 UUID 引用磁盘 (by-uuid)

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

    sudo -i
    ln -s /dev/null /etc/udev/rules.d/75-persistent-net-generator.rules
    rm -f /etc/udev/rules.d/70-persistent-net.rules
    exit
    
  11. 建议编辑“/etc/sysconfig/network/dhcp”文件,并将 DHCLIENT_SET_HOSTNAME 参数更改为以下值:

    DHCLIENT_SET_HOSTNAME="no"
    
  12. 在“/etc/sudoers”文件中,注释掉或删除以下行(如果存在):

    Defaults targetpw   # ask for the password of the target user i.e. root
    ALL    ALL=(ALL) ALL   # WARNING! Only use this setting together with 'Defaults targetpw'!
    
  13. 请确保已安装 SSH 服务器且将其配置为在引导时启动。

  14. 交换配置

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

    以前,Azure Linux 代理用于使用在 Azure 上预配虚拟机后附加到虚拟机的本地资源磁盘自动配置交换空间。 但是,此步骤现在由 cloud-init 处理,你不能使用 Linux 代理来格式化资源磁盘或创建交换文件。 使用以下命令来对 /etc/waagent.conf 进行适当的修改:

    sudo -i    
    sed -i 's/ResourceDisk.Format=y/ResourceDisk.Format=n/g' /etc/waagent.conf
    sed -i 's/ResourceDisk.EnableSwap=y/ResourceDisk.EnableSwap=n/g' /etc/waagent.conf
    exit
    

    有关 waagent.conf 配置选项的详细信息,请参阅 Linux 代理配置文档。

    如果要挂载、格式化和创建交换分区,你可以:

    • 每次创建 VM 时,将此配置作为 cloud-init 配置传入。

    • 使用融入映像中的 cloud-init 指令,该指令在每次创建 VM 时配置交换空间:

      sudo -i
      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"]
        - ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
      EOF
      exit
      

注意

确保启用“udf”模块。 将它列入阻止列表或删除它会导致预配失败。 (_Cloud-init >= 21.2 将删除 udf 要求。请阅读文档顶部的内容以获取更多详细信息)

  1. 运行以下命令可取消对虚拟机的预配并且对其进行准备以便在 Azure 上进行预配:

    sudo rm -f /var/log/waagent.log
    sudo cloud-init clean
    
    waagent -force -deprovision+user
    rm -f ~/.bash_history
    
    export HISTSIZE=0
    
    logout
    
  2. 在 Hyper-V 管理器中单击“操作”->“关闭”。 现在,已准备好将 Linux VHD 上传到 Azure


准备 openSUSE 15.2+

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

  2. 单击“连接” 打开虚拟机窗口。

  3. 在终端中,运行命令“zypper lr”。 如果此命令返回了类似于下面的输出,则表示已按预期配置了存储库,不需要进行任何调整(请注意版本号可能有所不同):

    # Alias “属性” 已启用 刷新
    1 Cloud:Tools_15.2 Cloud:Tools_15.2
    2 openSUSE_15.2_OSS openSUSE_15.2_OSS
    3 openSUSE_15.2_Updates openSUSE_15.2_Updates

    如果该命令返回“未定义存储库...”,则使用以下命令来添加这些存储库:

    sudo zypper ar -f http://download.opensuse.org/repositories/Cloud:Tools/openSUSE_15.2 Cloud:Tools_15.2
    sudo zypper ar -f https://download.opensuse.org/distribution/15.2/repo/oss openSUSE_15.2_OSS
    sudo zypper ar -f http://download.opensuse.org/update/15.2 openSUSE_15.2_Updates
    

    然后,可以通过再次运行命令“zypper lr”来验证已添加存储库。 如果未启用某个相关的更新存储库,请使用以下命令启用该存储库:

    sudo zypper mr -e [NUMBER OF REPOSITORY]
    
  4. 将内核更新为可用的最新版本:

    sudo zypper up kernel-default
    

    或者要使用所有最新补丁更新操作系统:

    sudo zypper update
    
  5. 安装 Azure Linux 代理。

    sudo zypper install WALinuxAgent
    
  6. 在 grub 配置中修改内核引导行,使其包含 Azure 的其他内核参数。 为此,请在文本编辑器中打开“/boot/grub/menu.lst”,并确保默认内核包含以下参数:

     console=ttyS0 earlyprintk=ttyS0 
    

    此选项会确保所有控制台消息都发送到第一个串行端口,从而可以协助 Azure 支持人员调试问题。 此外,从内核引导行删除以下参数(如果它们存在):

     libata.atapi_enabled=0 reserve=0x1f0,0x8
    
  7. 建议编辑文件“/etc/sysconfig/network/dhcp”,并将 DHCLIENT_SET_HOSTNAME 参数更改为以下设置:

     DHCLIENT_SET_HOSTNAME="no"
    
  8. 重要提示:在“/etc/sudoers”文件中,注释掉或删除以下行(如果存在):

    Defaults targetpw   # ask for the password of the target user i.e. root
    ALL    ALL=(ALL) ALL   # WARNING! Only use this together with 'Defaults targetpw'!
    
  9. 请确保已安装 SSH 服务器且将其配置为在引导时启动。

  10. 不要在 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 the size to whatever you need it to be.
    
  11. 确保在启动时运行 Azure Linux 代理:

    sudo systemctl enable waagent.service
    
  12. 运行以下命令可取消对虚拟机的预配并且对其进行准备以便在 Azure 上进行预配:

    rm -f ~/.bash_history # Remove current user history
    
    sudo -i
    rm -rf /var/lib/waagent/
    rm -f /var/log/waagent.log
    
    waagent -force -deprovision+user
    rm -f ~/.bash_history # Remove root user history
    
    export HISTSIZE=0
    
    logout
    
  13. 在 Hyper-V 管理器中单击“操作”->“关闭”。 现在,已准备好将 Linux VHD 上传到 Azure

后续步骤

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