VMware虛擬磁盤編程指導(六)

6 實際編程任務

本章介紹在示例程序中沒有提到的實際編程任務,包括:

  • 病毒特徵掃描

  • 創建虛擬磁盤

  • 處理虛擬磁盤數據

  • 管理子磁盤

  • RDM磁盤和虛擬的BIOS

  • VMware vSphere交互

病毒特徵掃描

虛擬磁盤庫用例中的一項任務就是針對VDDK進行病毒特徵掃描。使用示例程序的框架,可以實現一個-virus命令行選項。示例6-1中的函數依賴一個已存在的庫函數SecureVirusScan(),通常由防病毒軟件廠商提供。像針對Email信息一樣,這個庫函數會掃描任意大小的緩存,以匹配廠商的最新病毒庫,如果找到了病毒就會返回TRUE

                             wKiom1POBKPQicAJAAFOlWhdWlc756.jpg

函數調用VixDiskLib_GetInfo()來獲取磁盤中分配的扇區的個數。扇區個數存放在VixDiskLibDiskInfnoo結構中,但通常不在元數據中。如果是SPARSE類型的佈局,數據可能存放在任何扇區上,所以這個函數讀取所有扇區,不論是否填充了數據。VixDiskLib_Read()函數在遇到全是0的空扇區時會繼續讀取而不返回錯誤。

下面給出了在vixDiskLibSample.cpp中加入-virus選項,需要添加的剩餘代碼:

wKioL1POCDmhEqqGAAB1Zag1oaE030.jpg

創建虛擬磁盤

這一節將討論本地VMDK文件的類型,以及如何創建遠程ESX/ESXi主機上的虛擬磁盤。

創建本地磁盤

5章中的示例程序中創建了類型爲單片稀疏型的虛擬磁盤,即非提前分配的大文件。這是默認的類型,因爲現代的文件系統,尤其是NTFS,支持大於2GB的文件,且可以存儲大於2GB的數據。在一些舊的文件系統中,如MS-DOS和早期WindowsFAT16,或者用於CDISO9660,或者NFS2,以及Linux內核2.4,不支持這種特性,每個卷只能限制爲2GB大小。FATFAT32NT3.51中擴展了可支持4GB文件。

但是,分割的虛擬磁盤可能比單片的虛擬磁盤更安全,因爲如果底層主機文件系統發生故障,一些數據可以從未被損壞的2GB擴展中恢復出來。VMware產品盡力修復損壞的VMDK文件,但是分卷的VMDK文件增加了修復中獲得數據的機會。缺點是分卷問加你增加了負載(更多的文件描述符),並增加了管理複雜性。

如果遇到FAT16或早期的Linux文件系統,你可以創建SPLIT_SPARSE虛擬磁盤。這個改變是簡單的:下面粗線加亮的部分。示例程序可以進行擴展以提供這樣的選項。

wKiom1POB3SBgbOLAAC8b81QBZs909.jpg

注意:你可以將VMDK文件的分卷大小設置爲小於2GB,但是創建的文件名稱依然遵從表3-1所示的規則。

針對DoCrate()的一行改變,將創建200MB的分卷VMDK文件,除非你通過-cap選項指定其他大小。

創建遠程磁盤

VixDiskLib_Create()不支持創建託管磁盤。爲了在遠程ESX/ESXi主機上創建託管磁盤,首先要在本地工作站上創建一個本地磁盤,然後使用VixDiskLib_Clone()經過網絡將本地磁盤轉換爲託管磁盤。

要使用示例程序創建遠程託管磁盤,使用如下命令:

vix-disklib-sample–create –cap 1000000 virtdisk.vmdk

vix-disklib-sample–clone virtdisk.vmdk –host esx3i –user root –password secret vmfsdisk.vmdk

可以編寫一個虛擬機應用程序來執行如下操作:

1使用VixDiskLib_Create()創建一個2GB大小的本地VMDK磁盤。

2使用VixDiskLib_Write()將客戶機系統的鏡像和應用軟件寫入VMDK

3將本地的VMDK磁盤克隆島ESX/ESXi主機的VMFS文件系統上。

