天天看點

VMware 虛拟化程式設計(5) — VixDiskLib 虛拟磁盤庫詳解之一目錄前文清單VixDiskLib 虛拟磁盤庫虛拟磁盤資料的傳輸方式 Transport MethodsVMDK File 的通路認證和權限 Credentials and PrivilegesSSL 證書和安全

<a href="#%E7%9B%AE%E5%BD%95">目錄</a>

<a href="#%E5%89%8D%E6%96%87%E5%88%97%E8%A1%A8">前文清單</a>

<a href="#vixdisklib-%E8%99%9A%E6%8B%9F%E7%A3%81%E7%9B%98%E5%BA%93">VixDiskLib 虛拟磁盤庫</a>

<a href="#%E8%99%9A%E6%8B%9F%E7%A3%81%E7%9B%98%E6%95%B0%E6%8D%AE%E7%9A%84%E4%BC%A0%E8%BE%93%E6%96%B9%E5%BC%8F-transport-methods">虛拟磁盤資料的傳輸方式 Transport Methods</a>

<a href="#vixdiskliblisttransportmodes-%E6%9E%9A%E4%B8%BE%E6%94%AF%E6%8C%81%E7%9A%84%E4%BC%A0%E8%BE%93%E6%A8%A1%E5%BC%8F">VixDiskLib_ListTransportModes 枚舉支援的傳輸模式</a>

<a href="#vixdisklibinitex-%E5%88%9D%E5%A7%8B%E5%8C%96-vixdisklib-%E5%BA%93">VixDiskLib_InitEx 初始化 VixDiskLib 庫</a>

<a href="#vixdisklibconnectex-%E8%BF%9E%E6%8E%A5%E5%88%B0-virtual-disk-library">VixDiskLib_ConnectEx 連接配接到 virtual disk library</a>

<a href="#vixdisklibdisconnect-%E6%96%AD%E5%BC%80-vixdisklib-%E7%9A%84%E8%BF%9E%E6%8E%A5">VixDiskLib_Disconnect 斷開 VixDiskLib 的連接配接</a>

<a href="#vixdisklibcleanup-%E6%96%AD%E5%BC%80%E8%BF%9E%E6%8E%A5%E4%B9%8B%E5%90%8E%E7%9A%84%E6%B8%85%E7%90%86">VixDiskLib_Cleanup 斷開連接配接之後的清理</a>

<a href="#vixdisklibexit-cleans-up-the-library-before-exit">VixDiskLib_Exit cleans up the library before exit</a>

<a href="#vixdisklibgeterrortext-%E8%8E%B7%E5%8F%96%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF">VixDiskLib_GetErrorText 擷取錯誤資訊</a>

<a href="#vixdisklibfreeerrortext-%E9%87%8A%E6%94%BE%E9%94%99%E8%AF%AF%E6%8F%8F%E8%BF%B0">VixDiskLib_FreeErrorText 釋放錯誤描述</a>

<a href="#vmdk-file-%E7%9A%84%E8%AE%BF%E9%97%AE%E8%AE%A4%E8%AF%81%E5%92%8C%E6%9D%83%E9%99%90-credentials-and-privileges">VMDK File 的通路認證和權限 Credentials and Privileges</a>

<a href="#ssl-%E8%AF%81%E4%B9%A6%E5%92%8C%E5%AE%89%E5%85%A8">SSL 證書和安全</a>

<a href="http://blog.csdn.net/jmilk/article/details/77927455" target="_blank">VMware 虛拟化程式設計(1) — VMDK/VDDK/VixDiskLib/VADP 概念簡析</a>

<a href="http://blog.csdn.net/jmilk/article/details/77854924" target="_blank">VMware 虛拟化程式設計(2) — 虛拟磁盤檔案類型詳解</a>

<a href="http://blog.csdn.net/jmilk/article/details/78233661" target="_blank">VMware 虛拟化程式設計(3) —VMware vSphere Web Service API 解析</a>

<a href="http://blog.csdn.net/jmilk/article/details/78237671" target="_blank">VMware 虛拟化程式設計(4) — VDDK 安裝</a>

VDDK 實際上是基于 Virtual Disk API(虛拟磁盤接口) 來實作的,而 Virtual Disk API 也就是 VixDiskLib 虛拟磁盤庫,是一組管理 VMDK File 的函數調用集合。

VDDK 總共提供了 5 種資料傳輸方式,其中前 3 種為基本傳輸方式,後兩種為進階傳輸方式:

本地檔案(Local File)

網絡塊裝置 NBD(Network Block Device)

區域網路的加密 NBD(NBDSSL,NBD with encryption)

SAN

熱添加的 SCSI(SCSI HotAdd)

