2. 初次接触
使用 Rocky Linux 10 QCOW2 镜像进行简单的引导¶
在上一章中,我们介绍了 cloud-init
的基本概念。现在,是时候从理论走向实践了。本章是您的第一个实践任务:您将使用官方的 Rocky Linux 10 Generic Cloud 镜像,为其提供一组简单的指令,并观察它在首次启动时如何自我配置。
1. 准备实验室环境¶
在我们启动第一个实例之前,我们需要准备本地实验室环境。对于这些练习,我们将使用标准的 Linux 虚拟化工具来模拟云环境。
先决条件:主机工具¶
请确保您的主机上已安装以下工具。在 Rocky Linux 主机上,您可以使用 dnf
安装它们。
sudo dnf install -y libvirt qemu-kvm virt-install genisoimage
- 虚拟化管理程序: KVM/QEMU 或 VirtualBox 等工具。
virt-install
:一个用于配置新虚拟机的命令行实用程序。genisoimage
(或mkisofs
):一个用于创建 ISO9660 文件系统的工具。
QCOW2 镜像¶
如果您还没有下载,请下载官方的 Rocky Linux 10 Generic Cloud 镜像。
curl -L -o Rocky-10-GenericCloud.qcow2 \
https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-GenericCloud-Base.latest.x86_64.qcow2
为了保留原始文件,请为您的虚拟机创建一个工作副本。
cp Rocky-10-GenericCloud.qcow2 first-boot-vm.qcow2
使用 backing 文件节省磁盘空间
镜像的完整副本可能很大。为了节省磁盘空间,您可以创建一个链接克隆,它使用原始镜像作为 backing 文件。这将创建一个更小的 qcow2
文件,其中只存储与原始文件不同的部分。
qemu-img create -f qcow2 -F qcow2 \
-b Rocky-10-GenericCloud.qcow2 first-boot-vm.qcow2
2. 方法一:NoCloud 数据源 (ISO)¶
在本地环境中为 cloud-init
提供数据的最常见方法之一是使用 NoCloud
数据源。此方法要求将配置文件打包到一个虚拟 CD-ROM(ISO 文件)中,cloud-init
会在启动时自动检测并读取该文件。
创建配置文件¶
-
为您的配置文件创建一个目录。
mkdir cloud-init-data
-
创建
user-data
文件:此文件是您的主要指令集。我们将使用cat
heredoc 来创建它。cat <<EOF > cloud-init-data/user-data #cloud-config hostname: cloud-rockstar-01 runcmd: - [ sh, -c, "echo 'Hello from the cloud-init Final Stage!' > /root/boot_done.txt" ] EOF
-
创建
meta-data
文件:此文件提供关于实例的上下文。instance-id
特别重要,因为cloud-init
使用它来确定是否已在此实例上运行过。更改 ID 会导致cloud-init
再次运行。cat <<EOF > cloud-init-data/meta-data { "instance-id": "i-first-boot-01", "local-hostname": "cloud-rockstar-01" } EOF
-
生成 ISO:使用
genisoimage
将文件打包到config.iso
中。卷标-V cidata
是cloud-init
查找的魔术密钥。genisoimage -o config.iso -V cidata -r -J cloud-init-data
引导和验证¶
-
使用
virt-install
启动虚拟机,同时挂载 VM 镜像和config.iso
。virt-install --name rocky10-iso-boot \ --memory 2048 --vcpus 2 \ --disk path=first-boot-vm.qcow2,format=qcow2 \ --disk path=config.iso,device=cdrom \ --os-variant rockylinux10 \ --import --noautoconsole
-
查找 IP 并通过 SSH 连接。默认用户是
rocky
。virsh domifaddr rocky10-iso-boot ssh rocky@<IP_ADDRESS>
使用 SSH 密钥进行安全登录
使用默认用户进行连接对于快速实验室测试很方便,但这不是一种安全的做法。在下一章中,我们将探讨如何使用
cloud-init
自动注入您的 SSH 公钥,从而实现安全、无密码的登录。 -
验证更改:检查主机名和
runcmd
创建的文件。hostname sudo cat /root/boot_done.txt
3. 方法二:使用 virt-install
直接注入¶
创建 ISO 是一种可靠的方法,但对于 libvirt
和 virt-install
的用户来说,还有一种更简单的方法。--cloud-init
标志允许您直接传递 user-data
,让 virt-install
自动处理数据源的创建。
简化的 user-data
¶
创建一个简单的 user-data.yml
文件。您甚至可以提前添加 SSH 密钥。
cat <<EOF > user-data.yml
#cloud-config
users:
- name: rocky
ssh_authorized_keys:
- <YOUR_SSH_PUBLIC_KEY>
EOF
引导和验证¶
-
使用
--cloud-init
标志启动虚拟机。请注意,我们可以在此处直接设置主机名。virt-install --name rocky10-direct-boot \ --memory 2048 --vcpus 2 \ --disk path=first-boot-vm.qcow2,format=qcow2 \ --cloud-init user-data=user-data.yml,hostname=cloud-rockstar-02 \ --os-variant rockylinux10 \ --import --noautoconsole
-
查找 IP 并连接。如果您添加了 SSH 密钥,您应该能够无需密码连接。
-
验证主机名。它应该是
cloud-rockstar-02
。
这种直接方法通常在与 libvirt
进行本地开发和测试时更快、更方便。
作者:Wale Soyinka