目录
文章目录
镜像支持功能
- 支持密码注入功能(注:通过 nova boot --admin-pass 指令设置初始密码)。
- 支持动态修改密码(注:通过 nova set-password 指令重设密码)。
- 支持根分区大小(根据 Flavor 系统盘参数)自动调整。
- 支持配置初始化(SSH key、hostname 等)。
手动制作
启动虚拟机环境
-
下载 ISO 镜像文件:http://mirrors.aliyun.com/centos/8.2.2004/isos/x86_64/CentOS-8.2.2004-x86_64-minimal.iso
-
生成 QCOW2 文件
qemu-img create -f qcow2 centos8.2.qcow2 10G
- 创建并启动虚拟机:
sudo virt-install --virt-type kvm --name centos8.2 \
--ram 1024 \
--disk centos8.2.qcow2,format=qcow2 \
--network network=default \
--graphics vnc,listen=0.0.0.0 --noautoconsole \
--os-type=linux --os-variant=rhel8 \
--cdrom=CentOS-8.2.2004-x86_64-minimal.iso
- 安装操作系统:使用 VNC 或者使用 virt-manager、virt-viewer 连接图形化安装界面。注:只分配 / 根分区。
配置虚拟机环境
需要首先对虚拟机进行一系列的配置,然后才能作为 OpenStack 云主机的镜像使用。
- 配置支持 SSH 远程登录。
systemctl enable sshd
- 安装 ACPID
yum install -y acpid
systemctl enable acpid
ACPID 是一个服务进程,用于处理电源相关的事件,将内核的电源事件转发给用户态的应用程序,告诉应用程序安全退出。Libvirt 可以向虚拟机发送 acpid 事件来进行电源操作,例如:软关机、硬关机、软重启等。
- 配置 Serial Console 日志输出
$ vim /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto console=tty0 console=ttyS0,115200n8"
$ grub2-mkconfig -o /boot/grub2/grub.cfg
通过这个配置,内核日志会以 115200 的波特率同时发送到 tty0 和 ttyS0(串行端口)设备。Libvirt 可以通过一个普通文件模拟这个串行端口来获得日志输出:
<serial type='file'>
<source path='/var/lib/nova/instances/99579ce1-f4c4-4031-a56c-68e85a3d037a/console.log'/>
<target port='0'/>
</serial>
注:执行 nova console-log 命令可以获取该文件内容。
- 安装 QEMU Guest Agent 守护进程,通过 QGA 建立一个 Channel,宿主机可以和虚拟机进行通信并执行管理操作,例如:设置密码。
这个 Channel 在宿主机上表现为一个 UNIX Socket,如:/var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-00003c2c.sock;而在虚拟机中表现为一个串口设备,如:/dev/virtio-ports/org.qemu.guest_agent.0。
<channel type='unix'>
<source mode='bind' path='/var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-00003c2c.sock'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
通过 Channel,宿主机将 QGA 操作指令写入到 Socket 文件中,虚拟机的 QGA 进程则不断轮询获取指令并执行。
- 安装:
yum install -y qemu-guest-agent
- 修改 /etc/sysconfig/qemu-ga 配置:
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
- 启动
systemctl start qemu-guest-agent.service
systemctl enable qemu-guest-agent.service
- 禁止 zeroconf 服务,启动的话会导致 169.254.0.0/16 路有冲突,影响 Metadata API。
echo "NOZEROCONF=yes" >> /etc/sysconfig/network
- 安装 Cloud Init,用于与 Metadata API 或 Config Drive 配合完成云主机的初始化设置。
yum install -y cloud-init
systemctl start cloud-init.service
systemctl enable cloud-init.service
默认的,cloud-init 会关闭 SSH 密码认证,采用 SSh key 的方式进行登录。如有需要,则修改配置文件使其打开密码认证登录方式:
$ vi /etc/cloud/cloud.cfg
users:
- default
disable_root: 1
ssh_pwauth: 1 // 默认为 0, 改为 1。
- 安装 growpart,用于自动调整系统盘的根分区大小。
yum update -y
yum install -y epel-release
yum install -y cloud-utils-growpart.x86.64
rpm -qa kernel | sed 's/^kernel-//' | xargs -I {} dracut -f /boot/initramfs-{}.img {}
-
安装期望的的基础软件。
-
清理无用数据,关闭虚拟机电源。
-
移除本地信息(网卡 MAC 地址配置的、resolve.conf 配置等)。做模块或镜像时,最重要的是移除本地信息。
virt-sysprep -d centos8.2
- 删除虚拟机,并保存 QCOW2 镜像文件。
virsh undefine centos8.2
创建 Glance 镜像
glance image-create \
--file centos8.2.qcow2 \
--disk-format qcow2 \
--container-format bare \
--name CentOS-8.2 \
--property hw_qemu_guest_agent=yes \
--progress
使用 OpenStack 环境制作
制作的方式和上述的流程大同小异,区别在于利用了 OpenStack 的基础环境,例如:Nova、Cinder、Glance,所以就不需要我们再找一个 QEMU-KVM 环境了。
- 上传 ISO 镜像:
openstack image create \
--file ~/CentOS-7-x86_64-Minimal-1804.iso \
--public --container-format=bare \
--disk-format=raw \
centos-7.iso
- 创建空卷:
openstack volume create --bootable --size 10 centos7-bootable-vol
- 创建云主机,使用空卷作为系统盘,ISO image 作为启动盘:
nova boot \
--flavor m1.medium \
--nic net-name=test-net \
--security-groups test-security-group \
--block-device id=<centos7-bootable-vol id>, source=volume,dest=volume,size=5,type=disk,bootindex=0 \
--block-device id=<ISO image id>,source=image,dest=volume,bus=ide,type=cdrom,size=1,bootindex=1 \
test-vm
-
启动云主机后可以看见熟悉的操作系统安装界面。注:只需要分配 / 根分区。
-
安装一系列软件,同上。
-
将安装好操作系统的 “空卷” 作为一个镜像上传到 Glance:
cinder upload-to-image <centos7-bootable-vol id> \
--disk-format qcow2 \
--force \
centos7-image
- 从 Glance 中导出镜像文件到本地:
openstack image save centos7-image --file centos7-image.qcow2
使用 DIB 半自动化工具制作
DIB(Disk image builder)是 OpenStack 的子项目,专门用于构建 OpenStack 镜像。
DIB 把制作镜像的常见步骤封装成为脚本,比如:创建用户、配置 YUM 源、安装 cloud-init、部署 tgtadm 等。这些脚本称为 elements,位于 diskimage-builder/diskimage_builder/elements 路径下,可以根据自己的需求定制 elements。elements 之间会有依赖,通过 element-deps 文件说明,比如 elements centos7 的 element-deps 为:
- cache-url
- redhat-common
- rpm-distro
- source-repositories
- yum
DIB 会首先下载一个 base 镜像,然后通过用户指定的 elements,一个个的 chroot 进去执行 element 包含的脚本,从而完成镜像的制作,整个过程不需要启动虚拟机,这里应用了 chroot 操作系统虚拟化技术。
制作 ubuntu 14.04 镜像:
export DIB_RELEASE=trusty
disk-image-create -o ubuntu-trusty.qcow2 vm ubuntu
创建 Trove percona 镜像:
disk-image-create \
-a amd64 \
-x vm ubuntu cloud-init-datasources ubuntu-trusty-guest ubuntu-trusty-percona \
-o ubuntu-trusty-percona-5.6.33-guest-image
elements:
- ubuntu-trustry-guest:安装 trove-guest-agent
- ubuntu-trusty-percona:安装 percona 组件
制作镜像时,也可以通过环境变量进行配置,比如创建 Ironic 镜像:
# 密码为 secret
export DIB_DEV_USER_PASSWORD=secret
# 支持免密 sudo
export DIB_DEV_USER_PWDLESS_SUDO=YES
# cloud-init 的数据源为 ConfigDriver 和 OpenStack
export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive, OpenStack"
disk-image-create \
-o centos7 \
-x centos7 baremetal dhcp-all-interfaces grub2 cloud-init-datasources devuser
将 OpenStack 云主机制作成镜像
在工作中,也可能会出现这种情况,只需要简单的两步即可实现:
- 为虚拟机执着快照
- 架构快照下载成为镜像文件
来源:oschina
链接:https://my.oschina.net/u/4354729/blog/4317742