vixError= VixDiskLib_Clone(appGlobals.connection, appGlobals.diskPath, srcConnection,appGlobals.srcPath, &createParam, CloneProgressFunc, NULL, TRUE);

在這個調用中,appGlloobals.connectionappGlobals.diskPath表示ESX/ESXi主機上的遠程VMDK,而srcConectionappGlobals.srcPath表示本地VMDK

4打開新的客戶機系統,得到一個新的虛擬機。

在工作站上,VIX API中的VixVMPowerOn()函數實現這個功能。對於ESX/ESXi主機及,必須使用PowerOnVM_Task方法。使用這個方法的簡單方式在VMware vSphere Perl開發包中,它包含PowerOnVM_Task()(非阻塞)PowerOnVM()(同步)調用。

5ESX/ESXi主機上發佈新的虛擬機。

注意:無論在步驟1中創建什麼類型的虛擬文件,在步驟3中它都將變成VIXDISKLIB_DISK_VMFS_FLAT類型。

處理虛擬磁盤數據

虛擬磁盤庫按扇區讀、寫數據,不提供接口對字符或字節的I/O操作。

讀、寫本地磁盤

下面的代碼從VMDK文件中讀取一次讀取一個扇區,如果找到包含“VmWare”的字符串,使用“VMware”替換它,並寫回VMDK文件。

wKiom1POB7TyRvAmAAD0HsxUHZM406.jpg

讀寫遠程磁盤

讀寫ESX/ESXi主機上遠程託管磁盤的DoEdit()函數是類似的,但是在之前你必須使用認證憑據調用VixDiskLib_Connect()函數,而不是傳入NULL參數。

wKioL1POCP3CafctAADMGqclEPQ781.jpg

刪除磁盤(UnLink)

VixDiskLib_Unlink()函數扇區虛擬磁盤文件。它有兩個參數:連接和VMDK文件名稱。

vixError= VixDiskLib_Unlink(appGlobals.connection, appGlobals.diskPath);

刪除虛擬磁盤的影響

刪除一個VMDK後,它包含的所有信息都將丟失。大多數情況下,如果虛擬機正在運行,宿主操作系統將會阻止你刪除文件。然而,如果你刪除一個關機的虛擬機的VMDK文件,這個客戶系統將無法啓動。

修改磁盤名稱

VixDiskLib_Rename()函數對虛擬磁盤進行重命名,它有兩參數:舊的和新的VMDK文件名稱。

vixError= VixDiskLib_Rename(oldGlobals.diskpath, newGlobals.diskpath);

重命名虛擬磁盤的影響

服務器希望客戶機虛擬機系統的VMDK文件存放在一個可預見的位置。在重命名期間的任何文件訪問都有可能造成I/O失敗,或導致客戶系統故障。

處理磁盤元數據

ESX/ESXi主機上VMFS文件系統上,磁盤元數據項很重要,因爲它們存儲了關於所包含的文件系統的磁盤映射和交互的信息。

處理子磁盤

在虛擬磁盤API中,重寫日誌由父-子磁盤鏈進行管理,每一個孩子成爲從開始時磁盤改變的重寫日誌。創建一個子磁盤後,再嘗試寫父磁盤將會出錯,庫要求寫子磁盤。

創建重寫日誌

通過創建一個虛擬機快照可生成一個重寫日誌,這個快照包含磁盤數據和虛擬機狀態。僅僅在本地磁盤上,可以不需要創建虛擬機快照,而通過VixDiskLib_CreateChild()創建一個重寫日誌。

你可以寫一個簡單的應用程序在晚上3:00創建一個重寫日誌,或者託管磁盤的快照(儘管多個快照會影響性能)。當你在虛擬機正在運行時創建一個快照時,VMware主機會重新組織文件指針,主VMDK持續跟蹤磁盤鏈中重寫日誌(the VMware host re-arranges filepointers so the primary VMDK, <vmname>.vmdk for example, keep track ofredo logs in the disk chain)。使用這個磁盤鏈,可以重新創建任何一天的數據。

重新創建給定時間的數據

1找到對應日期的<vmname>-<NNN>.vmdk重寫日誌。<NNN>是一個序列號。你可以通過時間戳來標識重寫日誌或快照。

