在虚拟机上使用原始磁盘映像部署 SLE Micro
- 解释
SLE Micro 提供可直接部署到虚拟机的原始映像(也称为预构建映像)。
- 原因
虚拟化部署可节省硬件资源。
- 工作量
读完本文大约需要 20 分钟。
- 目标
SLE Micro 已成功部署到虚拟机。
- 要求
已安装且正在运行
libvirt
和 KVM 虚拟化环境的 VM 主机服务器。至少 32 GB 的磁盘空间,用于部署映像。
(可选)一个配置媒体,例如 USB 闪存盘。
1 关于预构建映像 #
预构建映像代表正在运行的操作系统,随时可供使用。它们不是通过安装程序以传统方式安装的,而是会复制到目标主机的硬盘中。本主题将介绍有关这些预构建映像的基本信息。
在首次引导时,需使用预构建映像中提供的工具对其进行配置。引导加载程序会按照第 1.2 节 “首次引导检测”中所述检测首次引导。每个映像附带默认挂载的子卷,在首次引导配置期间,这些子卷可能会发生更改。有关子卷的细节,请参见第 1.1 节 “默认分区”。
1.1 默认分区 #
提供的预构建映像会使用默认的分区方案,在首次引导期间,可以使用 Ignition 或 Combustion 更改该方案。
如果您要对默认分区方案进行任何更改,根文件系统必须是 Btrfs。
每个映像都具有以下子卷:
/home /root /opt /srv /usr/local /var
/etc
目录会挂载为 OverlayFS,其中上一级目录挂载到 /var/lib/overlay/1/etc/
。
您可以通过 /etc/fstab
中的 x-initrd.mount
选项来识别默认挂载的子卷。其他子卷或分区必须通过 Ignition 或 Combustion 进行配置。
1.2 首次引导检测 #
部署配置只在首次引导时运行。为了区分首次引导和后续引导,完成首次引导后,系统会创建标志文件 /boot/writable/firstboot_happened
。如果文件系统中没有该文件,则会将 ignition.firstboot
属性传递给内核命令行,因而触发 Ignition 和 Combustion 的运行(在 initrd 中)。完成首次引导后,系统便会创建 /boot/writable/firstboot_happened
标志文件。
即使由于配置文件错误或缺失导致配置失败,系统也会创建 /boot/writable/firstboot_happened
标志文件。
1.2.1 在后续引导时强制重配置系统 #
如果您需要在发生首次引导后重配置系统,可以在后续引导时强制重配置。此处可以采取两种做法。
可以将
ignition.firstboot=1
属性传递给内核命令行。可以删除标志文件
/boot/writable/firstboot_happened
。
2 准备配置设备 #
默认情况下,SLE Micro 中仅允许使用 SSH 密钥进行 root
SSH 登录。我们建议在部署过程中创建一个非特权用户用于访问已安装的系统。可以在首次引导时使用 Combustion 或 Ignition 工具创建非特权用户帐户。在系统部署期间创建的非特权用户还可用于访问 Cockpit Web 界面。
要准备配置设备,请执行以下步骤:
将磁盘格式化为 SLE Micro 支持的任何文件系统:Ext3、Ext4 等:
>
sudo mkfs.ext4 /dev/sdY将设备标签设置为
ignition
(使用 Ignition 或 时)或combustion
combustion(仅使用 Combustion 时)。如果需要(例如在 Windows 主机上),请为标签使用大写字母。要为设备设置标签,请运行:>
sudo e2label /dev/sdY ignition可以使用您的虚拟化系统或硬件支持的任何类型的配置存储媒体:ISO 映像、USB 闪存盘等
挂载设备:
>
sudo mount /dev/sdY /mnt创建第 2.1.1.1 节 “
config.ign
”或第 2.2 节 “使用 Combustion 配置 SLE Micro 部署”中所述的目录结构,具体取决于使用的配置工具:>
sudo mkdir /mnt/ignition/或:
>
sudo mkdir -p /mnt/combustion/准备 Ignition 或 Combustion 所用配置的所有元素
2.1.1 Ignition 的工作原理 #
首次引导系统时,Ignition 将作为 initramfs
的一部分加载,并在特定的目录中(在 USB 闪存盘上,或者您可以提供 URL)搜索配置文件。所有更改都是在内核从临时文件系统切换到实际根文件系统前(即在 switch_root
命令发出前)进行的。
Ignition 使用名为 config.ign
的 JSON 格式配置文件。您可以手动编写配置,也可以使用 https://ignite.opensuse.org 上的 Fuel Ignition Web 应用程序生成配置。
Fuel Ignition 尚未涵盖完整的 Ignition 词汇,生成的 JSON 文件可能需要进行额外的手动调整。
2.1.1.1
config.ign
#
配置文件 config.ign
必须位于配置媒体(例如,标签为 ignition
的 USB 记忆棒)的 ignition
子目录中。目录结构必须如下所示:
<root directory> └── ignition └── config.ign
要通过 Ignition 配置创建磁盘映像,可以使用 https://ignite.opensuse.org 上的 Fuel Ignition Web 应用程序。
config.ign
包含多种数据类型:对象、字符串、整数、布尔值和对象列表。如需完整规范,请参见 Ignition
specification v3.3.0。
version
属性是必需的,在 SLE Micro 中,其值必须设置为 3.3.0
或任何更低版本。否则,Ignition 将会失败。
要以 root
身份登录到系统,必须至少包含 root
的口令。但建议通过 SSH 密钥建立访问权限。要配置口令,请务必使用安全口令。如果您使用随机生成的口令,请至少包含 10 个字符。如果您要手动创建口令,请包含 10 个以上的字符,并结合使用大写与小写字母和数字。
2.1.2 Ignition 配置示例 #
2.1.2.1 配置示例 #
本部分提供内置 JSON 格式的 Ignition 配置的几个示例。
第 1.1 节 “默认分区”列出了在运行预构建的映像时默认挂载的子卷。如果您要在默认未挂载的子卷上添加新用户或修改任何文件,则需要先声明此类子卷,以便将其挂载。有关挂载文件系统的详细信息,请参见第 2.1.2.1.1.3 节 “filesystems
属性”。
version
属性为必要属性
每个 config.fcc
都必须包含版本 1.4.0 或更低版本,该版本随后会转换为相应的 Ignition 规范。
2.1.2.1.1 储存配置 #
storage
属性用于配置分区、RAID,定义文件系统,创建文件等。要定义分区,请使用 disks
属性。filesystems
属性用于格式化分区和定义特定分区的挂载点。files
属性可用于在文件系统中创建文件。后续章节中将介绍上述每个属性。
2.1.2.1.1.1 disks
属性 #
disks
属性是设备列表,可用于定义这些设备上的分区。disks
属性必须至少包含一个 device
,其他属性为可选属性。以下示例使用单个虚拟设备,并将磁盘划分为四个分区:
{ "ignition": { "version": "3.0.0" }, "storage": { "disks": [ { "device": "/dev/vda", "partitions": [ { "label": "root", "number": 1, "typeGuid": "4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709" }, { "label": "boot", "number": 2, "typeGuid": "BC13C2FF-59E6-4262-A352-B275FD6F7172" }, { "label": "swap", "number": 3, "typeGuid": "0657FD6D-A4AB-43C4-84E5-0933C84B4F4F" }, { "label": "home", "number": 4, "typeGuid": "933AC7E1-2EB4-4F13-B844-0E14E2AEF915" } ], "wipeTable": true } ] } }
2.1.2.1.1.2 raid
属性 #
raid
是 RAID 阵列列表。raid
的下列属性为必要属性:
- level
特定 RAID 阵列的级别(线性、raid0、raid1、raid2、raid3、raid4、raid5、raid6)
- devices
阵列中设备的列表,通过绝对路径引用这些设备
- name
将用于 md 设备的名称
例如:
{ "ignition": { "version": "3.0.0" }, "storage": { "raid": [ { "devices": [ "/dev/sda", "/dev/sdb" ], "level": "raid1", "name": "system" } ] } }
2.1.2.1.1.3 filesystems
属性 #
filesystems
必须包含以下属性:
- device
设备的绝对路径,如果是物理磁盘,通常为
/dev/sda
- format
文件系统格式(Btrfs、Ext4、xfs、vfat 或 swap)
注意对于 SLE Micro,
root
文件系统必须为 Btrfs 格式。
下面的示例演示如何使用 filesystems
属性。/opt
目录将挂载到 /dev/sda1
分区,该分区为 Btrfs 格式。系统将不会擦除该设备。
例如:
{ "ignition": { "version": "3.0.0" }, "storage": { "filesystems": [ { "device": "/dev/sda1", "format": "btrfs", "path": "/opt", "wipeFilesystem": false } ] } }
普通用户的主目录通常位于 /home/USER_NAME
目录中。由于 /home
默认不会挂载到 initrd 中,因此必须明确定义挂载,才能成功创建用户:
{ "ignition": { "version": "3.1.0" }, "passwd": { "users": [ { "name": "root", "passwordHash": "PASSWORD_HASH", "sshAuthorizedKeys": [ "ssh-rsa SSH_KEY_HASH" ] } ] }, "storage": { "filesystems": [ { "device": "/dev/sda3", "format": "btrfs", "mountOptions": [ "subvol=/@/home" ], "path": "/home", "wipeFilesystem": false } ] } }
2.1.2.1.1.4 files
属性 #
您可以使用 files
属性在计算机上创建任何文件。请注意,要在默认的分区方案之外创建文件,需使用 filesystems
属性定义目录。
在下面的示例中,将使用 files
属性创建一个主机名。将创建文件 /etc/hostname
,其中包含 sl-micro1 主机名:
请记住,JSON 接受十进制数格式的文件模式,例如 420
。
JSON:
{ "ignition": { "version": "3.0.0" }, "storage": { "files": [ { "overwrite": true, "path": "/etc/hostname", "contents": { "source": "data:,sl-micro1" }, "mode": 420 } ] } }
2.1.2.1.1.5 directories
属性 #
directories
属性是将在文件系统中创建的目录列表。directories
属性必须至少包含一个 path
属性。
例如:
{ "ignition": { "version": "3.0.0" }, "storage": { "directories": [ { "path": "/home/tux", "user": { "name": "tux" } } ] } }
2.1.2.1.2 用户管理 #
passwd
属性用于添加用户。由于某些服务(例如 Cockpit)要求使用非 root 用户身份登录,因此请在此处至少定义一个非特权用户。或者,您可以按第 5.3 节 “添加用户”中所述在正在运行的系统中创建此类用户。
要登录系统,请创建 root
和一个普通用户,并设置他们的口令。您需要对口令进行哈希处理,例如使用 openssl
命令来处理:
openssl passwd -6
该命令会为您选择的口令创建哈希。使用此哈希作为 password_hash
属性的值。
例如:
{ "ignition": { "version": "3.0.0" }, "passwd": { "users": [ { "name": "root", "passwordHash": "PASSWORD_HASH", "sshAuthorizedKeys": [ "ssh-rsa SSH_KEY_HASH USER@HOST" ] } ] } }
users
属性必须至少包含一个 name
属性。ssh_authorized_keys
是用户的 SSH 密钥列表。
2.1.2.1.3 启用 systemd
服务 #
您可以通过在 systemd
属性中指定 systemd
服务来启用相应服务。
例如:
{ "ignition": { "version": "3.0.0" }, "systemd": { "units": [ { "enabled": true, "name": "sshd.service" } ] } }
2.2 使用 Combustion 配置 SLE Micro 部署 #
Combustion 是一种 dracut 模块,可用于在首次引导时配置系统。您可以使用 Combustion 来更改默认分区、设置用户口令、创建文件、安装软件包等。
2.2.1 Combustion 的工作原理 #
系统将在 ignition.firstboot
参数传递给内核命令行后调用 Combustion。Combustion 会读取提供的文件(名为 script
)并执行其中的命令,以对文件系统进行更改。如果 script
中包含网络标志,Combustion 会尝试配置网络。挂载 /sysroot
后,Combustion 会尝试激活 /etc/fstab
中的所有挂载点,然后调用 transactional-update
来应用其他更改,例如设置 root
口令或安装软件包。
配置文件 script
必须位于标记为 combustion
的配置媒体的 combustion
子目录中。目录结构必须如下所示:
<root directory> └── combustion └── script └── other files
Combustion 可与 Ignition 搭配使用。如果您要将它们搭配使用,请将配置媒体标记为 ignition
,并在目录结构中添加包含 config.ign
的 ignition
目录,如下所示:
<root directory> └── combustion └── script └── other files └── ignition └── config.ign
在此情况下,Ignition 会先于 Combustion 运行。
2.2.2 Combustion 配置示例 #
2.2.2.1 script
配置文件 #
script
配置文件是一组由 Combustion 在 transactional-update
外壳中分析并执行的命令。本文提供了 Combustion 执行的配置任务的一些示例。
script
文件由外壳解释,所以请务必在文件的第一行以解释器声明开头。例如,对于 Bash:
#!/bin/bash
为了登录系统,请至少包含 root
口令,但建议使用 SSH 密钥建立身份验证。如果您需要使用 root
口令,请务必配置安全口令。对于随机生成的口令,请至少包含 10 个字符。如果您要手动创建口令,请包含 10 个以上的字符,并结合使用大写与小写字母和数字。
2.2.2.1.1 网络配置 #
要在首次引导期间配置并使用网络连接,请在 script
中添加以下语句:
# combustion: network
使用此语句会将 rd.neednet=1
参数传递给 dracut。网络配置默认设为使用 DHCP。如果需要使用不同的网络配置,请按照第 2.2.2.1.2 节 “在 initramfs 中进行修改”中所述操作。
如果不使用该语句,将不会为系统配置任何网络连接。
2.2.2.1.2 在 initramfs 中进行修改 #
您可能需要对 initramfs 环境进行更改,例如,将 NetworkManager 的自定义网络配置写入 /etc/NetworkManager/system-connections/
中。要执行此操作,请使用 prepare
语句。
例如,要使用静态 IP 地址创建连接并配置 DNS,请执行以下操作:
#!/bin/bash # combustion: network prepare set -euxo pipefail nm_config() { umask 077 # Required for NM config mkdir -p /etc/NetworkManager/system-connections/ cat >/etc/NetworkManager/system-connections/static.nmconnection <<-EOF [connection] id=static type=ethernet autoconnect=true [ipv4] method=manual dns=192.168.100.1 address1=192.168.100.42/24,192.168.100.1 EOF } if [ "${1-}" = "--prepare" ]; then nm_config # Configure NM in the initrd exit 0 fi # Redirect output to the console exec > >(exec tee -a /dev/tty0) 2>&1 nm_config # Configure NM in the system curl example.com # Leave a marker echo "Configured with combustion" > /etc/issue.d/combustion
2.2.2.1.3 分区 #
提供的 SLE Micro 原始映像会使用第 1.1 节 “默认分区”中所述的默认分区方案。您可能希望使用不同的分区方式。下面一组示例代码段会将 /home
移至另一个分区。
以下脚本会执行快照中未包含的更改。如果脚本失败且快照被丢弃,那么某些更改将仍然可见且无法还原,例如对 /dev/vdb
设备的更改。
以下代码段会在 /dev/vdb
设备上创建仅含一个分区的 GPT 分区方案:
sfdisk /dev/vdb <<EOF label: gpt type=linux EOF partition=/dev/vdb1
该分区为 Btrfs 格式:
wipefs --all ${partition} mkfs.btrfs ${partition}
以下代码段会将 /home
中可能包含的内容移到新的 /home
文件夹位置:
mount /home mount ${partition} /mnt rsync -aAXP /home/ /mnt/ umount /home /mnt
下面的代码段会去除 /etc/fstab
中的旧项并创建新项:
awk -i inplace '$2 != "/home"' /etc/fstab echo "$(blkid -o export ${partition} | grep ^UUID=) /home btrfs defaults 0 0" >>/etc/fstab
2.2.2.1.4 创建新用户 #
由于某些服务(例如 Cockpit)要求使用非 root 用户身份登录,因此请在此处至少定义一个非特权用户。或者,您可以按第 5.3 节 “添加用户”中所述在正在运行的系统中创建此类用户。
要添加新用户帐户,请先创建一个代表用户口令的哈希字符串。使用 openssl passwd -6
命令。
获取口令哈希后,在 script
中添加以下几行内容:
mount /home useradd -m EXAMPLE_USER echo 'EXAMPLE_USER:PASSWORD_HASH' | chpasswd -e
2.2.2.1.5 设置 root
的口令 #
在设置 root
口令前,请先生成口令的哈希,例如,使用 openssl passwd
-6
来生成。要设置口令,请在 script
中添加以下几行内容:
echo 'root:PASSWORD_HASH' | chpasswd -e
2.2.2.1.6 添加 SSH 密钥 #
以下代码段会创建用于存储 root
的 SSH 密钥的目录,然后将位于配置设备上的公共 SSH 密钥复制到 authorized_keys
文件中。
mkdir -pm700 /root/.ssh/ cat id_rsa_new.pub >> /root/.ssh/authorized_keys
如果您需要通过 SSH 进行远程登录,则必须启用 SSH 服务。有关细节,请参见第 2.2.2.1.7 节 “启用服务”。
2.2.2.1.7 启用服务 #
要启用系统服务(例如 SSH 服务),请将下面一行添加到 script
中:
systemctl enable sshd.service
2.2.2.1.8 安装软件包 #
由于您可能需要额外订阅特定的软件包,因此可能需事先注册系统。此外,安装额外的软件包可能还需要有网络连接。
在首次引导配置期间,可以在系统上安装额外的软件包。例如,可以通过添加以下命令安装 vim
编辑器:
zypper --non-interactive install vim-small
请注意,在配置完毕并引导到配置的系统前,您将无法使用 zypper
。如果想要在稍后进行更改,则必须使用 transactional-update
命令创建已更改快照。
3 准备虚拟机 #
本节介绍如何准备新虚拟机,以及在该虚拟机上部署 SLE Micro 时需执行哪些步骤。
在要用来运行虚拟化 SLE Micro 的 VM 主机服务器上下载 SLE Micro 磁盘映像。
启动虚拟机管理器,然后选择
› 。选择
。单击 确认。指定之前下载的 SLE Micro 磁盘映像的路径以及要部署的 Linux 操作系统类型(例如
Generic Linux 2020
)。单击 确认。指定要分配给 SLE Micro 虚拟机的内存容量和处理器数量,然后单击 确认。
指定虚拟机名称和要使用的网络。
如果要部署加密 SLE Micro 映像,另外还需执行以下步骤:
4 使用 JeOS Firstboot 进行配置 #
首次引导 SLE Micro 时,如果未提供任何配置设备,JeOS Firstboot 可用于对系统执行最低限度的配置。如果需要更好地控制部署过程,请使用具有 Ignition 或 Combustion 配置的配置设备。有关详细信息,请参见第 2.1 节 “使用 Ignition 配置 SLE Micro 部署”和第 2.2 节 “使用 Combustion 配置 SLE Micro 部署”。
要使用 JeOS Firstboot 配置系统,请按以下步骤操作:
Enter 确认。
会显示欢迎屏幕。单击在接下来的屏幕中,选择键盘,确认许可协议,并选择时区。
在
对话框窗口中,输入root
的密码并确认。图 3︰ 输入 root 密码 #对于加密部署,JeOS Firstboot 会执行以下操作:
提示输入新的通行口令,用来取代默认的通行口令。
生成新的 LUKS 密钥,并重新加密分区。
为 LUKS 报头添加次要密钥槽,并将其封装到 TPM 设备中。
如果您要部署的是加密映像,请执行以下步骤:
选择所需的保护方法,并单击
确认。输入 LUKS 加密的恢复口令,然后再输入一遍。根文件系统开始重新加密。
图 4︰ 选择加密方法 #成功部署后,按第 5.4 节 “从 CLI 注册 SLE Micro”中所述注册系统并创建非特权用户。
5 部署后步骤 #
5.1 扩展加密的磁盘映像 #
SLE Micro 的加密原始磁盘映像不会自动扩展到磁盘的全部容量。此过程概述了将它们扩展到所需大小的步骤。
使用
qemu-img
命令将磁盘映像增至所需大小。使用
parted
命令将 LUKS 设备所在的分区(例如分区 3)调整为所需大小。运行
cryptsetup resize luks
命令:当系统要求输入通行口令时,请输入相应口令以调整加密设备的大小。运行
transactional-update shell
命令在当前磁盘快照中打开读写外壳,然后将 Btrfs 文件系统调整为所需大小。例如:#
btrfs fi resize max /运行
exit
退出外壳,然后运行reboot
重引导系统。
5.2 重新加密已加密系统 #
系统目前未受保护,因此,在完成磁盘重新加密之前,不要在其中存储任何敏感数据。
JeOS Firstboot 会在部署阶段提示输入新通行口令。您输入通行口令后,系统会自动重新加密,因此您无需执行其他操作。
SLE Micro 加密映像附带默认的 LUKS 通行口令。要保护系统的安全,请务必在部署系统后更改该通行口令。为此,请执行以下操作。请在同一外壳会话中执行这些步骤。
将所需的函数导入外壳中:
#
source /usr/share/fde/luks识别底层 LUKS 设备并定义其他所使用的变量:
#
luks_name=$(expr "`df --output=source / | grep /dev/`" : ".*/\(.*\)")和
#
luks_dev=$(luks_get_underlying_device "$luks_name")创建一个用来存储默认通行口令 1234 的密钥文件,以及一个包含新通行口令的密钥文件。
更改恢复口令:
#
cryptsetup luksChangeKey --key-filePATH_TO_DEFAULT --pbkdf pbkdf2 "${luks_dev}" PATH_TO_NEWPATH_TO_DEFAULT 是包含默认通行口令的密钥文件的路径。PATH_TO_NEW 是包含新通行口令的密钥文件的路径。
重新加密 LUKS 设备:
#
cryptsetup reencrypt --key-filePATH_TO_NEW ${luks_dev}创建一个新的随机密钥并将其封装到 TPM 中:
>
sudo
fdectl regenerate-key --passfile PATH_TO_NEW去除您在步骤 3 中创建的两个密钥文件。
运行以下命令更新
grub.cfg
文件:>
sudo
transactional-update grub.cfg重新启动系统。
5.3 添加用户 #
由于 SLE Micro 要求使用非特权用户身份通过 SSH 登录系统或访问 Cockpit,因此您需要创建这样的帐户。
如果已在 Ignition 或 Combustion 中定义了非特权用户,则可以不执行此步骤。如果您是使用 JeOS Firstboot 部署系统的,那么只需设置 root
口令,并且需要手动创建非特权帐户,如下所述:
如下所示运行
useradd
命令:#
useradd -m USER_NAME
为该帐户设置口令:
#
passwdUSER_NAME根据需要将用户添加到
wheel
组:#
usermod -aG wheelUSER_NAME
5.4 从 CLI 注册 SLE Micro #
部署成功后,需要注册系统以获得技术支持并接收更新。可以使用 transactional-update
register
命令从命令行注册系统。
要在 SUSE Customer Center 中注册 SLE Micro,请执行以下操作:
按如下方式运行
transactional-update register
:#
transactional-update register -rREGISTRATION_CODE -e EMAIL_ADDRESS要在本地注册服务器中注册,另请提供该服务器的 URL:
#
transactional-update register -rREGISTRATION_CODE -e EMAIL_ADDRESS \ --url "https://suse_register.example.com/"将 REGISTRATION_CODE 替换为随您的 SLE Micro 一起收到的注册码。将 EMAIL_ADDRESS 替换为与您或贵组织管理订阅时所用 SUSE 帐户关联的电子邮件地址。
重引导您的系统以切换到最新的快照。
SLE Micro 现已注册完毕。
如果所需的信息超出了本节的范畴,请使用 SUSEConnect --help
查看内嵌文档。
6 法律声明 #
版权所有 © 2006–2024 SUSE LLC 和贡献者。保留所有权利。
根据 GNU 自由文档许可证 (GNU Free Documentation License) 版本 1.2 或(根据您的选择)版本 1.3 中的条款,在此授予您复制、分发和/或修改本文档的权限;本版权声明和许可证附带不可变部分。许可版本 1.2 的副本包含在题为“GNU Free Documentation License”的部分。
有关 SUSE 商标,请参见 https://www.suse.com/company/legal/。所有其他第三方商标分别为相应所有者的财产。商标符号(®、™ 等)代表 SUSE 及其关联公司的商标。星号 (*) 代表第三方商标。
本指南力求涵盖所有细节,但这不能确保本指南准确无误。SUSE LLC 及其关联公司、作者和译者对于可能出现的错误或由此造成的后果皆不承担责任。