為 OpenStack 私有云創(chuàng)建 Linux 和 Windows 映像
開源 OpenStack 云操作系統(tǒng)是一個功能豐富且可以大規(guī)模擴展的平臺,適用于所有類型的云計算。一些公共云服務(wù)基于 OpenStack,許多組織內(nèi)的私有云實現(xiàn)也是如此。但 OpenStack 仍缺乏一些針對私有云的特性,尤其是針對開發(fā)和測試環(huán)境的特性。例如,映像構(gòu)建就不是一個簡單的過程。本文為 OpenStack 私有云提供一種全新且改進的映像創(chuàng)建方法。我們在 QEMU/KVM 平臺上驗證了這種新方法,但在理論上該方法也適用于其他虛擬機管理程序平臺。
介紹這個新方法之前,我們將概述目前在 OpenStack 中如何創(chuàng)建映像。
目前在 OpenStack 中創(chuàng)建映像的方式
在 OpenStack 中創(chuàng)建 Linux 或 Windows 映像的過程由多個耗時的步驟組成。
基于 Linux 的映像
官方 OpenStack 虛擬機映像指南 詳細介紹了 7 種 要求,必須滿足這些要求,基于 Linux 的映像才能在 OpenStack 云中完全正常工作(可通過安裝 cloud-init 包來滿足一些要求)。該映像指南建議用戶在創(chuàng)建自己的映像之前閱讀指南中很長一節(jié)的內(nèi)容,確保映像支持他們計劃使用的 OpenStack 特性。
對于一些特定的發(fā)行版,可手動或使用工具創(chuàng)建 Linux 映像 — 比如 VMBuilder、Oz 或 imagefactory。無論使用哪種方法,在創(chuàng)建自己的 Linux 映像之前都需要以下材料:
- OS 安裝 CD/DVD 或 ISO 映像文件。
- 一個啟用了 KVM/QEMU 虛擬機管理程序的 Linux 機器。一些發(fā)行版可能需要 virt-manager/virt-viewer GUI 實用程序。
- cloud-init 或針對操作系統(tǒng)自行編寫的等效腳本。
- guestfish、guestmount 或 virt-* 工具,用于修改映像。
滿足所有必須的條件后,即可開始根據(jù)下面總結(jié)的步驟創(chuàng)建自己的 Linux 映像:
- 使用 virt-manager 或 virt-install 創(chuàng)建一個虛擬機 (VM) 并安裝操作系統(tǒng)。
- 配置操作系統(tǒng),以滿足您自己的需求(例如通過安裝所需的中間件),或者安裝 cloud-init 或等效的腳本來滿足 OpenStack 的要求。
- 使用 guestfish、guestmount 或 virt-* 修改映像,以滿足 OpenStack 的要求。
- 將新映像上傳到 OpenStack 映像服務(wù)并驗證該映像。
基于 Windows 的映像
OpenStack 網(wǎng)站上沒有詳細的示例介紹如何創(chuàng)建基于 Windows 的映像。但要讓您創(chuàng)建的基于 Windows 的映像能正常運行,您必須至少:
- 安裝一個 VirtIO 驅(qū)動程序。
- 啟用遠程桌面協(xié)議 (Remote Desktop Protocol, RDP) 并配置它以通過防火墻。
- 配置 Internet 控制消息協(xié)議 (Internet Control Message Protocol, ICMP) 以通過防火墻。
- 將磁盤分區(qū)并(使用 cloudbase-init)調(diào)整引導(dǎo)磁盤上的根分區(qū)大小。
- 處理用戶數(shù)據(jù)和其他元數(shù)據(jù)(使用 cloudbase-init)。
- 啟用 Windows System Preparation (Sysprep) 工具,以自定義來賓操作系統(tǒng)。
對于大多數(shù)私有云用例,本列表中的***兩個要求是可選的。而且您可以手動或使用腳本將磁盤分區(qū),并調(diào)整引導(dǎo)磁盤上的根分區(qū)大小。但必須安裝一個 VirtIO 驅(qū)動程序,Windows 映像才能在 OpenStack 云中工作。此外,您需要擁有 VirtIO-Win 驅(qū)動程序包。
滿足***要求后,構(gòu)建 Windows 映像的過程是:
- 使用一個 Internet Drive Electronics (IDE) 磁盤和一個 AMD PCnet32 或 Realtek rt8139 網(wǎng)絡(luò)接口卡 (NIC) 創(chuàng)建一個虛擬機。
- 安裝操作系統(tǒng)。
- 配置操作系統(tǒng)以滿足您自己的要求(例如通過安裝所需的中間件),或者安裝 cloudbase-init 或等效的腳本來滿足 OpenStack 要求。
- 關(guān)閉虛擬機。
- 添加一個小 VirtIO 磁盤和一個 VirtIO NIC。
- 啟動虛擬機并安裝 VirtIO 磁盤和 NIC 的 VirtIO 驅(qū)動程序。
- 重新啟動虛擬機,檢查操作系統(tǒng),然后關(guān)閉虛擬機。
- 將映像上傳到 OpenStack 映像服務(wù)并驗證該映像。
也可執(zhí)行以下步驟:
1.創(chuàng)建一個包含以下部分的虛擬機:
- 一個 VirtIO 磁盤
- 一個 PCnet32 或 rt8139 NIC
- 一個額外的 CD-ROM,包含用于比 Windows Vista 或 Windows Server 2008 更高版本的 Windows 的 VirtIO 磁盤驅(qū)動程序,或者一個額外的軟盤,包含用于比 Windows server 2003 R2 更低版本的 Windows 的 VirtIO 磁盤驅(qū)動程序
2.在操作系統(tǒng)中安裝所需的 VirtIO 磁盤驅(qū)動程序。
3.配置操作系統(tǒng),以滿足您自己的要求(例如通過安裝所需的中間件),或者安裝 cloudbase-init 或運行等效的腳本來滿足 OpenStack 的要求。
4.關(guān)閉虛擬機。
5.添加一個 VirtIO NIC。
6.啟動虛擬機并安裝 VirtIO NIC 的 VirtIO 驅(qū)動程序。
7.重新啟動虛擬機,檢查操作系統(tǒng),然后關(guān)閉虛擬機。
8.將映像上傳到 OpenStack 映像服務(wù)并驗證該映像。
不足
盡管目前為 OpenStack 創(chuàng)建映像的方法有一些好處(如創(chuàng)建基于 Linux 的映像的開源工具的廣泛可用性),但該方法并不容易。創(chuàng)建基于 Windows 的映像看起來可能比創(chuàng)建 Linux 映像簡單一些,因為不需要使用 guestfish 等工具修改映像。但目前還沒有自動化工具來為 OpenStack 創(chuàng)建全功能的 Windows 映像,所以最終用戶或操作人員還必須手動創(chuàng)建它們。如果一個全球化團隊的測試人員或開發(fā)人員需要 Windows 映像,這些映像必須有不同的語言版本 — 而且團隊可能使用數(shù)十種語言。云操作人員準(zhǔn)備所有請求的語言版本的 Windows 映像,這是不可能完成的任務(wù)。
為私有云創(chuàng)建 Linux 和 Windows 映像對最終用戶而言是一個耗時的工作 — 甚至對經(jīng)驗豐富的云操作人員也是如此。而且,組織可能缺乏資源讓最終用戶創(chuàng)建映像 — 例如,創(chuàng)建 Linux 映像所需的額外 KVM/QEMU 虛擬機管理程序。在這種情況下,創(chuàng)建最終用戶請求的所有映像,對云操作人員而言是一項艱巨的任務(wù)。
***,需要將新映像上傳到 OpenStack 映像服務(wù),根據(jù)映像來源與 OpenStack 映像服務(wù)之間的網(wǎng)絡(luò)性能,這個過程可能要花很長的時間。出于相同的原因,反復(fù)驗證新映像也可能會花很長的時間。
#p#
新的 OpenStack 映像創(chuàng)建方法
如果啟用了 OpenStack 的用戶要在線創(chuàng)建映像,創(chuàng)建能滿足其需求的映像要容易得多。我們提出了一種新的映像創(chuàng)建方法,其中用戶通過云服務(wù)所提供的 OpenStack 儀表板在線創(chuàng)建新映像。借助此功能,最終用戶無需額外的虛擬機管理程序,不需要自行將映像上傳到 OpenStack 映像服務(wù)。他們所需的只是操作系統(tǒng)安裝 CD/DVD ISO 映像文件。
概念設(shè)計
在概念上,為 OpenStack 創(chuàng)建一個新映像的理想過程是,最終用戶:
- 將操作系統(tǒng)安裝 CD/DVD ISO 映像文件上傳到 OpenStack 映像服務(wù)。
- 通過已上傳的 ISO 映像啟動一個新實例。
- 通過 OpenStack 儀表板中的 Virtual Networking Computing (VNC)/Simple Protocol for Independent Computing Environments (SPICE) 控制臺安裝操作系統(tǒng)。
- 執(zhí)行特殊需要所要求的必要配置并安裝所需的軟件包。
- 手動或運行服務(wù)操作人員提供的腳本來執(zhí)行 OpenStack 所要求的修改 — 例如,安裝 cloud-init、獲取公共 SSH 密鑰、啟用 SSHD 遠程登錄/RDP 等的腳本。
- 創(chuàng)建實例的快照。
- 根據(jù)需要在快照上運行 glance image-update 命令,將快照轉(zhuǎn)換為映像并添加其他元數(shù)據(jù)。
前提條件
必須滿足一些條件才能確保新的映像創(chuàng)建方法取得成功:
- 一個可供所有最終用戶使用的有效儀表板或 Web UI。
- VNC 代理或 SPICE 代理運行正常且可用于所有最終用戶。
- 一個 cloud-init 或等效的腳本工具存儲庫可供所有最終用戶使用。
- OpenStack 映像服務(wù)中擁有 VirtIO-win 驅(qū)動程序的一個 ISO 映像可供所有最終用戶使用。
下面我們演示新方法的可行性。
#p#
可行性分析
該新方法最重要的兩個方面是:如何支持 ISO 映像以及如何為從 ISO 映像啟動的實例組裝塊設(shè)備。
目前對 ISO 映像的支持
OpenStack 支持 ISO 映像。也支持從 ISO 映像啟動實例。但是,將來賓操作系統(tǒng)從 ISO 映像安裝到從 ISO 映像啟動的實例中,對此并未提供良好的支持。要想成功安裝,必須滿足一些嚴(yán)格的條件:
- ISO 映像中的來賓操作系統(tǒng)必須默認(rèn)已啟用 VirtIO 設(shè)備驅(qū)動程序。
- 必須設(shè)置臨時磁盤風(fēng)格,它的大小必須滿足來賓操作系統(tǒng)的要求。
- 儀表板和 OpenStack novncproxy 服務(wù)器必須在正常運行。
如果所有這些條件都已滿足,即可從 ISO 映像成功地將來賓操作系統(tǒng)安裝到從這個 ISO 映像啟動的實例的臨時磁盤上。當(dāng)然,在來賓操作系統(tǒng)上也可像使用其他實例一樣工作。但是,由于 OpenStack 中目前的實例快照機制,您無法成功地將實例轉(zhuǎn)換為實例快照或映像。實例快照將僅包含實例的根磁盤。其他塊設(shè)備(包括臨時磁盤和卷)將被忽略。
實例塊設(shè)備目前的組裝工作流
圖 1 顯示了在從 ISO 映像引導(dǎo)一個 KVM/QEMU 實例時,OpenStack Nova 中塊設(shè)備的組裝工作流。
圖 1. 組裝塊設(shè)備的現(xiàn)有工作流
在圖 1 中的工作流中:
- Nova 從 Glance 獲取 ISO 映像并將它設(shè)置為一個虛擬機實例的根磁盤,以 CD-ROM 作為設(shè)備類型,IDE 作為總線類型。
- Nova 創(chuàng)建一個臨時磁盤并將它設(shè)置為虛擬機實例的第二個磁盤,以 disk 作為設(shè)備類型,VirtIO 作為總線類型。但只有在所設(shè)置的臨時磁盤大小符合實例的風(fēng)格時,這一步才能完成。
- 用戶將來賓操作系統(tǒng)從根磁盤(實例的 CD-ROM)安裝到臨時磁盤(實例的第二個磁盤)并通過 VNC 逐步配置它。
- 用戶從這個虛擬機實例創(chuàng)建一個快照,Nova 將快照保存到 glance 服務(wù)。
此工作流似乎適合從頭創(chuàng)建一個新虛擬機映像。但您獲得的是最初的 ISO 映像的副本。原因是快照中僅包含根磁盤(實例的***個塊設(shè)備,如果從 ISO 映像啟動,實際上是實例的 CD-ROM),臨時磁盤已被忽略。所以,在目前的 OpenStack 中,您可從 ISO 映像啟動實例,也可將 ISO 映像中的操作系統(tǒng)安裝到已配置臨時磁盤且已啟動的實例中,但不能創(chuàng)建已安裝了操作系統(tǒng)的臨時磁盤的快照。要解決此問題,需要調(diào)整實例的各個塊設(shè)備的組裝工作流。
新的組裝工作流
您可以更改塊設(shè)備組裝流程,創(chuàng)建一個臨時磁盤,其大小設(shè)置適當(dāng)且一定會設(shè)置為從 ISO 映像啟動的各個實例的根磁盤。更改之后,實例快照中包含的根磁盤將是已安裝了操作系統(tǒng)的臨時磁盤 — 完全滿足您的要求。
圖 2 顯示了在對 libvirt 驅(qū)動程序進行修改(將在本文的 概念證明 一節(jié)中介紹)后,您從一個 ISO 映像啟動一個實例時塊設(shè)備的組裝工作流。
圖 2. 修改后的塊設(shè)備組裝工作流
下面是在從 ISO 映像啟動實例時,修改塊設(shè)備組裝工作流的過程:
- Nova 創(chuàng)建一個虛擬機磁盤文件并將它設(shè)置為虛擬機實例的根磁盤。設(shè)備總線默認(rèn)設(shè)置為 VirtIO。
- Nova 從 Glance 獲取來賓操作系統(tǒng)的 ISO 映像并將它設(shè)置為第二個磁盤設(shè)備,這是一個 CD-ROM。
- Nova 從 Glance 獲取 VirtIO 驅(qū)動程序的一個 ISO 映像并將它設(shè)置為第三個磁盤設(shè)備,這是另一個 CD-ROM。
- 用戶從第二個磁盤設(shè)備(***個 CD-ROM)安裝來賓操作系統(tǒng)并根據(jù)需要配置它。
- 如果 VirtIO 驅(qū)動程序默認(rèn)未包含在來賓操作系統(tǒng)中,會使用第三個磁盤設(shè)備(第二個 CD-ROM)安裝來賓操作系統(tǒng)的 VirtIO 驅(qū)動程序。
- 用戶創(chuàng)建該實例的一個快照,Nova 將它保存到 Glance 服務(wù)。
目前對 ISO 映像的支持 中已介紹,實例快照僅包含實例的根磁盤,無論根磁盤的類型是什么都是如此。使用修改后的組裝工作流,根磁盤是 Nova 創(chuàng)建的一個新磁盤文件,包含從作為操作系統(tǒng)映像的 CD-ROM(實例的第二個磁盤)所安裝的來賓操作系統(tǒng)。
正如我們所構(gòu)想的,結(jié)果是一個從操作系統(tǒng) ISO 映像安裝的新實例的實例快照 — 而不是最初的 ISO 映像的副本。
#p#
概念證明
要確保新的映像創(chuàng)建方法符合我們的設(shè)計目的,我們對 Nova 的代碼進行了一些修改 — 主要修改了 libvirt 驅(qū)動程序。請參見 下載 獲取相關(guān)代碼。我們修改的 python 模塊是 libvirt/driver.py 和 libvirt/blockinfo.py。這些文件中的注釋標(biāo)識了我們所修改的類方法和實例。
我們用于概念證明的環(huán)境包含:
硬件:
- 2U 機架服務(wù)器
- 2 個 4 核 Xeon 處理器
- 12 個 8GB RAM
- 4 個 900GB SAS 硬盤且配置了 RAID10
- 4 個 1Gps 以太網(wǎng)卡
軟件:
- Red Hat Enterprise Linux 6 update 4 作為虛擬機管理程序
- RDO Grizzly 版本
我們在 RDO Grizzly 獨立環(huán)境、RDO Grizzly 的多節(jié)點安裝環(huán)境和官方 OpenStack Grizzly 版本上測試了修改后的代碼。
#p#
測試和結(jié)果
本節(jié)介紹了我們?yōu)槭褂眯路椒▌?chuàng)建虛擬機映像而修改的 Nova 代碼,執(zhí)行的簡單測試過程以及一些測試示例。
測試過程
- 為 Glance 創(chuàng)建操作系統(tǒng) ISO 映像。
- 檢查現(xiàn)有的風(fēng)格,確保根磁盤大小滿足您的要求。如果沒有適用的風(fēng)格,可創(chuàng)建一種新風(fēng)格。
- 使用適用的風(fēng)格,從這個操作系統(tǒng) ISO 映像啟動一個實例。
- 實例啟動后,按照屏幕上的安裝步驟,通過儀表板所提供的 VNC 控制臺完成操作系統(tǒng)的安裝工作。
- 根據(jù)需要安裝應(yīng)用程序并根據(jù) OpenStack 的需要配置操作系統(tǒng),例如安裝 cloud-init 或等效的腳本,啟用 SSHD 遠程登錄/RDP 服務(wù)等。
- 創(chuàng)建這個新安裝實例的一個實例快照。
- 運行 glance image-update,或者如果儀表板提供了相關(guān)的功能,從儀表板更新快照信息,將映像類型改為 image。
測試結(jié)果
修改 libvirt 驅(qū)動程序后,從 ISO 映像啟動的實例的塊設(shè)備如清單 1 所示。
清單 1. 從 ISO 映像啟動的實例的塊設(shè)備映射
- <disk type='file' device='disk'>
- <driver name='qemu' type='qcow2' cache='none'/>
- <source file='/var/lib/nova/instances/290124e3-a267-4223-bd69-661fac2035eb/disk.newos'/>
- <target dev='vda' bus='virtio'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
- </disk>
- <disk type='file' device='cdrom'>
- <driver name='qemu' type='qcow2' cache='none'/>
- <source file='/var/lib/nova/instances/290124e3-a267-4223-bd69-661fac2035eb/disk'/>
- <target dev='hda' bus='ide'/>
- <readonly/>
- <address type='drive' controller='0' bus='0' target='0' unit='0'/>
- </disk>
- <disk type='file' device='cdrom'>
- <driver name='qemu' type='qcow2' cache='none'/>
- <source file='/var/lib/nova/instances/290124e3-a267-4223-bd69-661fac2035eb/disk.virtio'/>
- <target dev='hdb' bus='ide'/>
- <readonly/>
- <address type='drive' controller='0' bus='0' target='0' unit='1'/>
- </disk>
表 1 顯示了幾種主流操作系統(tǒng)的測試結(jié)果。
表 1. 測試結(jié)果
#p#
結(jié)束語
我們新的映像創(chuàng)建方法的優(yōu)點包括:
- 可輕松為 OpenStack 創(chuàng)建新映像。
- 可輕松驗證新創(chuàng)建的映像。
- 為所有最終用戶提供了一種自助服務(wù)機制。
缺點包括:
- 映像可能無法支持全部功能 — 具體來講,分區(qū)磁盤和調(diào)整引導(dǎo)磁盤上根分區(qū)的大小。
- 不支持早于 Windows Server 2003 R2 的 Windows 版本。(但如果通過支持舊 Windows 版本的軟盤驅(qū)動程序來創(chuàng)建更復(fù)雜的組裝工作流,也可支持這些版本。)
- 不支持缺少 VirtIO 設(shè)備驅(qū)動程序支持的舊 Linux 版本。
目前為止,大多數(shù)基于 OpenStack 的公共 IaaS 云服務(wù)都提供在基礎(chǔ)映像中具有固定根磁盤大小的實例,以及 — 通過卷服務(wù) — 為實例提供額外的磁盤空間。在私有云中,實例的大部分需求主要與所安裝的中間件、來賓操作系統(tǒng)的主要版本/次要版本、實例風(fēng)格等相關(guān)。與公共云服務(wù)中一樣,可通過提供固定的平均根磁盤大小和足夠的卷來滿足磁盤大小要求。所以,分區(qū)磁盤和調(diào)整引導(dǎo)磁盤上根分區(qū)大小的功能對大多數(shù)私有云而言不是必需的。
OpenStack 已成長為一種適合開源云操作系統(tǒng)的全球流行平臺。它使各種各樣的云解決方案易于實施、可大規(guī)模擴展且包含豐富的功能。我們在本文中介紹的工作證明,可以基于 OpenStack 平臺來實現(xiàn)新功能 — 而且 OpenStack 是一個開放且靈活的框架,而不僅僅是一個軟件產(chǎn)品。