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 p_w_picpathfactory 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 p_w_picpathfactory_plugins.ovfcommon.ovfcommon import RHEVOVFPackage
File "/tmp/ovirt-appliance/engine-appliance/p_w_picpathfactory/p_w_picpathfactory_plugins/ovfcommon/ovfcommon.py", line 28, in <module>
from imgfac.PersistentImageManager import PersistentImageManager
File "/tmp/ovirt-appliance/engine-appliance/p_w_picpathfactory/imgfac/PersistentImageManager.py", line 17, in <module>
from ApplicationConfiguration import ApplicationConfiguration
File "/tmp/ovirt-appliance/engine-appliance/p_w_picpathfactory/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/p_w_picpathfactory/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/p_w_picpaths/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)/p_w_picpathfactory/" 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/p_w_picpaths/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檔案
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]
mainp_w_picpath = squashfs.img
[p_w_picpaths-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)