而在 VDDK 1.1 以後的版本中,都能夠支援應用程式通過 SAN 或者 HotAdd 等方式來直接通路儲存設備(Datastore)上的 VMDK File,而不僅限于使用 LAN 或 NBD 的傳輸方式來通路 VMDK File 資料,進而顯着提高了 I/O 性能。

函數原型:

函數調用:

該函數傳回一個表示目前支援的傳輸模式清單字元串,E.G. <code>file:san:hotadd:nbd</code>,其中 nbd 表示 LAN 傳輸,nbdssl 表示 SSL 加密的 NBD 傳輸。<code>san:hotadd:nbdssl:nbd</code> 表示所有傳輸模式均可以使用。

函數 VixDiskLib_InitEx 用于初始化 Virtual Disk Library,與 VixDiskLib_Exit 相對,都應且僅應該在「應用程式的生命周期中」被調用一次。VixDiskLib_InitEx 函數支援使用進階傳輸方式。

形參 <code>majorVersion, minorVersion</code> 表示 VDDK 的發行版本的主機闆本号和次版本号。例如:如果我們使用的是 VDDK 6.0 Version,那麼就是 <code>majorVersion == 6; minorVersion == 0</code>。

PS:版本号由二至四個部分組成,主版本号、次版本号、内部版本号和修訂号。主版本号和次版本号兩個部分為必選。内部版本号和修訂号兩個部分為可選;格式為:<code>主版本号.次版本号[.内部版本号[.修訂号]]</code>。

形參 <code>&amp;logFunc, &amp;warnFunc, &amp;panicFunc</code> 分别為 Log、Warning、Panic 級别日志函數指針類型,若傳入 NULL 實參則表示使用預設日志函數。但需要注意的是,預設日志函數式線程非安全的,如果在多線程場景下,務必需要實作自定義日志函數。

形參 <code>*libDir</code> 指定了 VDDK Lib 庫的系統路徑,按照上篇博文所提到的,在 Linux OS 中該路徑應該為 <code>/usr/lib/vmware-vix-disklib</code>。

形參 <code>*configFile</code> 指定了 VDDK 配置檔案的路徑,通常為 <code>/usr/etc/vddk.conf</code> 配置檔案中能夠指定連接配接認證的方式、日志級别、傳輸類型、逾時時間等。EXAMPLE:

在完成了 Virtual Disk Library 的初始化之後就可以調用 VixDiskLib_ConnectEx 将 Virtual Disk Library 連接配接到 vSphere or ESX/ESXi。其實,實際上是連接配接到某個具體的虛拟機。與 VixDiskLib_Disconnect 相對的,都應且僅應該在「對虛拟機所擁有的 VMDK File 操作的生命周期中」被調用。

<code>@param connectParams</code>:連接配接參數集,包含以下子參數:

<code>vmxSpec</code>:一個 VirtualMachine moRef 虛拟機托管對象引用,E.G. <code>moref=vm-3133</code>。指定了連接配接到一個具體的虛拟機,集合參數 <code>@param snapshotRef</code> 就能夠指定連接配接到一個具體的虛拟機的具體快照資料檔案(VMDK)。

<code>serverName, port</code>: 是 vCenter os ESX/ESXi server 的 Ipaddress 和 Port,若 Port 設定為 NULL 時, VixDiskLib 使用預設的通信端口,通常是 443(HTTPS) 或者 902(VIX自動化)。注意,這裡指的是資料傳輸端口,而不是 SOAP 請求的端口。

<code>creds.uid.userName, creds.uid.password</code>: 是登入賬戶認證資訊

<code>credType</code>: 賬戶認證方式,支援下列認證方式:

<code>VIXDISKLIB_CRED_UID</code> (使用者名/密碼)

<code>VIXDISKLIB_CRED_SESSIONID</code> (HTTP Session ID)

<code>VIXDISKLIB_CRED_TICKETID</code> (vSphere Ticket ID)

<code>VIXDISKLIB_CRED_SSPI</code> (目前線程的認證憑據,隻用于 Windows)

<code>thumbPrint</code>: vCenter or ESX/ESXi 的 SHA1 指紋資訊,可以通過下述方式擷取。

<code>@param readOnly</code>: 為 TRUE 時,表示隻讀的通路 VMDK,通常效率會更高,而且之後調用 VixDiskLib_Open 也總是隻讀的,而無需理會其他的 openFlags 參數如何設定。若為 FALSE 表示可讀寫的方式通路 VMDK。

<code>@param snapshotRef</code>: Snapshot moRef,與 vmxSpec 的格式不同,這裡隻需要給出 Snapshot moRef 的唯一值,E.G. <code>snapshot-47</code>。如果在參數 <code>@param connectParams</code> 中給定了 vmxSpec 子參數,那麼該參數隻能傳入,Snapshot Mof。相反,還能夠提供 ESXi Mof 或 vSphere Mof 來連接配接到 ESX/ESXi Host 和 vCenter Server。如果希望使用 SAN, HotAdd, NBDSSL 傳輸方式和需要通路一個開啟電源的虛拟機的話,該參數也是必須的。如果通路的 VMDK File 為托管磁盤,就必須提供該實參;反之,若 VMDK File 為寄宿磁盤則可以為 NULL。

