oVirt v3.4开始支持Hosted Engine。什么是Hosted Engine呢?很简单,以前的管理节点是部署在一台物理机器上的,现在我们将管理节点部署到一台虚拟机中,并且这台虚拟机运行在oVirt虚拟化环境中的计算节点上。以前是先部署管理节点,然后部署计算节点,最后把计算节点注册到管理节点,这时通过WEB管理平台可以在计算节点上运行虚拟机。现在的需要先部署计算节点,然后在计算节点上起虚机部署管理节点。先后顺序有了变化。
前面提到需要将管理节点部署在一台虚拟机中,既然是虚拟机,那么我们可以提前制作一个管理节点虚拟机模板――Engine Appliance,提前在虚拟机中安装好系统及管理节点需要的软件包,在部署oVirt虚拟化环境时直接基于该模板创建一台虚拟机,在虚拟机中执行engine-setup命令进行配置即可完成管理节点部署。这样我们可以节约管理节点部署的时间,实现虚拟化环境的快速部署。
Engine Appliance如何制作?oVirt社区ovirt-appliance项目为我们提供了制作工具。下面介绍下基于该工具制作Engine Appliance的方法:
一、环境准备
需要准备一台能够连接互联网的机器(需要开启CPU虚拟化支持),内存需要大于5G,磁盘可用空间大于10G;准备CentOS7(6中缺少必要的lorax包)的安装介质。
二、制作环境搭建
(1)安装CentOS7系统
(2)安装依赖包(需要配置epel7的软件源)
# yum -y install lorax pykickstart virt-install libguestfs-tools imagefactory oz # yum -y groupinstall Virtualization Host
(3)将SELinux设置为Permissive模式
# setenforce 0 # sed -i "s/^SELINUX.*/SELINUX=permissive/g" /etc/sysconfig/selinux
三、制作appliance
(1)下载ovirt-appliance包,准备appliance制作环境
# cd /tmp/ # git clone git://gerrit.ovirt.org/ovirt-appliance # cd ovirt-appliance # git submodule update --init # cd engine-appliance
(2)制作appliance
(2.1)raw格式(输出文件为ovirt-appliance-fedora.raw)
# make ovirt-appliance-fedora.raw
(2.2)ova格式(输出文件为ovirt-appliance-fedora.ova)
# make
Note:此时我们就可以得到raw或ova格式的Engine Appliance文件,该文件可以在Hosted Engine部署时作为管理节点虚拟机模板来使用。
常见错误解决办法:
(1)导入Version模块错误,如下:
Traceback (most recent call last): File "scripts/create_ova.py", line 4, in <module> from imagefactory_plugins.ovfcommon.ovfcommon import RHEVOVFPackage File "/tmp/ovirt-appliance/engine-appliance/imagefactory/imagefactory_plugins/ovfcommon/ovfcommon.py", line 28, in <module> from imgfac.PersistentImageManager import PersistentImageManager File "/tmp/ovirt-appliance/engine-appliance/imagefactory/imgfac/PersistentImageManager.py", line 17, in <module> from ApplicationConfiguration import ApplicationConfiguration File "/tmp/ovirt-appliance/engine-appliance/imagefactory/imgfac/ApplicationConfiguration.py", line 25, in <module> from imgfac.Version import VERSION as VERSION ImportError: No module named Version make: *** [ovirt-appliance-fedora.ova] 错误 1
解决办法:
# cp /usr/lib/python2.7/site-packages/imgfac/Version.py /tmp/ovirt-appliance/engine-appliance/imagefactory/imgfac/
(2)没有找到qemu-kvm命令,如下
kill $(cat spawned_pids) /bin/bash:行1: qemu-kvm: 未找到命令 make[1]: 离开目录“/tmp/ovirt-appliance/engine-appliance”
解决办法:
ln -s /usr/libexec/qemu-kvm /bin/
Engine Appliance制作工具分析:
通过上面的制作方法我们可以了解到,Engine Appliance的制作方法是完全自动化的,如果我们想要对Engine Appliance做一些自定义的配置,应该如何实现呢?
首先介绍下工具的工作流程:
执行make命令-->调用MakeFile(定义变量,嵌套第二个make)-->make -f imgbased/data/images/poor-mans-lmc.makefile(定义变量,执行run-install)-->run-install(定义变量,调用qemu-kvm命令,读取ks文件,安装一个系统,制作qcow2格式的文件)-->返回第一个make继续调用scripts/create_ova.py脚本制作ova文件
相关文件分析:
(1)MakeFile
MAIN_NAME ?= ovirt-appliance-fedora #定义文件名 VM_CPUS ?= 2 #定义虚拟机CPU数量 VM_RAM ?= 4096 #定义虚拟机RAM大小(M) VM_DISK ?= 8000 #定义虚拟机DISK大小(M) OVA_RAM ?= 4096 #定义OVA模板RAM大小(M) OVA_CPUS ?= $(VM_CPUS) #定义OVA模板CPU数量 ARCH := x86_64 #定义架构 RELEASEVER := 7 #定义版本 PYTHON ?= PYTHONPATH="$(PWD)/imagefactory/" python #定义Python环境变量 CURL ?= curl #定义CURL工具 .SECONDARY: .PHONY:$(MAIN_NAME).ks.tpl #定义ks模板文件名称 .INTERMEDIATE: hda.qcow2 #定义虚拟机磁盘文件名 all: $(MAIN_NAME).ova echo "$(MAIN_NAME)" appliance done %.ks: %.ks.tpl #基于ks模板,拼合生成ks文件(修改一些ks文件信息) ksflatten $< > $@ sed -i \ -e "/^[-]/ d" \ -e "/^text/ d" \ -e "s/^part .*/part \/ --size $(VM_DISK) --fstype ext4 --fsoptions discard/" \ -e "s/^network .*/network --activate/" \ -e "s/^%packages.*/%packages --ignoremissing/" \ -e "/default\.target/ s/^/#/" \ -e "/RUN_FIRSTBOOT/ s/^/#/" \ -e "/remove authconfig/ s/^/#/" \ -e "/remove linux-firmware/ s/^/#/" \ -e "/remove firewalld/ s/^/#/" \ -e "/^bootloader/ s/bootloader .*/bootloader --location=mbr --timeout=1/" \ -e "/rawhide/ s/^/#/" \ -e "/^reboot/ s/reboot/poweroff/" \ -e "/^services/ s/sshd/sshd,initial-setup-text/" \ -e "/^firstboot/ s/$$/ --reconfig/" \ -e "s#\$$basearch#$(ARCH)#g" \ -e "s#\$$releasever#$(RELEASEVER)#g" \ $@ %.qcow2: %.ks #制作qcow2格式模板文件 make -f imgbased/data/images/poor-mans-lmc.makefile \ #执行第二次make KICKSTART="$<" \ RELEASEVER=$(RELEASEVER) \ QEMU_APPEND="cmdline $(QEMU_APPEND)" \ DISK_SIZE=$$(( $(VM_DISK) / 1000 ))G \ run-install #执行run-install,制作hda.qcow2文件 qemu-img convert -O qcow2 hda.qcow2 "$@" #将hda.qcow2文件转换为qcow2格式并重新命名 rm -f hda.qcow2 #删除hda.qcow2文件(该文件为中间文件,此后已不需要) %.ova: %.qcow2 #调用scripts/create_ova.py,制作ova格式模板文件 $(SUDO) $(PYTHON) scripts/create_ova.py -m $(OVA_RAM) -c $(OVA_CPUS) "$*.qcow2" "$@" clean: clean-log #清除log echo clean-log: rm -f *.log #删除log文件
(2)poor-mans-lmc.makefile
KICKSTART = kickstarts/runtime-layout.ks #需要再研究下文件是否会被调用 DISK_NAME = hda.qcow2 #定义虚拟机磁盘文件名 DISK_SIZE = 10G #定义虚拟机磁盘大小 VM_RAM = 2048 #定义虚拟机内存 VM_SMP = 4 QEMU = qemu-kvm #定义QEMU工具 QEMU_APPEND = #QEMU附加信息 CURL = curl -L -O #CURL命令附加选项 FEDORA_RELEASEVER = 7 #定义版本 FEDORA_ANACONDA_RELEASEVER = 7 #定义Anaconda版本 FEDORA_URL = http://192.168.3.239/mirrors/Fedora/19/os/x86_64/ #定义FEDORA dvd镜像URL FEDORA_ANACONDA_URL = $(FEDORA_URL) #定义Anaconda URL ifneq ($(FEDORA_RELEASEVER), $(FEDORA_ANACONDA_RELEASEVER)) FEDORA_ANACONDA_URL = http://192.168.3.239/mirrors/Fedora/19/os/x86_64/ endif SHELL = /bin/bash .INTERMEDIATE: spawned_pids vmlinuz: #定义vmlinuz文件位置 $(CURL) $(FEDORA_ANACONDA_URL)/isolinux/vmlinuz initrd.img: #定义initrd.img文件位置 $(CURL) $(FEDORA_ANACONDA_URL)/isolinux/initrd.img squashfs.img: #定义squashfs.img文件位置 $(CURL) $(FEDORA_ANACONDA_URL)/LiveOS/squashfs.img define TREEINFO #定义TreeInfo信息 [general] name = Fedora-$(FEDORA_RELEASEVER) family = Fedora variant = Fedora version = $(FEDORA_RELEASEVER) packagedir = arch = x86_64 [stage2] mainimage = squashfs.img [images-x86_64] kernel = vmlinuz initrd = initrd.img endef .PHONY: .treeinfo export TREEINFO .treeinfo: echo -e "$$TREEINFO" > $@ run-install: PYPORT:=$(shell echo $$(( 50000 + $$RANDOM % 15000 )) ) run-install: vmlinuz initrd.img squashfs.img .treeinfo $(KICKSTART) python -m SimpleHTTPServer $(PYPORT) & echo $$! > spawned_pids qemu-img create -f qcow2 $(DISK_NAME) $(DISK_SIZE) $(QEMU) \ #调用qemu-kvm启动虚拟机,根据ks文件配置自动安装系统并进行相关配置 -vnc 0.0.0.0:7 \ -serial stdio \ -smp $(VM_SMP) -m $(VM_RAM) \ -hda $(DISK_NAME) \ -kernel vmlinuz \ -initrd initrd.img \ -append "console=ttyS0 inst.repo=$(FEDORA_URL) inst.ks=http://10.0.2.2:$(PYPORT)/$(KICKSTART) inst.stage2=http://10.0.2.2:$(PYPORT)/ quiet $(QEMU_APPEND)" ; \ kill $$(cat spawned_pids)
文中如有错误,欢迎看客指正。