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 [email protected][email protected]$%.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
以下为输出截图
原文地址:http://blog.51cto.com/gushiren/2121573