跳至内容

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 会在启动时自动检测并读取该文件。

创建配置文件

  1. 为您的配置文件创建一个目录。

    mkdir cloud-init-data
    
  2. 创建 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
    
  3. 创建 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
    
  4. 生成 ISO:使用 genisoimage 将文件打包到 config.iso 中。卷标 -V cidatacloud-init 查找的魔术密钥。

    genisoimage -o config.iso -V cidata -r -J cloud-init-data
    

引导和验证

  1. 使用 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
    
  2. 查找 IP 并通过 SSH 连接。默认用户是 rocky

    virsh domifaddr rocky10-iso-boot
    ssh rocky@<IP_ADDRESS>
    

    使用 SSH 密钥进行安全登录

    使用默认用户进行连接对于快速实验室测试很方便,但这不是一种安全的做法。在下一章中,我们将探讨如何使用 cloud-init 自动注入您的 SSH 公钥,从而实现安全、无密码的登录。

  3. 验证更改:检查主机名和 runcmd 创建的文件。

    hostname
    sudo cat /root/boot_done.txt
    

3. 方法二:使用 virt-install 直接注入

创建 ISO 是一种可靠的方法,但对于 libvirtvirt-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

引导和验证

  1. 使用 --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
    
  2. 查找 IP 并连接。如果您添加了 SSH 密钥,您应该能够无需密码连接。

  3. 验证主机名。它应该是 cloud-rockstar-02

这种直接方法通常在与 libvirt 进行本地开发和测试时更快、更方便。

作者:Wale Soyinka