制作OpenStack镜像

A virtual machine image is a single file which contains a virtual disk that has a bootable operating system installed on it.

image 就是一个可启动的,安装有OS的disk,存在于宿主机上就是一个RAW/QCOW2等格式的文件.

多数企业构建私有云时通常会维护自己的 Linux 镜像,本文主要介绍私有云场景下镜像制作的方法和注意事项。OpenStack Virtual Machine Image Guide 也给出详细的镜像制作流程。

OpenStack支持的镜像格式

https://docs.openstack.org/image-guide/introduction.html

  • QCOW2
  • RAW
  • AKI (Amazon Kernel Image)
  • AMI (Amazon Machine Image)
  • ARI (Amazon Ramdisk Image)
  • ISO
  • OVF
  • VDI
  • VHD
  • VHDX
  • VMDK

1.1 获取各家官方镜像

1.2 镜像元数据

说白了就是这个镜像的各种属性,比如这个镜像的OS的管理员账户是谁1),qemu-guest-agent要不要开启,网卡型号用virtio还是e1000,磁盘接口用virtblk还是virt-scsi等等…

设置之后再创建虚拟机就能看到效果,image高级属性

安装哪些软件?

  1. cloud-init: 支持虚拟机在初始化时安装软件、执行脚本和设置某些配置(与 metadata,userdata 有关),云平台部署 PaaS 组件时,cloud-init 不可或缺;
  2. qemu-guest-agent: 支持 ceilometer 采集虚拟机真实的内存使用量,在不需要ip的情况下宿主机与虚拟机之间进行通信;
  3. 其他常用软件包;

配置些啥?

  1. DNS: 这个可以通过配置subnet来实现,dhcp自动获取ip,DNS,网关等;
  2. NTP: 定时任务去同步企业的 NTP server;
  3. Repository: 设置为企业的 repository;

3.1 安装用于制作image的kvm虚拟机

创建一个CentOS-7的虚拟机,2 vCPU,2G vRAM,10G disk2):

virt-install --name image \
    --ram 2048 \
    --vcpus 2 \
    --arch=x86_64 \
    --os-type=linux \
    --os-variant=centos7.0 \
    --accelerate \
    --cdrom /tmp/CentOS-7-x86_64-Minimal-1804.iso \
    --boot menu=on \
    --disk path=/tmp/image.img,size=10,format=raw,bus=virtio,cache=writeback \
    --network bridge=br1,model=virtio \
    --graphics vnc,port=-1,listen=0.0.0.0 \
    --channel char_type='unix',target_type='virtio',name='org.qemu.guest_agent.0'
# 查看此虚拟机的vnc连接地址,然后用tigervnc等工具进行连接
virsh vncdisplay image
:6

3.2 安装虚拟机OS

选择安装centos7 磁盘分区 基本设置 可以创建一个保留的超管用户,用于远程协助租户处理问题 设置root密码

3.3 配置虚拟机OS

下面的注意事项需要单独提出来说一下:

3.3.1 repo

至少改为国内163,阿里云等repo mirror,不然太慢了.

3.3.2 ssh登录用户

  • 建议ssh禁用root登录;
  • 建议ssh还是保留password登录;
  • 建议更改默认22端口;
  • 建议保持keepalive连接,避免长时间ssh连接因为超时而断开;

3.3.3 acpid

acpid是一个用户空间的服务进程, 用来处理电源相关事件,比如将kernel中的电源事件转发给应用程序,告诉应用程序安全的退出,防止应用程序异常退出导致数据损坏。libvirt可以通过向guest虚拟机发送acpid事件触发电源操作,使虚拟机安全关机、重启等操作,相对于强制执行关闭电源操作更安全。通过acpid事件发送开关机信号即我们经常所说的软重启或者软关机。

tips:

  • 用户执行重启或者关机操作时,OpenStack会首先尝试调用libvirt的shutdown方法,即软关机;
  • 当软关机执行失败或者超时(默认120秒),则会调动libvirt的destroy方法,即强制关机,因此如果虚拟机关机或者重启很慢,很可能是acpid没有正常运行;
  • 为了使虚拟机进程安全退出,减少数据损坏风险,尽量使用软操作,硬操作可能导致程序崩溃或者数据丢失;
yum install -y acpid
systemctl enable acpid

3.3.4 console log

目的:

  1. boot的时候,OpenStack的log界面的内容就是通过这个配置输出的,不然vnc里的启动详情怎么会出现在dashboard上嘛,对吧..
  2. 当操作系统内核崩溃时会报出内核系统crash出错信息,通常启动的时候一闪而过, 而此时系统还没有起来,不能通过远程工具(比如ssh)进入系统查看,把这些日志重定向到Serial Console中,这样我们就可以通过Serial console来访问错误信息,以供分析和排错使用;

