参考链接:

https://github.com/clalancette/oz/wiki/Oz-template-description-language

https://github.com/clalancette/oz/wiki/oz-install

http://dl528888.blog.51cto.com/2382721/1862568

Oz 创建Centos 7镜像

Oz简介

做openstack的centos 镜像的步骤,比较繁琐,最近在查比较好用的工具,查到官方提到的Oz,它的功能还是很强大的,它可以自动的安装操作系统,并且可以定制自己的操作系统,还可以生成操作系统的元数据,包括Centos,Ubuntu,Windows等等,它提供了三条很有用的命令,分别是oz-install,oz-customize,oz-generate-icicle,详细介绍可以查看它在github上的代码仓库:Oz

Oz安装

首先,导入epel源,执行如下命令:

rpm -ivh http://mirrors.sohu.com/fedora-epel/7/x86_64/e/epel-release-7-2.noarch.rpm

安装oz和它所需要的依赖,执行如下命令:
yum install -y oz libguestfs-tools

查看oz安装信息,执行如下命令:
rpm -qa | grep oz
rpm -ql oz-0.15.0-1.el7.noarch

安装完成之后:

各操作系统自动化安装模板所在目录:/usr/lib/python2.7/site-packages/oz/auto

tdl配置模板样例的目录:/usr/share/doc/oz-0.15.0/examples

修改镜像类型为qcow修改配置文件:/etc/oz/oz.cfg

Oz 创建CentOS7镜像-LMLPHP Oz 创建CentOS7镜像-LMLPHP
[paths]
output_dir = /var/lib/libvirt/images
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
image_type = qcow2
# type = kvm
# bridge_name = virbr0
# cpus = 1
# memory = 1024
[cache]
original_media = yes
modified_media = no
jeos = no
[icicle]
safe_generation = no
oz.cfg

创建centos7.3 镜像

首先创建自己的tdl文件,我创建的是centos7.3.tdl,具体的语法信息请参考oz-Template Description Language,我的tdl文件内容如下:

Oz 创建CentOS7镜像-LMLPHP Oz 创建CentOS7镜像-LMLPHP
<template>
  <name>qemu-centos73</name>
  <os>
    <name>CentOS-7</name>
    <version>3</version>
    <arch>x86_64</arch>
    <install type='iso'>
      <iso>file:///data/md0/iso/CentOS-7.3-x86_64-Minimal-1611.iso</iso>
    </install>
    <rootpw>123123</rootpw>
  </os>
  <disk>
    <size>20</size>
  </disk>
  <description>CentOS 7.3 x86_64</description>
  <packages>
    <package name='net-tools'/>
    <package name='cloud-utils-growpart'/>
    <package name='cloud-init-*'/>
    <package name='acpid'/>
    <package name='NetworkManager'/>
  </packages>
  <commands>
    <command name='install_qga'>
cd /root
tar xf qga.20171124.tar.gz
cd qga
bash ./install_qga_local.sh
    </command>

   <command name='sed_profile'>
echo "NOZEROCONF=yes" >> /etc/sysconfig/network
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
chmod +x /var/lib/cloud/scripts/per-instance/ssh.sh
chmod +x /usr/local/bin/nic_set_mq.sh
echo "/usr/local/bin/nic_set_mq.sh > /tmp/nic_set_mq.log 2&gt;&amp;1" >> /etc/rc.d/rc.local
echo "[connection]" >> /etc/NetworkManager/NetworkManager.conf
echo "ipv4.route-metric=0" >> /etc/NetworkManager/NetworkManager.conf
chmod +x /etc/rc.d/rc.local
    </command>

    <command name='console'>
grub2-mkconfig -o /boot/grub2/grub.cfg
   </command>

   <command name='services'>
systemctl enable sshd
systemctl disable firewalld
systemctl enable cloud-init
systemctl enable cloud-config
systemctl enable cloud-final
systemctl enable cloud-init-local
systemctl enable acpid
systemctl enable NetworkManager
   </command>

   <command name='clear-logs'>
