示例:CentOS Stream 镜像

本示例演示如何安装 CentOS Stream 镜像,主要关注 CentOS Stream 9。由于 CentOS 安装过程可能因版本而异,因此如果您使用不同版本的 CentOS,安装步骤可能会有所不同。

注意

这只是一个示例,请根据您的环境调整路径和命令

下载 CentOS 安装 ISO

  • 导航到 CentOS 镜像 页面。

  • 选择一个镜像并导航到 9-stream/BaseOS/x86_64/iso。下载一个 ISO,选择 boot 以在安装期间下载软件包,否则选择 dvd

开始安装过程

使用 virt-managervirt-install 命令(如 Tools: libvirt and virsh/virt-manager 页面中所述)开始安装过程。

virt-install

如果您使用 virt-install 命令,请不要忘记将您的 VNC 客户端连接到虚拟机。

命令应如下所示

$ sudo virt-install --virt-type kvm --name my-centos --ram 2048 \
  --network network=default \
  --graphics vnc,listen=0.0.0.0 --noautoconsole \
  --os-type=linux --os-variant=centos-stream9 \
  --location=~/Downloads/CentOS-Stream-9-20240819.0-x86_64-dvd1.iso

virt-manager

注意

请参见此处,了解有关 virt-manager 中创建新 VM 的 libvirt wiki。

从下载的 ISO 创建新 VM 时,virt-manager 应该自动检测操作系统。如果失败,请手动选择 CentOS Stream 作为操作系统。默认设置应该可以。

完成安装

注意

本指南重点介绍创建 OpenStack 镜像所需的步骤,有关安装过程的概述,请参见 CentOS 文档

安装 摘要 中,请按照以下说明操作。

DHCP 和主机名

网络 主机名 中,确保 以太网 已启用,并且在 配置.../IPv4 设置 中,方法 设置为 自动 (DHCP)。同一页面允许选择主机名 - 保持默认设置,因为稍后将安装 cloud-init 包。

选择安装选项

软件 选择 中,选择要安装的内容,默认值为 带有 GUI 的服务器,最小的选择是 最小安装

创建一个工作用户

密码 中配置根密码,因为稍后需要它来完成安装。默认情况下,它将被 cloud-init 阻止。也可以创建一个管理员用户,稍后将被 virt-sysprep 删除。

分离 CD-ROM 并重启

virt-install

要使用 virsh 命令弹出磁盘,libvirt 要求您将一个空磁盘附加到 CD-ROM 之前附加的相同目标,这可能是 hda。您可以使用 virsh dumpxml vm-image 命令确认适当的目标。

$ sudo virsh dumpxml my-centos
<domain type='kvm' id='19'>
  <name>centos</name>
...
    <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='1' target='0' unit='0'/>
    </disk>
...
</domain>

从主机运行以下命令,使用 virsh 弹出磁盘并重启,以 root 身份运行。

$ sudo virsh attach-disk --type cdrom --mode readonly my-centos "" hda
$ sudo virsh reboot my-centos

virt-manager

如果您使用 virt-manager,上述命令将有效,但您也可以使用 GUI 分离并重启。

完成安装

安装 ACPI 服务

为了使 hypervisor 能够重启或关闭实例,您必须在客户机系统上安装并运行 acpid 服务。

登录到 CentOS 客户机并运行以下命令以安装 ACPI 服务并配置它在系统启动时启动

# dnf install acpid
# systemctl enable acpid

配置获取元数据

注意

有关更多信息,请查看 cloud-init 文档

实例必须与元数据服务交互才能在启动时执行多项任务。例如,实例必须获取 ssh 公钥并运行用户数据脚本。为了确保实例执行这些任务,请安装 cloud-init 工具。

cloud-init 包会自动从元数据服务器获取公钥并将其放置在帐户中。通过运行以下命令在 CentOS 客户机内部安装 cloud-init

# dnf install cloud-init

帐户因发行版而异。在 CentOS Stream 虚拟机上,该帐户称为 cloud-user

