3 虛擬磁盤接口
VMWare提供磁盤佈局選項,這裏將要討論動態庫中封裝的數據結構。
VMDK文件位置
在ESX/ESXi主機上,虛擬機磁盤(VMDK)文件通常存放在共享存儲設備的某個/vmfs/volumes中。在vSphere Client上,可以從主機和簇的庫中查看存儲卷,它們的名字通常是datastore1,datastore2。如果要查看VMDK文件,選擇通用(Summary)>資源(Resources)> 數據存儲(Datastore),右鍵點擊“瀏覽數據存儲(Browse Datastore)”,然後選擇一個虛擬機。
對於工作站(VMWare Workstation),VMDK文件存在和虛擬機配置(VMX)文件相同的目錄下,例如Linux系統中的“/path/to/disk”,或者Windows系統中的“C:\My Documents\My VirtualMachines”。
VMDK文件作爲虛擬機的物理磁盤,大部分內容都存儲了虛擬機的數據,僅有一小部分用於VMDK文件的本身開銷。
虛擬磁盤類型
在虛擬磁盤庫中定義瞭如下這些磁盤類型:
單片稀疏型 VIXDISKLIB_DISK_MONOLITHIC_SPARSE只包含一個虛擬磁盤文件並能夠動態擴展的虛擬磁盤。這是主機磁盤(hosted disk)的默認類型,在第五章中的例子中也只用到這種類型。
單片平面型 VIXDISKLIB_DISK_MONOLITHIC_FLAT只包含一個虛擬磁盤文件,提前分配存儲空間的虛擬磁盤。創建這種磁盤需要較多的時間,並佔用大量空間,但是可能會提供比稀疏型磁盤更好的性能。
分片稀疏型 VIXDISKLIB_DISK_SPLIT_SPARSE可擴展的虛擬磁盤,整個磁盤被分爲多個2GB大小的關聯文件。這些文件可以增大到2GB,然後在新的文件中繼續擴展。這種類型可以在老的文件系統上使用。
分片平面型 VIXDISKLIB_DISK_SPLIT_FLAT提前分配空間的虛擬磁盤,並被分爲多個大小爲2GB的虛擬磁盤文件。這些從2GB開始,所以創建它們需要較長的時間,但是可以以2GB持續增長。
VMFS平面型VIXDISKLIB_DISK_VMFS_FLAT提前分配空間的虛擬磁盤,在ESX3或更新的平臺上可用,也叫做厚型磁盤(thick disk),是一種管理磁盤(managed disk)。
VMFS稀疏型VIXDISKLIB_DISK_VMFS_SPARSE使用一種寫時複製(copy-on-write, COW)機制來節省存儲空間。
VMFS精簡型VIXDISKLIB_DISK_VMFS_THIN這種類型假設需要儘可能多的空間,然後以此來擴展虛擬磁盤的大小。能夠在ESX3以及更新的平臺上使用,VDDK 1.1或更新的版本中支持,建議使用高版本的VDDK。
單片流優化 VIXDISKLIB_DISK_STREAM_OPTIMIZED單片、稀疏格式對數據流進行壓縮。這種格式不支持隨機讀寫。
持久化(Persistence)磁盤模式
在持久化磁盤模式中,數據將直接並永久地寫入虛擬磁盤,儘管重新開機啓動,數據還是會存儲在虛擬磁盤中。
在非持久化(nonpersistent)模式下,對虛擬磁盤的任何修改,都將在虛擬機關機後失效。VMDK文件將恢復到原來的狀態。
虛擬磁盤庫中並沒有封裝這種區別,它是一個虛擬機的設置。
VMDK文件命名
表3-1展示了不同的虛擬磁盤類型。第一列關於“虛擬磁盤類型”,但是不包括VIXDISKLIB_DISK前綴。第三列給出了在工作站和ESX/ESXi主機上可能的VMDK文件名稱。
表3-1. VMDK虛擬磁盤文件
API中的磁盤類型 | VMWare主機創建虛擬磁盤 | 主機上名稱 |
MONOLITHIC_SPARSE | 在“選擇磁盤類型”時,選擇默認設置,不勾選任何選項,創建一個可根據需要空間大小動態增長的VMDK文件。<vmname>表示虛擬機的名稱。在VMFS分區上,這是磁盤描述文件的名稱。 | <vmname>.vmdk |
MONOLITHIC_FLAT VMFS_FLAT VMFS_THIN | 如果勾選了“立即分配磁盤空間”,虛擬磁盤文件將會提前分配所有空間,不會動態增長。第一個VMDK文件很小,並指向一個大的文件,它的名稱包含“flat”,但是沒有數字序號。 同樣在VMFS分區上,這個虛擬磁盤文件指向了虛擬磁盤數據文件,thick或thin類型。 | <vmname>-flat.vmdk |
SPLIT_SPARSE | 如果只勾選“分割成2GB大小的文件”,虛擬磁盤文件將會在需要更多空間時擴展。第一個VMDK文件很小,並指向一系列的其他VMDK文件,它們在序號數字前都有一個S標誌,表明是稀疏類型的(sparse)。VMDK文件的數字依賴於所需要的磁盤大小。隨着數據增長,將會在這個序列中新增更多的VMDK文件。 | <vmname>-s<###>.vmdk |
SPLIT_FLAT | 如果勾選”立即分配磁盤空間”和“將磁盤分成2GB大小的文件”兩個選項,那麼虛擬磁盤空間將會提前分配,不會動態擴展。第一個VMDK是一個小文件,指向一系列的其他文件,這些文件在數字序號之前都有一個f前綴,表示flat。數字有磁盤大小決定。 | <vmname>-f<###>.vmdk |
MONOLITHIC_SPARSE或者SPLIT_SPARSE的快照 | 當給虛擬機創建快照時,會生成回寫日誌,也叫做子磁盤(child disk)或者差異鏈接(delta link)。快照文件中有序號數字,但是沒有f或s前綴。針對原來的父磁盤或者更早的回寫日誌(即更早的快照)的數據修改,將會寫進這些帶編號的的VMDK文件中。 | <diskname>-<###>.vmdk |
SE_SPARSE | 有效利用空間的稀疏(seSparse)文件格式。在vShpere 5.1或更新版本的VMWare View中用於模板克隆。 | |
n/a | 虛擬機的快照,包含了指向所有VMDK文件的信息。 | <vnname>Snapshot.vmsn |
對於惰性清零平面磁盤(lazy zeroed thick disk),所有的塊被提前分配,數據被寫入有用的塊中,但是沒有用的塊中的數據還是原來那樣,他們可能包含之前使用過的數據。很多存儲系統都會在後臺清空(zero-out)沒有的塊。對於急切型平面磁盤(eager thick disk),沒有用的塊在分配時就已經清空。
精簡置備磁盤(Thin Provisioned Disk)
對於一個精簡置備型磁盤,vSphere客戶端報告的置備的大小可能會大於磁盤的容量。精簡磁盤的置備大小是指當磁盤空前分配時需要佔用的最大大小。實際大小則是精簡磁盤的當前大小。過量使用(Overcommit)意味着如果所有精簡磁盤都已完全置備,沒有足夠的空間容納所有這些磁盤。
國際化和本地化(Internationalization and Localization)
虛擬機以及VMDK文件的路徑名稱可以包括主機文件系統支持的任何字符集。vSphere4以及Workstation7支持Unicode UTF-8路徑名稱,儘管在一些本地化資源中,只建議使用ASCII路徑名稱。
Windows2000以及最新的系統中,使用UTF-16作爲本地化的路徑名稱。例如,在法語環境中,VDDK示例代碼會將磁盤掛載在路徑“C:\Windows\Temp\vmware‐Système”中,其中“è”就是一個UTF-16編碼,VixMntapi動態庫無法識別它。在這種情況下,程序啓動前就需要在後臺將tmpDirectory配置鍵設置爲只包含ASCII字符的路徑。
對於需要操作任意路徑名稱的程序,Unicode提供了一組C語言的GNU庫函數,使用iconv_open()來初始化編碼集轉換,使用iconv()將UTF-8轉換爲UTF-16,或者將UTF-16轉換爲UTF-8。
虛擬磁盤的內部格式(Internal Format)
虛擬磁盤的內部格式技術文檔5.0(Virtual Disk Format 5.0)很好的描述了VMDK的格式,可以通過下面的URL獲得:
http://www.vmware.com/support/developer/vddk/vmdk_50_technote.pdf
分頁目錄和分頁表格(Grain Directories and Grain Tables)
稀疏(SPARSE)類型的虛擬磁盤使用結構化的方式來組織磁盤扇區。詳細信息請看“虛擬磁盤內部格式”中提到的VirtualDisk Format 5.0。這裏的分頁(Grain)是指數據單元的粒度,大小超過一個扇區。這種結構包括:
分頁目錄(Grain directory,以及冗餘目錄),它們的每一項都指向分頁表格
分頁表格(Grain tables,以及冗餘表格),它們的每一項都指向數據單元頁(Grains)
每頁(Grain)就是一塊扇區,包含虛擬磁盤的數據。默認的大小是128個扇區或者是64KB。
虛擬磁盤API中的數據結構
這裏只簡單介紹一些重要的數據結構:
VixError類型爲uint64的錯誤代碼
VixDiskLibConnectParams公共類型,描述虛擬機的驗證信息vmxSpec(可能通過vCenter Server),主機的名稱,以及認證方式。詳細信息可以參考”VMX詳細規格”一節。credType可以是 VIXDISKLIB_CRED_UID(通用的用戶名/密碼方式),VIXDISKLIB_CRED_SESSIONID(HTTP會話ID), VIXDISKLIB_CRED_TICKETID(vSphere票據ID),VIXDISKLIB_CRED_SSPI(當前線程的認證憑據,只用於Windows)。
VixDiskLibConnectParams::VixDiskLibCreds用戶ID或會話ID的憑據
VixDiskLibConnectParams::VixDiskLibCreds::VixDiskLibUidPasswdCreds認證時保存用戶名和密碼的字符串域。
VixDiskLibConnectParams::VixDiskLibCreds::VixDiskLibSessionIdCreds保存會話cookie,用戶名,加密會話密鑰。
VixDiskLibConnectParams::VixDiskLibCredsb::VixDiskLibSSPICreds表示安全支持提供者接口的認證信息,用戶名和密碼爲空。
VixDiskLibCreateParams用來表現虛擬磁盤的類型,磁盤適配器類型,VMWare的版本以及磁盤扇區的容量。
typedefVixDiskLibDiskType diskType
typedefVixDiskLibAdapterType adapterType
typedefuint hwVersion
typedefVixDiskLibSectorType capacity
VixDiskLibDiskInfo描述虛擬磁盤的BIOS以及物理參數(geometry),磁盤扇區容量,磁盤適配器類型,子磁盤鏈接(重做日誌,redo logs)的個數,以及用戶定位父磁盤的字符串。
VixDiskLibGeometrybiosGeo
VixDiskLibGeometryphysGeo
VixDiskLibSectorTypecapacity
VixDiskLibAdapterTypeadapterType
intnumLinks
char* parentFileNameHint
VixDiskLibGeometry描述虛擬磁盤的幾何參數,並不需要和物理磁盤相同。
typedefuint32 cylinders
typedefuint32 heads
typedefuint32 sectors
VMDK訪問認證和權限(Credentials and Privileges)
本地操作由本地的VMDK支持。到ESX/ESXi主機的訪問有登陸憑據信息進行認證,所有只要有正確的憑據,VixDiskLib可以訪問ESX/ESXi主機上任何VMDK。VMWare vSphere有它自己的一組權限(privileges),所以只要有正確的權限和登陸憑據,VixDiskLib可以訪問由vCenter Server管理的任何ESX/ESXi主機上任意VMDK。VixDiskLib支持:
1. 只讀和讀寫模式
2. 以只讀模式訪問在線(onlien)虛擬機的任一個快照
3. 訪問離線虛擬機的VMDK文件(vCenter僅限於已註冊的虛擬機)
4. 微軟虛擬磁盤(VHD)格式的讀取
vCenter Server中,備份應用角色在保存虛擬機數據時,必須具有以下權限:
1. 虛擬機(VirtualMachine) > 配置(Configuration) > 跟蹤磁盤修改(Disk change tracking)
2. 虛擬機(VirtualMachine) > 支持(Provisioning) > 允許磁盤只讀訪問,並且允許虛擬機下載(VM download)
3. 虛擬機(VirtualMachine) > 狀態(State) > 創建快照和移除快照
備份應用中,用戶必須具有以下權限:
1. 數據存儲(Datastore) > 分配空間(Allocate space)
2. 虛擬機(VirtualMachine) > 配置(Configuration) > 添加新磁盤和移除磁盤
3. 虛擬機(VirtualMachine) > 配置(Configuration) > 修改資源(resource)和設置(setting)
當備份涉及vCenter Server以及所有ESX/ESXi主機時,用戶還需要以下權限:
1. 全局(Global) > 禁用和啓用方法(DisableMethods and EnableMethods)
2. 全局(Global) > 牌照(License)
所有的權限都必須應用在vCenter Server級別,否則將會返回類似”The host is not licensed for this feature“這樣的錯誤。
適配器類型(Adapter Types)
VMDK可以選擇一下類型:
VIXDISKLIB_ADAPTER_IDE虛擬磁盤作爲ATA,ATAPI,PATA,SATA等等設備。當有舊的軟件(legacy software)明確需要時,就必須選擇這種類型。
VIXDISKLIB_ADAPTER_SCSI_BUSLOGIC使用Buslogic適配器的虛擬SCSI磁盤。在一些平臺上這是默認類型,並且在使用IDE磁盤時,爲了更好的性能也推薦使用這種類型。
VIXDISKLIB_ADAPTER_SCSI_LSILOGIC使用LSILogic適配器的虛擬SCSI磁盤。Windows Server 2003和大部分Linux虛擬機默認使用這種類型。性能和Buslogic類似。
虛擬磁盤傳輸方式(Transport Methods)
使用SAN或NAS存儲的ESX/ESXi主機上的虛擬機,VMWare支持文件級或者鏡像級的備份。虛擬機通過共享的VMFS LUN直接讀取數據,所有可以進行有效的備份,並且不會加重虛擬網路或ESX/ESXi主機的負載。
VMWare提供接口有效地訪問存儲簇(storage clusters),集成了存儲敏感(storage-aware)應用程序,包括備份。開發者可以使用VMDK高級傳輸模式,它提供了高效的I/O方法來最大化備份性能。VMWare提供5中訪問方法:本地文件(local file),NBD(網絡塊設備,network block device),通過局域網(over LAN)的加密NBD(NBDSSL,NBD with encryption),SAN以及SCSI HotAdd(熱添加的SCSI)。
本地文件訪問(Local File Access)
虛擬磁盤庫從ESX/ESXi主機上的/vmfs/volumes位置或者主機產品的本地文件系統中讀取磁盤數據。文件訪問方式集成在VixDiskLib中,所以它在本地存儲中總是可用的,但是它不是一種網絡傳輸方法。
SAN Transport
SAN模式要求應用程序運行在一臺備份服務器上,服務器訪問包含需要讀寫的虛擬磁盤所在的SAN存儲(Fibre Channel,iSCSI,或者SAS連接)。如圖3-1所示,因爲這種方法不需要通過ESX/ESXi主機傳輸數據,所有很高效。SAN備份代理必須是一臺物理機器。如果它有光驅或磁帶,整個備份過程都不需要局域網(LAN-free)。
在SAN傳輸模式中,虛擬磁盤庫從ESX/ESXi主機獲取VMFS LUN的佈局信息,並且使用這些信息直接從虛擬磁盤所在的存儲單元(storage LUN)上讀取數據。這是發佈在SAN連接的ESX/ESXi主機上的軟件的最快的傳輸方式。
SAN存儲設備可以包括SATA硬盤,但是在VMWare硬件兼容性列表上,目前還沒有連接SAN設備的SATA硬盤。
在任何存儲設備上的SAN傳輸模式,通常都作爲LUN工作在驅動一級(而不像NTFS或EXT之類的文件系統)。SAN模式必須能夠將LUN作爲一個原始的設備進行訪問。關鍵在於設備是否作爲一個到底層LUN的原始鏈接(The real key is whether thedevice behaves like a direct raw connection to the underlying LUN)。光纖通道(Fibre Channel),iSCSI,以及基於SAS(多個掛載的SCSI,serial attached SCSI)的存儲陣列都支持SAN傳輸模式。
VMWarevSAN作爲一種使用直接掛載磁盤的基於網絡的存儲解決方案,並不支持SAN傳輸方式。vSAN使用和SAN傳輸不兼容的模式和方法,如果虛擬磁盤庫檢測到vSAN,它將會禁用SAN方式。其他高級傳輸方式仍然有用。
HotAdd Transport
如果備份程序工作在appliance中,它可以從備份快照中創建一個虛擬機的克隆鏈接(linked-clone virtualmachine),然後從克隆的虛擬磁盤中讀取備份數據。這需要在備份程序所在的主機上插入一個SCSI設備(SCSI HotAdd),克隆鏈接相關的磁盤在備份程序所在機器(備份代理)上是臨時插入的。
HotAdd是VMware的一個特性,運行虛擬機運行時插入設備。除了SCSI磁盤,還可以添加CPU和內存。
VixTransport處理臨時的克隆鏈接以及虛擬磁盤的掛載。VixDiskLib將熱插入的磁盤作爲完整的VMDK(本地主機上的虛擬磁盤,virtual disk on the local host)磁盤進行打開和讀取。這種策略只在虛擬機使用SCSI硬盤時纔有效,並且不支持虛擬IDE硬盤的備份。
HotAdd能夠方便地從虛擬機獲取虛擬磁盤數據到備份應用(或備份代理)中。HotAdd磁盤如圖3-2所示。
HotAdd傳輸方式也適用於存儲在NFS分區上的虛擬機。
將備份應用作爲虛擬機運行有兩個優點:很容易將一個虛擬機遷移到新的服務器,並且可以不通過局域網訪問本地存儲,儘管這會比SAN傳輸方式對物理ESX/ESXi主機產生更多的負載。
關於HotAdd代理
HotAdd備份代理必須是一臺虛擬機。HotAdd需要將虛擬磁盤掛載到備份代理,就像將磁盤掛載到虛擬機一樣。
通常一個HotAdd備份代理可以備份Windows或Linux系統,但不會同時備份。如果要並行備份,需要部署多個代理。
如果HotAdd代理是一個存儲在VMFS-3捲上的虛擬機,對於客戶想要備份的虛擬機上的虛擬磁盤,需要選擇一個和其最大大小相適應的塊大小的卷(choose a volume withblock size appropriate for the maximum virtual disk size of virtual machinesthat customers want to backup),如表3-2所示。這並不適用於VMFS-5卷,因爲它的文件塊大小總是1MB。
NBD和NBDSSL傳輸
當其他傳輸方式都無法工作時,網絡存儲應用程序可以使用LAN作爲數據訪問的傳輸方式,如NBD(network block device)或者NBDSSL(加密的,encrypted)。NBD是一種Linux類型的內核模塊,它將遠程主機作爲一個塊設備。NBDSSL和NBD類似,它使用SSL來加密所有通過TCP連接傳輸的數據。NBD傳輸方式集成在虛擬磁盤庫中,它總是可用的,並且當其他傳輸方式不可用時會自動使用。
使用這種方式時,ESX/ESXi主機從存儲設備讀取數據,並通過網絡將數據發送到備份服務器。使用局域網傳輸,大數據的虛擬磁盤的傳輸會消耗更多的時間,並且向局域網增加流量(SAN或HotAdd並不會),但是NBD傳輸還是可以提供以下好處:
1.ESX/ESXi主機可以使用任何存儲設備,包括本地存儲或遠程掛載的NAS。
2.備份代理可以是一臺虛擬,這樣客戶就可以使用vSphere的資源池來減小備份時產生的性能衝突(minimize theperformance impact of backup)。例如,備份代理的資源分配優先級可以低於ESX/ESXi主機產品。
3.如果虛擬機和備份代理在一個私有網路中,客戶可以選擇不加密的數據傳輸。NBD比NBDSSL更快且需要更少的資源。儘管可以使用私有網絡,但是VMWare還是建議對敏感數據進行加密。
SSL證書和安全
VDDK5.1已經強化了安全措施,虛擬機也被設置爲可以驗證SSL證書。在Windows上,下面的註冊表路徑中需要表3-3所示的鍵值:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\VMware,Inc.\VMware Virtual Disk Development Kit
爲了支持註冊表重定向,64位Windows上的VDDK需要的註冊表項,必須設置在Wow6432Node中,這對64位Windows上的32和64位程序都是正確的。
Linux上,SSL證書驗證需要使用指紋(use of thumprints),否則沒有任何其他驗證機制。vShpere上指紋是指從一個可信源(如vCenter Server)獲得一個哈希值(hash),並傳入NFC票據(ticket)的 SSLVerifyParam結構。如果下面信息加入VixDiskLib_InitEx配置文件,Linux虛擬機會檢測SSL指紋:
vixDiskLib.linuxSSL.verifyCertificates= 1
下面的庫函數增強了Linux SSL指紋:InitEx,PrepareForAccess,EndAccess,GetNfcTicket,以及用於高級傳輸模式的GetRpcConnection接口。
NFC會話限制(Session Limits)
NBD使用VMware網絡文件拷貝(NFC, network filecopy)協議。從表3-4中可以看出,在多個主機類型上網絡連接數量的限制。VixDislib_Open對於ESX/ESXi主機上的每一個虛擬磁盤都使用一個連接。 VixDiskLib_Clone()同樣需要一個連接。無法在多個磁盤間共享連接。這是主機的限制,而不是進程的限制,所以SAN或HotAdd沒有此限制。