rm -rf /root/*
rm -rf /var/log/anaconda*
rm -rf /var/log/message
rm -rf /etc/sysconfig/network-scripts/ifcfg-eth0
>/var/log/boot.log
>/var/log/messages
>/var/log/cloud-init-output.log
>/var/log/yum.log
>/var/log/lastlog
   </command>
  </commands>

    <files>
        <file name="/root/qga.20171124.tar.gz" type="url">
            file:///data/nvme0n1/OZ-build-image/scripts/qga.20171124.tar.gz
        </file>
        <file name="/var/lib/cloud/scripts/per-boot/resetroot" type="url">
            file:///data/nvme0n1/OZ-build-image/scripts/resetroot
        </file>
        <file name="/etc/cloud/cloud.cfg" type="url">
            file:///data/nvme0n1/OZ-build-image/scripts/cloud.cfg_centos7
        </file>
        <file name="/usr/local/bin/nic_set_mq.sh" type="url">
            file:///data/nvme0n1/OZ-build-image/scripts/nic_set_mq.sh
        </file>
        <file name="/etc/default/grub" type="url">
            file:///data/nvme0n1/OZ-build-image/scripts/grub_centos7
        </file>
        <file name="/var/lib/cloud/scripts/per-instance/ssh.sh" type="url">
            file:///data/nvme0n1/OZ-build-image/scripts/ssh-centos7.ssh
        </file>
        <file name="/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg" type="url">
            file:///data/nvme0n1/OZ-build-image/scripts/99-disable-network-config.cfg
        </file>
    </files>
</template>
centos7.3.tdl

注意在os下面的name一定要写正确,不然会出错。

其次创建centos7.3.ks文件,可以复制各操作系统自动化安装模板所在目录下相应版本的操作系统的auto文件,我的文件内容如下:

Oz 创建CentOS7镜像-LMLPHP Oz 创建CentOS7镜像-LMLPHP
install
text
keyboard us
lang en_US.UTF-8
skipx
network --device eth0 --bootproto dhcp --onboot=on
rootpw Ct@2017Yun!@$%.CN
firewall --disabled
authconfig --enableshadow --enablemd5
timezone --utc Asia/Shanghai
selinux --disabled
zerombr
clearpart --all --drives=vda
bootloader --location=mbr --append="console=tty0 console=ttyS0,115200n8"
part / --fstype xfs --size=2048 --grow --ondisk=vda
reboot
services --disabled="avahi-daemon,iscsi,iscsid,firstboot,kdump" --enabled="network,sshd,rsyslog,tuned"
%post

cat <<EOL >> /etc/rc.local
if [ ! -d /root/.ssh ] ; then
    mkdir -p /root/.ssh
    chmod 0700 /root/.ssh
    restorecon /root/.ssh
fi
EOL


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
%end
%packages --nobase --excludedocs
%end
centos7.3.ks

最后执行创建命令如下:

oz-install -p -u -d3 -a centos7.3.ks centos7.3.tdl -x centos7.3-libvirt.xml

生成的虚机xml文件

Oz 创建CentOS7镜像-LMLPHP Oz 创建CentOS7镜像-LMLPHP
<domain type="kvm">
  <name>centos73</name>
  <memory>1048576</memory>
  <currentMemory>1048576</currentMemory>
  <uuid>e7d815ac-ccde-4068-91fc-8925f7b03888</uuid>
  <clock offset="utc"/>
  <vcpu>1</vcpu>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <os>
    <type>hvm</type>
    <boot dev="hd"/>
  </os>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>destroy</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <graphics type="vnc" port="-1" listen="0.0.0.0"/>
    <interface type="bridge">
      <source bridge="virbr0"/>
      <mac address="52:54:00:58:ae:5b"/>
      <model type="virtio"/>
    </interface>
    <input bus="ps2" type="mouse"/>
    <serial type="pty">
      <target port="0"/>
    </serial>
    <serial type="tcp">
      <source host="127.0.0.1" mode="bind" service="53197"/>
      <protocol type="raw"/>
      <target port="1"/>
    </serial>
    <disk device="disk" type="file">
      <target bus="virtio" dev="vda"/>
      <source file="/data/nvme0n1/oz/images/centos73.dsk"/>
      <driver type="raw" name="qemu"/>
    </disk>
    <channel type="unix">
      <source path="/var/lib/libvirt/qemu/org.qemu.guest_agent.0.centos73.sock" mode="bind"/>
      <target type="virtio" name="org.qemu.guest_agent.0"/>
    </channel>
  </devices>
</domain>
centos7.3-libvirt.xml
04-19 07:00