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 <
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
#cloud-init的resize的包,centos6系列如果不装此包无法扩展根分区大小
cd /root
unzip linux-rootfs-resize-master.zip
cd linux-rootfs-resize-master
bash ./install
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
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
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
file:///data/nvme0n1/oz/linux-rootfs-resize-master.zip
file:///data/nvme0n1/oz/resetroot
file:///data/nvme0n1/oz/cloud.cfg_centos6
编辑好执行命令,配置文件路径一定要写对
oz-install -p -u -d3 -a centos65.ks centos65.tdl -x centos65-libvirt.xml
以下为输出截图