openstack镜像制作以往都是用传统的KVM, virt-install加载本地iso文件启动系统,继而在系统里配置一些必备的软件和配置,手动繁琐,耗时长。 openstack官网推荐几款镜像制作工具,下面简要说明下: https://docs.openstack.org/image-guide/create-images-automatically.html

1、Diskimage-builder https://docs.openstack.org/diskimage-builder/latest/ diskimage-builder支持定制element,即镜像中包含的元素。(比如创建用户,安装软件包,进行某种配置) 用户可以根据需要进行定义,然后再使用disk-image-create时指定。具体参考diskimage-builder指导。

diskimage-builder的原理也比较简单,是在主机上创建虚拟机镜像,然后通过挂载/chroot方式,通过kickstart自动完成镜像内容的安装。 elements比较像程序中的接口/插件机制,将element中规定目录下的定制脚本执行,完成对镜像的定制。 整个过程并不需要启动虚拟机。

上边工具主要是Linux镜像的制作,并不支持windows镜像的自动制作。

DIB把一些操作封装成脚本,比如创建用户(devuser)、安装cloud-init(cloud-init)、配置yum源(yum)、部署tgtadm(deploy-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进去执行,从而完成了镜像的制作,整个过程不需要启动虚拟机。这有点类似Dockerfile的构建过程,Dockerfile的每个指令都会生成一个临时的容器,然后在容器里面执行命令。DIB则每个elements都会chroot到镜像中,执行elements中的脚本

感兴趣的可以去官网深入了解更多语法


2、virt-builder http://libguestfs.org/virt-builder.1.html 官网写的也很详细,语法也很简单 virt-builder os-version [-o|--output DISKIMAGE] [--size SIZE] [--format raw|qcow2] [--arch ARCHITECTURE] [--attach ISOFILE] [--append-line FILE:LINE] [--chmod PERMISSIONS:FILE] [--commands-from-file FILENAME] [--copy SOURCE:DEST] [--copy-in LOCALPATH:REMOTEDIR] [--delete PATH] [--edit FILE:EXPR] [--firstboot SCRIPT] [--firstboot-command 'CMD+ARGS'] [--firstboot-install PKG,PKG..] [--hostname HOSTNAME] [--install PKG,PKG..] [--link TARGET:LINK[:LINK..]] [--mkdir DIR] [--move SOURCE:DEST] [--password USER:SELECTOR] [--root-password SELECTOR] [--run SCRIPT] [--run-command 'CMD+ARGS'] [--scrub FILE] [--sm-attach SELECTOR] [--sm-register] [--sm-remove] [--sm-unregister] [--ssh-inject USER[:SELECTOR]] [--truncate FILE] [--truncate-recursive PATH] [--timezone TIMEZONE] [--touch FILE] [--uninstall PKG,PKG..] [--update] [--upload FILE:DEST] [--write FILE:CONTENT] [--no-logfile] [--password-crypto md5|sha256|sha512] [--selinux-relabel] [--sm-credentials SELECTOR] 更重要的是可以自定义安装,那么对于openstack云镜像有了更多的灵活的选配。


2、Oz 强大的镜像制作工具,支持诸多发行版linux https://github.com/clalancette/oz/wiki 安装 yum -y install oz

装完后,你最好就重启机器,你用ifconfig,可以看到virbr0这个网络,不然你就安装失败。

配置Oz,默认Oz是使用raw格式,我的习惯是使用qcow2格式. cat /etc/oz/oz.cfg [paths] output_dir = /data/nvme0n1/oz data_dir = /var/lib/oz screenshot_dir = /var/lib/oz/screenshots # sshprivkey = /etc/oz/id_rsa-icicle-gen

[libvirt] uri = qemu:///system image_type = raw

# type = kvm # bridge_name = virbr0 # cpus = 1 # memory = 1024

[cache] original_media = yes modified_media = no jeos = no

[icicle] safe_generation = no

[timeouts] install = 3600 inactivity = 300 boot = 300 shutdown = 90

这个就是Oz的配置文件,我把默认文件格式改成qcow2.


创建配置文件,我们需要两个配置文件,centos65.tdl 和centos65.ks centos65.ks install text key --skip keyboard us lang en_US.UTF-8 skipx rootpw Ct@2017Yun!@$%.CN firewall --disabled authconfig --enableshadow --enablemd5 selinux --disabled logging --level=info reboot services --disabled="avahi-daemon,iscsi,iscsid,firstboot,kdump" --enabled="network,sshd,rsyslog,tuned" timezone --utc Asia/Shanghai network --bootproto=dhcp --device=eth0 --onboot=on bootloader --location=mbr --append="console=tty0 console=ttyS0,115200" --location=mbr --driveorder="sda" --timeout=1 zerombr yes clearpart --all

part / --fstype ext4 --size=2048 --grow

%post

cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF DEVICE="eth0" BOOTPROTO="dhcp" ONBOOT="yes" TYPE="Ethernet" USERCTL="yes" PEERDNS="yes" IPV6INIT="no" PERSISTENT_DHCLIENT="1" EOF

echo "ttyS0" >> /etc/securetty cat <<EOF > /etc/init/ttyS0.conf start on stopped rc RUNLEVEL=[2345] stop on starting runlevel [016] respawn instance /dev/ttyS0 exec /sbin/agetty /dev/ttyS0 115200 vt100-nav EOF

#sed_profile sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config sed -i 's/#UseDNS yes/UseDNS no/g' /etc/ssh/sshd_config sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' /etc/ssh/sshd_config

#yum clean all rm -rf /root/* rm -rf /var/log/anaconda* rm -rf /var/log/message

/var/log/boot.log /var/log/messages /var/log/cloud-init-output.log /var/log/yum.log %end %packages --nobase --excludedocs


tdl文件是xml格式的。不知道博客为什么不支持此格式 centos65.tdl <template> <name>centos65</name> #版本最好写对 <os> <name>CentOS-6</name> <version>5</version> <arch>x86_64</arch>#cpu架构64位 <install type='iso'>#install源,这里选择本地iso,当然也可以url指定网上的iso <iso>file:///data/iso/CentOS-6.5-x86_64-minimal.iso</iso> </install> <rootpw>123456</rootpw>#root密码 </os> <disk> <size>20</size>#磁盘大小 </disk> <description>CentOS 6.5 x86_64</description> <packages>#需要安装的软件包,名字得写全 <package name='acpid'/> <package name='cloud-utils'/> <package name='cloud-init'/> <package name='parted'/> <package name='NetworkManager-*'/> </packages> <repositories>#设置yum源,这里写阿里源 <repository name='aliyun-Base'> <url>http://mirrors.aliyun.com/centos/$releasever/os/$basearch/</url> <signed>no</signed> </repository> <repository name='epel'> <url>http://mirrors.aliyun.com/epel/6/$basearch</url> <signed>no</signed> </repository> </repositories> <commands>

<command name='install_linux_root_resize'>#cloud-init的resize的包,centos6系列如果不装此包无法扩展根分区大小

cd /root unzip linux-rootfs-resize-master.zip cd linux-rootfs-resize-master bash ./install </command>

<command name='profile'>#自定义命令 echo "NOZEROCONF=yes" >> /etc/sysconfig/network ln -s /boot/grub/grub.conf /etc/grub.conf rm -rf /etc/udev/rules.d/70-persistent-net.rules touch /etc/udev/rules.d/75-persistent-net-generator.rules chmod +x /var/lib/cloud/scripts/per-boot/resetroot </command>

<command name='services'>#关于服务开机自启 service sshd restart service iptables stop service ip6tables stop service acpid start service NetworkManager start chkconfig iptables off chkconfig ip6tables off chkconfig acpid on chkconfig NetworkManager on chkconfig cloud-init on chkconfig cloud-final on chkconfig cloud-config on chkconfig cloud-init-local on </command>

<command name='clear-logs'>#清空log文件 rm -rf /root/* rm -rf /var/log/anaconda* rm -rf /var/log/message rm -rf /var/log/messages rm -rf /etc/yum.repos.d/aliyun-Base.repo rm -rf /etc/yum.repos.d/epel.repo yum clean all yum makecache

/var/log/boot.log /var/log/messages /var/log/cloud-init-output.log /var/log/yum.log </command>

</commands> <files>#这里可以指定服务器本地文件,对应上传到镜像中的位置,比如传个包或者配置文件替换默认配置文件 <file name="/root/linux-rootfs-resize-master.zip" type="url"> file:///data/nvme0n1/oz/linux-rootfs-resize-master.zip </file> <file name="/var/lib/cloud/scripts/per-boot/resetroot" type="url"> file:///data/nvme0n1/oz/resetroot </file> <file name="/etc/cloud/cloud.cfg" type="url"> file:///data/nvme0n1/oz/cloud.cfg_centos6 </file> </files> </template>


编辑好执行命令,配置文件路径一定要写对 oz-install -p -u -d3 -a centos65.ks centos65.tdl -x centos65-libvirt.xml 以下为输出截图