2初始化虛擬磁盤庫,打開重寫日誌,並得到它的父句柄。

3使用VixDiskLib_Create()創建一個子磁盤,然後附加到父磁盤上:

    vixError =VixDiskLib_Attach(parent.Handle(), child.Handle());

4讀、寫附加的子虛擬磁盤。

這僅僅是一個例子。在託管磁盤上,考慮到性能因素,不建議創建多個虛擬機快照。vSphere備份軟件創建一個快照,保存數據,然後刪除快照。

快照中的虛擬磁盤

虛擬磁盤API提供以下功能來處理快照中的磁盤組件:

  • 在磁盤鏈中附加一個子磁盤

  • 只讀打開虛擬磁盤

  • 通過VMware vCenter打開ESX/ESXi主機上的快照磁盤

Windows2000只讀文件系統

父子磁盤鏈的另外一個用處是爲Windows2000提供只讀的訪問,因爲Windows2000不能掛載一個只讀的文件系統。在途6-1中,灰色的圓圈表示一個必須保持只讀狀態的虛擬磁盤,因爲它有孩子節點。在這個例子中,你需要Windows2000使用這個磁盤,而不是使用新的C1C2.創建一個新的子磁盤R0,並附加到灰色的虛擬磁盤上,並掛載R0作爲Windows2000客戶機系統的只讀虛擬磁盤。

wKiom1POCDGhRegCAAB571HTap0943.jpg

RDM磁盤和虛擬BIOS

本節描述一個低級的程序來還原原始設備映射(RDM)磁盤以及NVRAM

還原RDM磁盤

備份和還原RDM磁盤遇到了不尋常的挑戰。原來的RDM配置備份並不適用,並且可能是不恰當的,如果用戶還原:

  • 虛擬機到不同的主機或數據庫。

  • 一個已刪除的虛擬機,它原來的映射RDM同樣被刪除了,或者包含的LUN被重寫。

  • RDM到不同的虛擬機,儘管虛擬機在相同的主機和數據存儲上。用戶需要訪問磁盤文件,或者測試還原。

當針對RDM磁盤執行一次代理備份時,你必須對ESXi主機和代理服務器呈現相同的LUN ID(這個限制並不適用於VMFS限制,因爲虛擬磁盤庫讀取VMFS頭部並匹配UUID。但RDM需要主機和代理有相同的LUN ID)

如果原始虛擬機的VMX文件盒磁盤映射不再可用,而包含RDMLUN仍然可用,還原RDM磁盤就是適當的。在這種情況下,LUN上的RDM應該仍然有效,所以它不需要還原。這樣的話,在還原過程中就不需要修改RDM配置。否則,按兩步進行完全還原:

  • 還原虛擬機配置(VMX)以及系統磁盤。這會還原虛擬機,但不還原RDM

  • RDM磁盤添加到虛擬機。之後,就可以在RDM磁盤上完成正常的還原操作。

另外,可以創建一個虛擬機包含RDM磁盤,並訪問它的內容。創建虛擬機後,從備份中還原虛擬機配置(VMX),然後還原任何選擇的磁盤。

還原虛擬BIOSUEFI

虛擬機的BIOSUEFI配置信息保存在.nvram文件中。通常該文件中唯一重要的是啓動磁盤設置和啓動順序(多虛擬磁盤時)

在新發布的vSphere中可以使用擴展的屬性設置來改變啓動順序,所以啓動順序不再必須保存在.nvram文件中。然而一些用戶想要保留虛擬機的串口設置或其他項目,所以應用程序還是應該備份和還原這些信息。

備份和還原NVRAM

1對每一個虛擬機,生成.nvram文件的一個單獨拷貝。

2使用標準方法備份每個虛擬機。

3如果需要,使用標準方法還原虛擬機。

4使用保存的原始的.nvram文件副本覆蓋虛擬機的.nvram文件。

重要VMware現在建議將.nvram文件作爲虛擬機備份的一部分保存起來,這是從vSphere4.1開始的變化。

VMware vSphere交互

本節講述其他vSphere編程接口。

VIX API