配置:

vim /etc/default/grub
# 设置GRUB_CMDLINE_LINUX,
GRUB_CMDLINE_LINUX="crashkernel=auto console=tty0 console=ttyS0,115200n8"
# 重新生成启动项
grub2-mkconfig -o /boot/grub2/grub.cfg

通过这个配置,内核信息会以115200的波特率同时发送到tty0和ttyS0串行端口设备,libvirt可以通过一个普通文件模拟这个串行端口,这样内核产生的日志发到ttyS0,实际上写到console.log文件中.

OpenStack通过nova console-log命令获取该文件内容.

<serial type='file'>
      <source path='/var/lib/nova/instances/99579ce1-f4c4-4031-a56c-68e85a3d037a/console.log'/>
      <target port='0'/>
</serial>

3.3.5 qemu-guest-agent

  • 所以最开始创建虚拟机会指定–channel参数;

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

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

yum install qemu-guest-agent -y
systemctl enable qemu-guest-agent

查看qemu-guest-agent支持的指令:

#guest-set-user-password指令修改管理员密码
virsh qemu-agent-command image '{"execute":"guest-info"}' | python -m json.tool | grep 'name' | cut -d ':' -f 2 | tr -d '",'

3.3.6 禁用zeroconf

zeroconf是一种古老的自动网络配置技术,在没有DHCP服务的年代,所有服务器都需要网管手动配置IP、hostname等,非常麻烦,zeroconf正好解决了这个问题,不过目前通常都通过DHCP获取地址了。不过一些操作系统仍然会开启这个服务,当DHCP获取IP失败时,会尝试通过zeroconf配置。

zeroconf启动时会自动创建一条路由169.254.0.0/16,而虚拟机访问metadata服务的地址正好是169.254.169.254,如果启动了zeroconf服务,由于路由冲突,虚拟机不能通过169.254.169.254路由到网络节点的metadata服务了。OpenStack虚拟机通常都是通过DHCP获取IP的,因此我们并不需要zeroconf服务。为了虚拟机能够访问metadata服务,我们必须禁止zeroconf服务,关于该问题的更详细讨论可参考bug#983611

echo "NOZEROCONF=yes" >> /etc/sysconfig/network

3.3.7 cloud-init

cloud-init是虚拟机第一次启动时执行的脚本,主要负责从metadata服务中拉取配置信息,完成虚拟机的初始化工作,比如设置主机名、初始化密码以及注入密钥等,是OpenStack实现自动化配置的瑞士军刀,更多信息请见官文.

安装:

yum install cloud-init -y

配置:

# 禁用root远程登录ssh
disable_root: 1
# 允许ssh密码登陆
ssh_pwauth:   1
# 禁止系统重启后cloud-init将虚拟机改名
cloud_init_modules:
#- update_hostname
# 配置系统默认用户,(centos官网的cloud image是centos,ubuntu系统是ubuntu),key-pair会写入此用户的/home/admin/.ssh/authorized_keys以实现ssh key登录
system_info:
  default_user:
    name: admin
    lock_passwd: false
 
# 更新 /etc/sudoers Defaults requiretty 为
Defaults !requiretty

3.3.8 growpart

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

yum update -y
# 需要epel-release
yum install cloud-utils-growpart -y
# 貌似不用这个命令 rpm -qa kernel | sed 's/^kernel-//'  | xargs -I {} dracut -f /boot/initramfs-{}.img {}

3.4 移除本地信息

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

shutdown -h now
virt-sysprep -d image

比如下次要修改这个image,因为安装了cloud-init,启动时会去向http://169.254.169.254请求metadata,就会很慢。

将镜像上传至glance node,建议再配置下镜像的元数据: 3)

openstack image create "centos7-mrco" \
  --file centos7-mrco.raw \
  --disk-format raw \
  --container-format bare \
  --public
# 列出镜像
openstack image list
# 设置镜像属性
glance image-update \
    --property os_type=linux \
    --property os_admin_user=admin \
    --property hw_scsi_model=virtio-scsi \
    --property hw_disk_bus=scsi \
    --property hw_vif_model=virtio \
    --property hw_qemu_guest_agent=yes \
    --property os_require_quiesce=yes \
    2fb4e39c-1759-41ae-b647-42a72cacb279


1)
nova改密码你总得指定修改对象吧
2)
10G磁盘大小完全足够,甚至5G都够了,实际使用者用到的磁盘大小由flavor而定
3)
比如你不指定hw_qemu_guest_agent=yes,,那么OpenStack创建出来的虚拟机xml配置里就没有serial console的设备信息,那么更改密码,监控虚拟机内部使用情况就没有前提支撑了
  • virtualization/openstack/glance/制作镜像.txt
  • 最后更改: 2019/04/16 18:31
  • (外部编辑)