您可以通过编辑 /etc/cloud/cloud.cfg 文件并添加一个包含不同用户的行来更改 cloud-init 使用的帐户名称。例如,要配置 cloud-init 将密钥放入名为 admin 的帐户中,请在配置文件中使用以下语法

users:
  - name: admin
    (...)

Cloud-init 替代方案

警告

此方法不推荐,因为它仅从元数据服务器获取 ssh 公钥。它不会获取用户数据,用户数据是用户在请求新实例时可以传递的可选数据。用户数据通常用于在实例启动时运行自定义脚本。

如果您无法在镜像中安装 cloud-init 包,要获取 ssh 公钥并将其添加到 root 帐户,请编辑 /etc/rc.d/rc.local 文件并在 touch /var/lock/subsys/local 行之前添加以下行

if [ ! -d /root/.ssh ]; then
  mkdir -p /root/.ssh
  chmod 700 /root/.ssh
fi

# Fetch public key using HTTP
ATTEMPTS=30
FAILED=0
while [ ! -f /root/.ssh/authorized_keys ]; do
  curl -f http://169.254.169.254/2025.2/meta-data/public-keys/0/openssh-key \
    > /tmp/metadata-key 2>/dev/null
  if [ \$? -eq 0 ]; then
    cat /tmp/metadata-key >> /root/.ssh/authorized_keys
    chmod 0600 /root/.ssh/authorized_keys
    restorecon /root/.ssh/authorized_keys
    rm -f /tmp/metadata-key
    echo "Successfully retrieved public key from instance metadata"
    echo "*****************"
    echo "AUTHORIZED KEYS"
    echo "*****************"
    cat /root/.ssh/authorized_keys
    echo "*****************"
  fi
done

注意

某些 VNC 客户端将冒号 (:) 替换为分号 (;),下划线 (_) 替换为连字符 (-)。请确保指定 http: 而不是 http;。请确保指定 authorized_keys 而不是 authorized-keys

注意

使用此方法,以前的 CentOS 版本需要禁用 zeroconf 路由,从 EL8 开始,不再需要这样做。

允许分区调整大小

为了正确调整根分区的大小,请安装 cloud-utils-growpart 包,该包包含允许使用 cloud-init 调整磁盘大小的适当工具。

# dnf install cloud-utils-growpart

配置控制台

警告

实际上,即使按照 https://access.redhat.com/solutions/3443551 操作,这也不起作用

为了使 openstack console log 命令正常工作,必须将实例配置为将输出发送到串行控制台。

  1. 编辑 /etc/default/grub 文件,并将 console=tty0 console=ttyS0,115200n8 附加到 GRUB_CMDLINE_LINUX

    例如

    ...
    GRUB_CMDLINE_LINUX="resume=/dev/mapper/cs-swap rd.lvm.lv=cs/root rd.lvm.lv=cs/swap console=tty0 console=ttyS0,115200n8"
    
  2. 然后重新生成 GRUB 配置

    # grub2-mkconfig -o /boot/grub2/grub.cfg --update-bls-cmdline
    

自定义

如果您手动构建镜像,您可能对自定义它感兴趣,现在是时候应用您的编辑了。

关闭实例

关闭 VM

# shutdown now

清理

需要清理镜像中的详细信息,例如 MAC 地址 - 使用的工具是 virt-sysprep,它是 libguestfs 的一部分

sudo virt-sysprep -d my-centos

调整镜像大小

调整镜像大小并压缩镜像以删除未使用的空间(镜像将在初始化后使用可用空间),使用 virt-sparsify,它是 libguestfs 的一部分

sudo virt-sparsify --compress /var/lib/libvirt/images/my-centos.qcow2 ~/upload.qcow2

镜像完成

调整大小后的镜像现在可以使用 openstack image create 上传。有关更多信息,请参见 python-openstackclient 命令列表

取消定义 libvirt 域

现在可以将镜像上传到镜像服务,您不再需要让 libvirt 管理此虚拟机镜像。

$ sudo virsh undefine my-centos

或者,如果您使用 virt-manager,可以通过 GUI 删除它。