天天看點

如何用U盤實作Citrix Hypervisor無人值守的安裝

作者:神行科技

基本概念

多年前的思傑合作夥伴 PoC 教育訓練有一項附加實驗叫 XenServer 的無人值守安裝

(XenServer unattended installation)。如今的 Xen300 教育訓練不再包含這個實驗,但有些場

景下還是需要做 XenServer 或 Citrix Hypervisor 的自動化部署,比如一體機自動部署或者

小環境的最簡部署。是以我們再次介紹如何通過定制 Citrix Hypervisor 的安裝 iso,用 U 盤

實作 Citrix Hypervisor 的無人值守安裝。

如果我們把 Citrix Hypervisor 的安裝 iso 解壓,會看到如下目錄結構。請注意被紅色圈

出的、和無人值守安裝有關的兩個檔案:

如何用U盤實作Citrix Hypervisor無人值守的安裝

isolinux.cfg

當我們在啟動 Citrix Hypervisor 安裝的時候按下 F2,會看到進階安裝菜單:

如何用U盤實作Citrix Hypervisor無人值守的安裝

菜單裡每一個安裝選項如 install、no-serial、safe 等,都是在 isolinux.cfg 檔案中被定

義的。我們如果用文本編輯器打開 isolinux.cfg,能看到各安裝選項的定義:

如何用U盤實作Citrix Hypervisor無人值守的安裝

我們定制用于無人值守安裝的 iso,需要修改 isolinux.cfg 檔案的每一個安裝項,加入

answerfile 參數:

answerfile=file:///answerfile.xml install

安裝程式讀取這個參數指定的應答檔案(answerfile.xml),在安裝 Citrix Hypervisor 時

指定主機的基本資訊,如主機名、IP 位址、時區、root 密碼、安裝後自動化腳本 (post

installation script)等。

install.img

熟悉 Linux 系統安裝的同學,對 ramdisk (虛拟記憶體盤)應該不陌生。Citrix Hypervisor

安裝程式啟動時,需要加載一個檔案系統包含安裝 Citrix Hypervisor 所需的 rpm 軟體包和

驅動程式,這個檔案系統就是從 install.img 這個 ramdisk (也稱 initrd) 加載的。無人值守

安裝所需的 answerfile.xml 和 post installation script 會被打包進 install.img。

我們如果用 gzip (XenServer 7.1.2)或 bzip2 (Citrix Hypervisor 8.2)将 install.img 解壓縮,能看到 answerfile.xml 和 post installation script:

answerfile.xml

如前所述,我們通過修改 isolinux.cfg 來讓安裝程式讀取 answerfile.xml 檔案實作主機

基本資訊的定制化。作為無人值守安裝的應答檔案,這個 XML 可以實作 Citrix Hypervisor

主機基本資訊的預設定。XML 的内容簡單易懂,以下是一個示例:

需要注意,可以利用這個 XML 的<script>标簽指定安裝後自動化腳本(post installation

script)。以下示例指定了被打包進 install.img 的腳本 postInstall.sh 作為自動化腳本:

<script>标簽的 type 屬性除了設為 local,還可以設為 url 或 nfs,分别指向 http:// 和server:/ 開頭的位址。

<script>标簽另一個重要的屬性是 stage,用于設定腳本在什麼階段被自動執行,最常

用的值為 filesystem-populated,還能設為 installation-complete 或 installation-start。

關于應答檔案的各種标簽和屬性解釋,可以參考:

https://docs.citrix.com/en-us/citrix-hypervisor/install/network

boot.html#create-an-answer-file-for-unattended-pxe-and-uefi-installation

post installation script

如果希望在 Citrix Hypervisor 安裝結束後,自動執行一系列 xe指令自動配置 hypervisor,

如設定網卡綁定、元件資源池、導入虛拟機模闆等,我們可以通過 answerfile.xml 指定一

個安裝後自動化腳本(post installation script),這個腳本通常往 dom0 虛拟機的/etc/rc.d/

目錄中下載下傳或寫入首次啟動腳本(first boot script),first boot script 在 Citrix Hypervisor 安

裝完畢的首次重新開機後自動執行 xe 指令配置 hypervisor。

為什麼 post installation script 不直接配置 hypervisor,而需要通過 first boot script

呢?因為在 Citrix Hypervisor 的安裝過程中,Dom0 虛拟機并沒有啟動,

XAPI 也沒在運作,

于是 xe 指令也就不可能被執行,我們必須等待安裝完畢 hypervisor 第一次啟動後,執行

