说明:

​ 本文以制作CentOS7.9镜像为例,详细介绍手动制作OpenStack镜像详细步骤,解释每一步这么做的原因。镜像上传到OpenStack glance,支持以下几个功能:

  • 支持密码注入功能(nova boot时通过–admin-pass参数指定设置初始密码)
  • 支持根分区自动调整(根分区自动调整为flavor disk大小,而不是原始镜像分区大小)
  • 支持动态修改密码(使用nova set-password命令可以修改管理员密码)

手动制作镜像非常麻烦和耗时,本文后面会介绍一个专门用于自动化构建镜像的项目DIB,通过DIB只需要在命令行上指定elements即可制作镜像,省去了重复下载镜像、启动虚拟机配置镜像的繁杂步骤。

镜像的宿主机操作系统为Ubuntu 18.04,开启了VT功能(使用kvm-ok命令验证)并安装了libvirt系列工具,包括virsh、virt-manager、libguestfs-tools等。

手动制作OpenStack镜像

下载镜像

本文镜像下载点击这里 (此链接是为防止官网下载链接失效)

官网镜像下载点击这里

创建虚拟机

首先创建一个qcow2格式镜像文件,用于虚拟机的根磁盘,大小10G就够了。

1
2
3
4
5
#cd /data/kvm/
#qemu-img create -f qcow2 centos.qcow2 10G # create disk image
#ll
-rw-r--r-- 1 root root 196768 4月 13 21:32 centos.qcow2
#virt-install --name Centos7.9-1 --ram 4096 --vcpus 4 --network network=default --disk path=/data/kvm/centos.qcow2,format=qcow2,size=30,device=disk,bus=virtio --cdrom /data/iso/CentOS-7.9-x86_64-DVD-2009.iso --vnc --os-type=linux --os-variant=rhel7.0 --vncport=5910 --vnclisten=0.0.0.0

启动完成后,使用vnc client连接或者使用virt-manager、virt-viewer连接。

接下来安装系统的步骤略过

进入虚拟机控制台可以看到CentOS的启动菜单,选择Install Centos 7,继续选择语言后将进入INSTALLION SUMMARY,其中大多数配置默认即可,SOFTWARE SELECTION选择Minimal Install,INSTALLATION DESTINATION需要选择手动配置分区,我们只需要一个根分区即可,不需要swap分区,文件系统选择ext4或者xfs,存储驱动选择Virtio Block Device,如图:

上图步骤中必须只有一个分区不然后面自动扩容磁盘有问题

配置OS

qemu-guest-agent

qemu-guest-agent是运行在虚拟机内部的一个服务,libvirt会在本地创建一个unix socket,模拟为虚拟机内部的一个串口设备,从而实现了宿主机与虚拟机通信,这种方式不依赖于TCP/IP网络,实现方式简单方便。

为了支持OpenStack平台动态修改虚拟机密码功能,我们需要手动安装qemu-guest-agent:

1
yum install -y qemu-guest-agent

修改/etc/sysconfig/qemu-ga配置文件:

1
2
3
4
5
6
TRANSPORT_METHOD="virtio-serial"
DEVPATH="/dev/virtio-ports/org.qemu.guest_agent.0"
LOGFILE="/var/log/qemu-ga/qemu-ga.log"
PIDFILE="/var/run/qemu-ga.pid"
BLACKLIST_RPC=""
FSFREEZE_HOOK_ENABLE=0
cloud-init

接下来安装cloud-init,cloud-init是虚拟机第一次启动时执行的脚本,主要负责从metadata服务中拉取配置信息,完成虚拟机的初始化工作,比如设置主机名、初始化密码以及注入密钥等。

1
yum install -y cloud-init

修改/etc/cloud/cloud.cfg允许root密码登录(默认是禁止)

1
2
3
4
5
6
7
users:

- defaults

disable_root:1

ssh_pwauth: 0 #0 是关闭状态 就是禁止password认证,修改为 ssh_pwauth: 1
growpart

虚拟机制作镜像时指定了根分区大小(比如我们设置为10GB),为了使虚拟机能够自动调整为flavor disk指定的根磁盘大小,即自动扩容, 我们需要安装glowpart(老版本叫growroot)并完成以下配置:

1
2
3
4
yum update -y
yum install -y epel-release
yum install -y cloud-utils-growpart
rpm -qa kernel | sed 's/^kernel-//' | xargs -I {} dracut -f /boot/initramfs-{}.img {}

完成以上工作后,我们的镜像配置基本结束,删除一些无用文件,清理history命令后执行关机:

移除本地信息

安装virt-sysprep命令

1
yum install libguestfs-tools -y

在宿主机上运行以下命名,移除宿主机信息,比如mac地址等。

1
virt-sysprep -d Centos7.9-1

压缩镜像

virt-sparsify compress压缩镜像

1
virt-sparsify --compress Centos7.9-1.qcow2 Centos7.9-1-mini.qcow2
1
2
3
#ll -trh
-rw------- 1 root root 31G 4月 13 22:12 Centos7.9-1.qcow2
-rw-r--r-- 1 root root 689M 4月 13 22:16 Centos7.9-1-mini.qcow2

可以看到压缩之后的镜像比原来的小了很多,只有689M

打包镜像

1
qemu-img convert -c -O qcow2 Centos7.9-1-mini.qcow2 Centos7.9-2022.04.13.qcow2
1
2
#ll -trh
-rw-r--r-- 1 root root 689M 4月 13 22:24 Centos7.9-2022.04.13.qcow2

上传镜像

把打包好的镜像文件传到OpenStack控制节点上然后使用glance image-create命令上传,最后就可以开实例验证;

1
glance image-create --name "test-Centos7.9-2022.04.13" --file /root/Centos7.9-2022.04.13.qcow2 --disk-format qcow2 --container-format bare --visibility public --progress