为 Azure 准备 SLES 或 openSUSE Leap 虚拟机
适用于: ✔️ Linux VM ✔️ 灵活规模集 适用于: ✔️ 统一规模集
在某些情况下,你可能希望在 Azure 环境中使用自定义的 SUSE Linux Enterprise Server (SLES) 或 openSUSE Leap Linux 虚拟机 (VM),并能够通过自动化来生成这些类型的 VM。 本文演示如何创建和上传包含 SUSE Linux 操作系统的自定义 Azure 虚拟硬盘 (VHD)。
先决条件
本文假定你已在虚拟硬盘中安装了 SLES 或 openSUSE Leap Linux 操作系统。 可使用多种工具创建 .vhd 文件。 例如,可使用 Hyper-V 等虚拟化解决方案。 有关说明,请参阅安装 Hyper-V 并创建虚拟机。
SLES/openSUSE Leap 安装说明
- 有关为 Azure 准备 Linux 映像的更多提示,请参阅常规 Linux 安装说明。
- Azure 不支持 Windows 硬盘映像 (.vhdx) 文件。 仅虚拟机外部支持 VHD (.vhd) 文件。 可使用 Hyper-V 管理器或
Convert-VHD
cmdlet 将磁盘转换为 VHD 格式。 - Azure 支持 Gen1(BIOS 引导)和 Gen2(UEFI 引导)虚拟机。
- 必须在内核中启用虚拟文件分配表 (VFAT) 内核模块。
- 不要在 OS 磁盘上配置交换分区。 可将 Linux 代理配置为在临时资源磁盘上创建交换文件。 有关配置交换空间的详细信息,请参阅本文后面的步骤。
- Azure 上所有 VHD 的虚拟大小必须已按 1 MB 对齐。 从原始磁盘转换为 VHD 时,请确保在转换前的原始磁盘大小是 1 MB 的倍数。 有关详细信息,请参阅常规 Linux 安装说明。
注意
Cloud-init 版本 21.2 或更高版本会删除用户定义的函数 (UDF) 要求。 但如果未启用 udf
模块,CD-ROM 将不会在预配期间装载,这会阻止应用自定义数据。 解决方法是应用用户数据。 但是,与自定义数据不同,用户数据不会加密。 有关详细信息,请参阅 cloud-init 文档中的用户数据格式。
使用 SUSE Studio
SUSE Studio 可以轻松创建和管理 Azure 和 Hyper-V 的 SLES 和 openSUSE Leap 映像。 要自定义用户自己的 SUSE 和 openSUSE Leap 映像,推荐的方法是 SUSE Studio。
作为一种构建你自己的 VHD 的替代方法,SUSE 也会在 VM Depot 上发布 SLES 的 BYOS(自带订阅)映像。
为 Azure 准备 SLES
根据需要配置 Azure 和 Hyper-V 模块。
如果软件虚拟机监控程序不是 Hyper-V,则需要将其他模块添加到初始 RAM 磁盘 (initramfs) 中,才能在 Azure 中成功启动。
编辑 /etc/dracut.conf 文件并在其中添加以下行:
add_drivers+=" hv_vmbus hv_netvsc hv_storvsc "
运行
dracut
命令以重新生成 initramfs 文件:sudo dracut --verbose --force
设置串行控制台。
要成功使用串行控制台,必须在 /etc/defaults/grub 文件中设置多个变量,并在服务器上重新创建 GRUB:
# Add console=ttyS0 and earlyprintk=ttS0 to the variable. # Remove "splash=silent" and "quiet" options. GRUB_CMDLINE_LINUX_DEFAULT="audit=1 no-scroll fbcon=scrollback:0 mitigations=auto security=apparmor crashkernel=228M,high crashkernel=72M,low console=ttyS0 earlyprintk=ttyS0" # Add "console serial" to GRUB_TERMINAL. GRUB_TERMINAL="console serial" # Set the GRUB_SERIAL_COMMAND variable. GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
/usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg
注册 SUSE Linux Enterprise 系统以允许其下载更新并安装程序包。
使用最新修补程序更新系统:
sudo zypper update
安装 Azure VM 代理 (
waagent
) 和 cloud-init:sudo 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
启用
waagent
和 cloud-init 以便在引导时启动:sudo systemctl enable waagent sudo systemctl enable cloud-init-local.service sudo systemctl enable cloud-init.service sudo systemctl enable cloud-config.service sudo systemctl enable cloud-final.service sudo systemctl daemon-reload sudo cloud-init clean
更新 cloud-init 配置:
cat <<EOF | sudo tee /etc/cloud/cloud.cfg.d/91-azure_datasource.cfg datasource_list: [ Azure ] datasource: Azure: apply_network_config: False EOF
sudo cat <<EOF | sudo tee /etc/cloud/cloud.cfg.d/05_logging.cfg # 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 # Make sure mounts and disk_setup are in the init stage: 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
如果要装载、格式化和创建交换分区,一个选项是在每次创建 VM 时传入 cloud-init 配置。
另一个选项是使用映像中的 cloud-init 指令,在每次创建 VM 时配置交换空间:
cat <<EOF | sudo tee -a /etc/systemd/system.conf 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' EOF cat <<EOF | sudo tee /etc/cloud/cloud.cfg.d/00-azure-swap.cfg #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 上预配虚拟机后,Azure Linux 代理会使用附加到虚拟机的本地资源磁盘来自动配置交换空间。 现在,由于 cloud-init 会处理此步骤,因此你不得使用 Azure Linux 代理格式化资源磁盘或创建交换文件。 可使用以下命令对 /etc/waagent.conf 进行适当的修改:
sudo sed -i 's/Provisioning.UseCloudInit=n/Provisioning.UseCloudInit=auto/g' /etc/waagent.conf sudo sed -i 's/Provisioning.Enabled=y/Provisioning.Enabled=n/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
注意
如果使用的 cloud-init 版本低于 21.2,请确保启用
udf
模块。 删除或禁用它将导致预配/启动失败。 Cloud-init 版本 21.2 或更高版本会删除 UDF 要求。确保 /etc/fstab 文件使用磁盘其 UUID (
by-uuid
) 引用磁盘。删除 udev 规则和网络适配器配置文件,以避免为以太网接口生成静态规则。 在 Azure 或 Hyper-V 中克隆虚拟机时,这些规则会引发问题:
sudo rm -f /etc/udev/rules.d/70-persistent-net.rules sudo rm -f /etc/udev/rules.d/85-persistent-net-cloud-init.rules sudo rm -f /etc/sysconfig/network/ifcfg-eth*
建议编辑 /etc/sysconfig/network/dhcp 文件,并将 参数更改为以下值
DHCLIENT_SET_HOSTNAME
:DHCLIENT_SET_HOSTNAME="no"
在 /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'!
确保已安装安全外壳 (SSH) 服务器且已将其配置为在引导时启动:
sudo systemctl enable sshd
清理 cloud-init 阶段:
sudo cloud-init clean --seed --logs
运行以下命令以取消对虚拟机的预配,并准备虚拟机以便在 Azure 上进行预配。
如果要迁移特定的虚拟机,但不希望创建通用化映像,请跳过取消预配步骤。
sudo rm -f /var/log/waagent.log sudo waagent -force -deprovision+user sudo export HISTSIZE=0 sudo rm -f ~/.bash_history
准备 openSUSE 15.4+
在 Hyper-V 管理器的中间窗格中,选择虚拟机。
选择“连接”,打开虚拟机窗口。
在终端中运行命令“
zypper lr
”。 如果此命令返回的输出类似于下面的示例,则表示已按预期配置了存储库,不需要进行任何调整。 (版本号可能有所不同。)# Alias “属性” Enabled GPG 检查 刷新 1 Cloud:Tools_15.4 Cloud:Tools-> 是 (r ) 是 是 2 openSUSE_stable_OSS openSUSE_st-> 是 (r ) 是 是 3 openSUSE_stable_Updates openSUSE_st-> 是 (r ) 是 是 如果
zypper lr
中出现消息“未定义任何存储库”,则必须手动添加存储库。下面是用于添加这些存储库的命令示例(版本和链接可能有所不同):
sudo zypper ar -f https://download.opensuse.org/update/openSUSE-stable openSUSE_stable_Updates sudo zypper ar -f https://download.opensuse.org/repositories/Cloud:/Tools/15.4 Cloud:Tools_15.4 sudo zypper ar -f https://download.opensuse.org/distribution/openSUSE-stable/repo/oss openSUSE_stable_OSS
然后,可通过再次运行命令“
zypper lr
”验证已添加存储库。 如果未启用某个相关的更新存储库,请使用以下命令启用该存储库:sudo zypper mr -e [NUMBER OF REPOSITORY]
将内核更新为可用的最新版本:
sudo zypper up kernel-default
或者使用所有最新补丁更新操作系统:
sudo zypper update
安装 Azure Linux 代理:
sudo zypper install WALinuxAgent
在 GRUB 配置中修改内核引导行,以包含 Azure 的其他内核参数。 为此,请在文本编辑器中打开“/boot/grub/menu.lst”,并确保默认内核包含以下参数:
console=ttyS0 earlyprintk=ttyS0
此选项可确保所有控制台消息都发送到第一个串行端口,从而可以协助 Azure 支持人员调试问题。 此外,从内核引导行删除以下参数(如果它们存在):
libata.atapi_enabled=0 reserve=0x1f0,0x8
建议编辑 /etc/sysconfig/network/dhcp 文件,并将 参数更改为以下设置
DHCLIENT_SET_HOSTNAME
:DHCLIENT_SET_HOSTNAME="no"
在“/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'!
请确保已安装 SSH 服务器且将其配置为在引导时启动。
不要在 OS 磁盘上创建交换空间。
Azure Linux 代理可使用在 Azure 上预配后附加到 VM 的本地资源磁盘自动配置交换空间。 本地资源磁盘是临时磁盘,并将在取消预配 VM 时被清空。
安装 Azure Linux 代理后,按如下所示在 /etc/waagent.conf 中修改参数:
ResourceDisk.Format=n ResourceDisk.Filesystem=ext4 ResourceDisk.MountPoint=/mnt/resource ResourceDisk.EnableSwap=n ResourceDisk.SwapSizeMB=2048 ## NOTE: set the size to whatever you need it to be.
确保在启动时运行 Azure Linux 代理:
sudo systemctl enable waagent.service
运行以下命令以取消对虚拟机的预配,并准备虚拟机以便在 Azure 上进行预配。
如果要迁移特定的虚拟机,但不希望创建通用化映像,请跳过取消预配步骤。
sudo rm -f ~/.bash_history # Remove current user history sudo rm -rf /var/lib/waagent/ sudo rm -f /var/log/waagent.log sudo waagent -force -deprovision+user sudo rm -f ~/.bash_history # Remove root user history sudo export HISTSIZE=0
在 Hyper-V 管理器中选择“操作”>“关闭”。
后续步骤
准备就绪后,现在即可使用 SUSE Linux VHD 在 Azure 中创建新的虚拟机。 如果是首次将 .vhd 文件上传到 Azure,请参阅从自定义磁盘创建 Linux VM。