<code>@param transportModes</code>: 傳入一個以「:」為間隔的傳輸模式清單字元串,NULL 表示預設的 <code>file:san:hotadd:nbd</code> 傳輸模式。一般的,VixDiskLib 會遵循自左向右的優先級嘗試使用不同的傳輸模式,直至成功連接配接或到達清單結尾為止。特别的,如果 SAN 存儲可用的話,就會直接選擇 SAN 傳輸模式、當然,你也可以僅指定一種傳輸模式,并且如果該模式不可用,連接配接也不會失敗,隻是在調用 VixDiskLib_Open 函數時,會自動選擇使用 NDB 模式。

<code>@param connection</code>: 該實參是一個指針類型,會在 VixDiskLib_ConnectEx 函數調用成功後傳回,成為一個 connection 對象的句柄 handle,在 Disconnection 時會被用到。

NOTE:VixDiskLib_InitEx 和 VixDiskLib_ConnectEx 函數是 VixDiskLib_Init 和 VixDiskLib_Connect 的加強版,在版本較新的 VDDK 中才有提供,前者的組合有更加豐富的功能,建議使用。

調用該函數即可斷開指定連接配接。

<code>@param connection</code>:為調用 VixDiskLib_ConnectEx 之後 Return 的 VixDiskLibConnection 類型對象

如果在 Disconnect 之後,虛拟機的額外狀态并未正确的清除掉,調用該函數就能将這些額外的狀态都清理掉。

NOTE:通過我們會在 VixDiskLib_InitEx 之前,或者 VixDiskLib_Disconnect 之後調用該函數,以清除不确定因素。但需要注意的是,在多并發或并行的場景中,調用該函數将變得非常危險。

在程式退出之前,均需要調用 VixDiskLib_Exit 來清理 Lib 庫所配置設定的資源。

調用 VixDiskLib_GetErrorText 函數,能夠擷取 errorCode 所代表的的錯誤資訊描述。

需要注意的是,在擷取了錯誤描述資訊之後,均需要調用該函數來釋放這些資訊。

<code>@param errMsg</code>:即為調用 VixDiskLib_GetErrorText 所獲得的錯誤資訊類型對象。

ESX/ESXi Host 使用登陸憑據資訊進行通路認證,隻要憑據正确,VixDiskLib 可以通路 ESX/ESXi Host 上任意 VMDK File。而 VMware vSphere 則有專屬的一組權限(Privileges)機制,需要擁有正确的權限和登陸憑據,VixDiskLib 才能通路所有由 vCenter Server 管理的 ESX/ESXi Host 上任意的 VMDK File。

vCenter Server 中,備份應用使用者在備份虛拟機資料時,必須具有以下權限:

虛拟機(VirtualMachine) &gt; 配置(Configuration) &gt; 跟蹤磁盤修改(Disk Change Tracking)

虛拟機(VirtualMachine) &gt; 支援(Provisioning) &gt; 允許磁盤隻讀通路,并且允許虛拟機下載下傳(VM download)

虛拟機(VirtualMachine) &gt; 狀态(State) &gt; 建立快照和移除快照

備份應用中,使用者必須具有以下權限:

資料存儲(Datastore) &gt; 配置設定空間(Allocate space)

虛拟機(VirtualMachine) &gt; 配置(Configuration) &gt; 添加新磁盤和移除磁盤

虛拟機(VirtualMachine) &gt; 配置(Configuration) &gt; 修改資源(Resource)和設定(Setting)

當備份涉及 vCenter Server 以及所有 ESX/ESXi Host 時,使用者還需要具有以下權限:

全局(Global) &gt; 禁用和啟用方法(DisableMethods and EnableMethods)

全局(Global) &gt; 牌照(License)

所有的權限都必須應用在 vCenter Server 級别,否則将會傳回類似「The host is not licensed for this feature」這樣的錯誤。

在 Linux 上的 VixDiskLib 的 SSL 證書驗證需要提供指紋(Thumbprints)序列,vSphere 的指紋是指從一個可信源(vCenter Server or ESX/ESXi)中獲得的一個哈希值(hash),并将該指紋傳入 NFC Ticket 的 SSLVerifyParam 資料結構,若檢查 Thumbprints PASS 則可以建立 SSL 連接配接。

在上述的 vddk.conf 配置檔案中使用下述配置,則表示開啟檢查 SSL SHA1 Thumbprints。

繼續閱讀