first boot script 配置 hypervisor。

以下是一個 post installation script 的例子,從網絡上下載下傳 first boot script 并在

/etc/rc3.d 目錄生成連結:

這是另一個例子,用 cat 指令直接往/etc/rc.local 啟動腳本追加内容:

以上兩個例子,我們注意到腳本中引用 Dom0 的檔案路徑時,路徑前都加上了位置參

數$1,stage 設為 filesystem-populated 的腳本都會被傳入位置參數$1,指向 Dom0 根

檔案系統的加載點(mount point)。

還有一個極易被忽略的細節:如果我們在 Windows 系統中編寫腳本,生成的換行符是由 CR (\r) 和 LF (\n) 兩個字元組成的。這樣的腳本在 Linux/UNIX 中運作會報錯,原因是

Linux/UNIX 環境的換行符是單個字元 LF (\n),導緻腳本無法被正常識别。

我們可使用文本編輯器檢查檔案換行符,以下檔案使用了 Windows 換行符 (CR/LF):

這個檔案則使用了 Linux/UNIX 換行符 (LF):

是以,強烈建議在 Linux 環境編寫 post installation script,這樣生成的換行符是

Linux/UNIX 标準;或者在 Windows 環境寫好腳本後,通過文本編輯器的轉換功能替換為

Linux/UNIX 換行符:https://blog.csdn.net/offbye/article/details/7224638

制作無人值守 Citrix Hypervisor iso

作為預備工作,我們找一台 Linux 機器,用 mkdir 建立以下幾個目錄:

/mnt/iso –

加載通過 Citrix Hypervisor iso 建立的回環裝置

/mnt/iso.unpacked –

存放 Citrix Hypervisor iso 的解壓資料

/mnt/img.unpacked –

存放 install.img 的解壓資料

第一步,我們利用原始的 Citrix Hypervisor iso 建立一個回環裝置,并解壓 iso 的内容

到 iso.unpacked 目錄:

mount -o loop,ro CitrixHypervisor-8.2.0-install-cd.iso /mnt/iso

cd /mnt/iso

find . | cpio -pdm /mnt/iso.unpacked

接下來,我們通過 bzip2 将原始的 install.img 解壓縮到 img.unpacked 目錄:

cd /mnt

bzcat iso.unpacked/install.img | ( cd img.unpacked && cpio -idu --quiet )

注:這裡用到了 bzcat,因為 Citrix Hypervisor 8.2 的 install.img 用了 bzip2 壓縮。如果咱們定制的是 XenServer 7.1.x 的 iso,install.img 使用 gzip 壓縮的,則需要用 zcat 替

代 bzcat:

zcat iso.unpacked/install.img | ( cd img.unpacked && cpio -idu --quiet )

然後,我們将預先建立好的應答檔案和 post installation script 複制進 img.unpacked:

cp answerfile.xml /mnt/img.unpacked

cp postInstall.sh /mnt/img.unpacked/script/

重新打包 install.img:

(cd /mnt/img.unpacked && find . | sort | cpio -o -H newc | bzip2 -9c ) >

/mnt/install.img

注:由于 8.2 的 install.img 使用的是 bzip2 壓縮,這裡就運作了 bzip2 指令;如果是

7.1.x,則改用 gzip:

(cd /mnt/img.unpacked && find . | sort | cpio -o -H newc | gzip -9c ) >

/mnt/install.img

将新的 install.img 放入 iso.unpacked 目錄:

mv /mnt/install.img /mnt/iso.unpacked

修改 iso.unpacked 目錄中的 isolinux.cfg,給每個安裝項指定應答檔案:

sed -i 's/console=tty0/console=tty0\ answerfile=file\:\/\/\/answerfile\.xml\

install/g' /mnt/iso.unpacked/boot/isolinux/isolinux.cfg

重新打包 Citrix Hypervisor iso:

genisoimage

-o xs82-new.iso

-b boot/isolinux/isolinux.bin

-c

boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -R -V

"Citrix Hypervisor 8.2 Base Pack" /mnt/iso.unpacked

最後,我們将定制化的 Citrix Hypervisor iso 通過 iso 工具寫入 U 盤,這裡我們用了

Rufus:驗證無人值守安裝

找台主機通過剛才制作的 U 盤啟動,如果一切順利,将依次看到以下畫面:最後,驗證應答檔案的設定是否正确應用,post install script 是否正常執行。

繼續閱讀