Dec 232021
 

以前搞OpenStack的时候,对虚拟机镜像都没怎么折腾过。这次折腾镜像,倒是学了不少东西,这里总结一下。

工具

虚拟机镜像定制工具很多,原理有很大的差异,理论上用一个工具,就可以搞定。不过我这次制作镜像,使用到2个工具

  • Disk image builder (DIB)它是OpenStack的开发过程中产生的一个工具,可以把OpenStack项目的agent集成到镜像里,对镜像镜像深度的定制。
  • virt-customize,这个其实不是一个工具,是一套工具,红帽出品。基本上你对虚拟机镜像操作,都可以通过它来完成。

如果全部功能都使用DIB完成,那么这些定制,都需要自己写自己的element,这个对我以前的团队,是小case,维护一套自己需要定制的内容,写好相关的element,一条命令,就完成镜像的制作。

如果希望使用virt完成全部的镜像定制,有些比较繁琐的步骤,利用镜像格式转换,压缩,其实都比较折腾。

所以我的方案就是使用virt,对虚拟机进行相应的定制,最后一步,通过DIB,完成镜像的压缩和初始化。

我们都是采用操作系统官方提供的虚拟机镜像,进行定制开发

  • CentOS 7.6
  • CentOS 7.9
  • CentOS 8.4
  • Ubuntu 20.04

定制内容

官方提供的镜像有哪些内容需要定制呢,我这里整理一下,具体这些定制如何修改,我已经把相应的文档放到github上。

CentOS

针对CentOS的定制,主要是下面的内容

  • 虚拟机的repo,指向国内,华为,清华的repo。我是使用公司内部nexus的proxy repo
  • 内核升级到5.4,CentOS 7,官方有repo,可以直接升级,CentOS 8,需要使用外部的repo。5.4的内核,可以让CentOS 7工作更久,升级到5.4内核,virt的工具效率都提升很多,也减少很多麻烦。
  • qemu-guest-agent,现在虚拟机的修改密码都需要靠它。
  • 常用软件和k8s相关依赖,这样大幅提升效率
  • 设置时区
  • ssh定制,尤其dns,在内网不能联网的情况,ssh很慢,CentOS 8默认已经关闭dns。
  • 登陆CentOS ,运行命令,会出现很多中文,看起来很别扭,虚拟机的语言是英文,所以需要修改语言的环境变量
  • CentOS 8 ssh登陆,会有cockpit提示,很烦人,去掉。
  • 利用cloud init,来解决虚拟机第一次启动,运行脚本。以前是通过virt first boot来实现,不过在CentOS 8 下出现问题,改成cloud init的per-once,完美解决了这个问题。主要解决zstack环境的agent安装和端口修改,和普罗米修斯端口冲突。
  • 设置alias,提升效率,vi alias vim,c alias clear。大幅提升幸福感。
  • cloud init一些定制,运行root密码登陆,运行远程ssh访问。这个是通过DIB来实现
  • 关闭selinux,对镜像镜像压缩,调整镜像大小。这个也是通过DIB实现。
  • 针对OpenStack的cloud-init,ConfigDrive,提升虚拟机的启动速度,这块以前同事专门有文章介绍过。

Ubuntu

针对Ubuntu 定制的内容就少很多,通过下载镜像,定制完成,再DIB,这种方式行不通,ubuntu官方做了限制,不过由于ubuntu需要修改的内容不多,virt就能满足需求。

  • Repo定制,ubuntu的官方镜像,cloud init有设置,不让你修改repo,需要修改一下cloud init的配置文件,你替换repo文件才能生效。
  • qemu-guest-agent
  • 直接使用root ssh登陆,不需要sudo
  • 去掉登陆的banner
  • 利用cloud init,安装一次性运行脚本,如果需要,zstack的agent,通过这种方式,比较简单。
  • resize 镜像,对于zstack的平台,调整到80G,OpenStack是不需要修改。

效果

制作一个镜像,大概是10分钟,其实后续,真的可以锻炼一下自己的shell的能力,改成shell脚本。这样效率更高。

  • CentOS 定制 https://github.com/shake/shell/blob/main/custom-centos-image
  • ubuntu 定制 https://github.com/shake/shell/blob/main/ubuntu-image-custom

如果你希望镜像给root设置一个默认密码,我坚持不加默认密码

记得设置环境变量或者export一次。

virt-customize -a $image_name --root-password password:chenshake 
##替换repo


virt-customize -a $image_name --run-command ‘rm /etc/yum.repos.d/CentOS-7-all.repo'
virt-customize -a $image_name --run-command ‘wget -O /etc/yum.repos.d/all-huawei.repo https://raw.fastgit.org/shake/shell/main/CentOS7/all-huawei.repo'

 Leave a Reply

(required)

(required)

This site uses Akismet to reduce spam. Learn how your comment data is processed.