ubuntu系统KVM环境下制作qcow2格式镜像
说明:
本文以制作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 | #cd /data/kvm/ |
启动完成后,使用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 | TRANSPORT_METHOD="virtio-serial" |
cloud-init
接下来安装cloud-init,cloud-init是虚拟机第一次启动时执行的脚本,主要负责从metadata服务中拉取配置信息,完成虚拟机的初始化工作,比如设置主机名、初始化密码以及注入密钥等。
1 | yum install -y cloud-init |
修改/etc/cloud/cloud.cfg允许root密码登录(默认是禁止)
1 | users: |
growpart
虚拟机制作镜像时指定了根分区大小(比如我们设置为10GB),为了使虚拟机能够自动调整为flavor disk指定的根磁盘大小,即自动扩容, 我们需要安装glowpart(老版本叫growroot)并完成以下配置:
1 | yum update -y |
完成以上工作后,我们的镜像配置基本结束,删除一些无用文件,清理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 | ll -trh |
可以看到压缩之后的镜像比原来的小了很多,只有689M
打包镜像
1 | qemu-img convert -c -O qcow2 Centos7.9-1-mini.qcow2 Centos7.9-2022.04.13.qcow2 |
1 | ll -trh |
上传镜像
把打包好的镜像文件传到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 |