VIXAPI是一個針對VMware工作站,其他主機產品以及ESX/ESXi的流行、簡單易用的開發者接口。查看VMware開發者文檔獲取關於VIX API的信息:

http://www.vmware.com/support/developer/vix-api

VIXAPI手冊包含C++PerlMicrosoft C# COMVBScript以及Visual Basic的使用參考。大部分都包含有用的代碼示例。另外,vix-apiWeb手冊中包含的示例有開機、關機,停止虛擬機,創建快照,客戶系統操作,虛擬機發現,異步調用。

所有本地磁盤的病毒掃描

假設你要針對VMware工作站上的所有虛擬機進行病毒掃描,這裏有一個基於VIX的高層的算法,可以掃描所有虛擬機的本地磁盤。

針對所有虛擬磁盤進行病毒掃描

1編寫一個包含虛擬磁盤APIVIX API的應用程序。

2使用VixDiskLib_Init()初始化虛擬磁盤庫。

3使用VixHost_Connect()連接VIX到工作站主機。

4使用VIX_FIND_RUNNING_VMS作爲查找類型(第二個參數)調用VixHost_FindItems()。這會通過回調函數(第五個參數)返回每個虛擬機的名稱。要獲得每個虛擬機的磁盤,可以再虛擬機名稱後加“.vmdk”後綴。

5編寫一個回調函數來打開虛擬機的VMDK。你的回調函數必須和VixDiscoveryProc()回調函數類似,它出現在VIX API參考手冊中VixHost_FindItems()頁的示例程序中。

6使用“病毒特徵掃描”一節中的DoVirusScan()函數替換回調函數中的打印虛擬機名稱部分。

7處理病毒掃描定位到的任何感染的扇區。

vSphere Web Services API

VMwarevSphere Web Services (WS) API是一個針對ESX/ESXi主機和vCenter服務器的開發者接口。查看開發者文檔以獲取更多關於vSphere WS API的信息:

http://www.vmware.com/support/developer/vc-sdk

VMwarevSphere WS SDK的開發者安裝手冊中,有一章描述瞭如何建立Microsoft C#Java的開發環境。一些信息同樣適用於C++

vSphere的編程手冊包含的一些示例代碼是用C#編寫的,但是大部分的示例都是用Java寫的,並且給予JAX-WS開發框架。

ESX/ESXi主機和VMware vSphere WS接口使用一種基於Web服務的編程模型。客戶端生成Web服務描述語言(WSDL)請求,通過簡單對象訪問協議(SOAP)封裝成XML消息,傳遞到網絡上。在ESX/ESXi主機或vCenter服務器上,vSphere層應答客戶端的請求,通常還會返回SOAP響應。這是同C++VIX API的面向對象的函數調用不同的一種編程模型。

所有託管磁盤的病毒掃描

假設你想要對ESX/ESXi主機上的所有虛擬機進行病毒掃描,這裏的VMware vSphere解決方案的高層算法,能夠掃描所有虛擬機的託管磁盤。

掃描所有託管磁盤

1使用VMware vSphere Perl工具包,編寫Perl腳本,連接到指定的ESX/ESXi主機上。

2調用Vim::find_entity_views()找到每個虛擬機的清單(inventory)

3調用Vim::get_inventory_path()獲得在相應資源中的虛擬磁盤名稱。VMDK的文件名稱可以通過GuestDiskInfo數據對象的diskPath屬性獲得。

4使用Perlsystem(@cmd)調用,運行擴展的vixDiskLibSample.exe程序,並使用-virus選項。對於ESX/ESXi主機,還需要提供-host-user-password參數。

5清除所有被標記爲病毒感染的扇區。

使用vSphere WS API讀寫VMDK

VMwarevSphere API 2.5及以後版本中,包含了一些有用的方法來管理VMDK文件。可以查看VirtualDiskManager託管對象類型,它包含十多種類似於虛擬磁盤API的方法。

如果你有興趣,打開Web上的VMware InfrastructureSDK,點擊“VI API ReferenceGuide 2.5版,或者“VMware vSphere WS APIReference Guide4.0版,點擊“All Typeset”,查找VirtualDiskManager

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