示例:CentOS Stream 镜像¶
本示例演示如何安装 CentOS Stream 镜像,主要关注 CentOS Stream 9。由于 CentOS 安装过程可能因版本而异,因此如果您使用不同版本的 CentOS,安装步骤可能会有所不同。
注意
这只是一个示例,请根据您的环境调整路径和命令
下载 CentOS 安装 ISO¶
导航到 CentOS 镜像 页面。
选择一个镜像并导航到
9-stream/BaseOS/x86_64/iso。下载一个 ISO,选择boot以在安装期间下载软件包,否则选择dvd
开始安装过程¶
使用 virt-manager 或 virt-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 命令正常工作,必须将实例配置为将输出发送到串行控制台。
编辑
/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"
然后重新生成 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 删除它。