oVirt專題:Hosted Engine之Engine Appliance製作(1)

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文件

(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]
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)



文中如有錯誤,歡迎看客指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章