OpenStack 云主机镜像制作

目录

镜像支持功能

  • 支持密码注入功能(注:通过 nova boot --admin-pass 指令设置初始密码)。
  • 支持动态修改密码(注:通过 nova set-password 指令重设密码)。
  • 支持根分区大小(根据 Flavor 系统盘参数)自动调整。
  • 支持配置初始化(SSH key、hostname 等)。

手动制作

启动虚拟机环境

  1. 下载 ISO 镜像文件:http://mirrors.aliyun.com/centos/8.2.2004/isos/x86_64/CentOS-8.2.2004-x86_64-minimal.iso

  2. 生成 QCOW2 文件

qemu-img create -f qcow2 centos8.2.qcow2 10G
  1. 创建并启动虚拟机:
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
  1. 安装操作系统:使用 VNC 或者使用 virt-manager、virt-viewer 连接图形化安装界面。注:只分配 / 根分区。

配置虚拟机环境

需要首先对虚拟机进行一系列的配置,然后才能作为 OpenStack 云主机的镜像使用。

  1. 配置支持 SSH 远程登录。
systemctl enable sshd
  1. 安装 ACPID
yum install -y acpid
systemctl enable acpid

ACPID 是一个服务进程,用于处理电源相关的事件,将内核的电源事件转发给用户态的应用程序,告诉应用程序安全退出。Libvirt 可以向虚拟机发送 acpid 事件来进行电源操作,例如:软关机、硬关机、软重启等。

  1. 配置 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 命令可以获取该文件内容。

  1. 安装 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
  1. 禁止 zeroconf 服务,启动的话会导致 169.254.0.0/16 路有冲突,影响 Metadata API。
echo "NOZEROCONF=yes" >> /etc/sysconfig/network
  1. 安装 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。
  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 {} 
  1. 安装期望的的基础软件。

  2. 清理无用数据,关闭虚拟机电源。

  3. 移除本地信息(网卡 MAC 地址配置的、resolve.conf 配置等)。做模块或镜像时,最重要的是移除本地信息。

virt-sysprep -d centos8.2
  1. 删除虚拟机,并保存 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 环境了。

  1. 上传 ISO 镜像:
openstack image create \
    --file ~/CentOS-7-x86_64-Minimal-1804.iso \
    --public --container-format=bare \
    --disk-format=raw \
    centos-7.iso
  1. 创建空卷:
openstack volume create --bootable --size 10 centos7-bootable-vol
  1. 创建云主机,使用空卷作为系统盘,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
  1. 启动云主机后可以看见熟悉的操作系统安装界面。注:只需要分配 / 根分区。

  2. 安装一系列软件,同上。

  3. 将安装好操作系统的 “空卷” 作为一个镜像上传到 Glance:

cinder upload-to-image <centos7-bootable-vol id> \ 
    --disk-format qcow2 \
    --force \
    centos7-image 
  1. 从 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 云主机制作成镜像

在工作中,也可能会出现这种情况,只需要简单的两步即可实现:

  1. 为虚拟机执着快照
  2. 架构快照下载成为镜像文件

猜你喜欢

转载自blog.csdn.net/Jmilk/article/details/106857569