说明:
本文以制作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等。
kvm环境部署请参考这里
手动制作OpenStack镜像
下载镜像
本文镜像下载点击这里 (此链接是为防止官网下载链接失效)
官网镜像下载点击这里
创建虚拟机
首先创建一个qcow2格式镜像文件,用于虚拟机的根磁盘,大小10G就够了。
代码语言:javascript复制#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:
代码语言:javascript复制yum install -y qemu-guest-agent
修改/etc/sysconfig/qemu-ga配置文件:
代码语言:javascript复制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服务中拉取配置信息,完成虚拟机的初始化工作,比如设置主机名、初始化密码以及注入密钥等。
代码语言:javascript复制yum install -y cloud-init
修改/etc/cloud/cloud.cfg允许root密码登录(默认是禁止)
代码语言:javascript复制users:
- defaults
disable_root:1
ssh_pwauth: 0 #0 是关闭状态 就是禁止password认证,修改为 ssh_pwauth: 1
growpart
虚拟机制作镜像时指定了根分区大小(比如我们设置为10GB),为了使虚拟机能够自动调整为flavor disk指定的根磁盘大小,即自动扩容, 我们需要安装glowpart(老版本叫growroot)并完成以下配置:
代码语言:javascript复制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命令
代码语言:javascript复制yum install libguestfs-tools -y
在宿主机上运行以下命名,移除宿主机信息,比如mac地址等。
代码语言:javascript复制virt-sysprep -d Centos7.9-1
压缩镜像
virt-sparsify compress压缩镜像
代码语言:javascript复制virt-sparsify --compress Centos7.9-1.qcow2 Centos7.9-1-mini.qcow2
代码语言:javascript复制#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
打包镜像
代码语言:javascript复制qemu-img convert -c -O qcow2 Centos7.9-1-mini.qcow2 Centos7.9-2022.04.13.qcow2
代码语言:javascript复制#ll -trh
-rw-r--r-- 1 root root 689M 4月 13 22:24 Centos7.9-2022.04.13.qcow2
上传镜像
把打包好的镜像文件传到OpenStack控制节点上然后使用glance image-create命令上传,最后就可以开实例验证;
代码语言:javascript复制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