3 虚拟磁盘接口

VMWare提供磁盘布局选项,这里将要讨论动态库中封装的数据结构。

VMDK文件位置

ESX/ESXi主机上,虚拟机磁盘(VMDK)文件通常存放在共享存储设备的某个/vmfs/volumes中。在vSphere Client上,可以从主机和簇的库中查看存储卷,它们的名字通常是datastore1datastore2。如果要查看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文件。表示虚拟机的名称。在VMFS分区上,这是磁盘描述文件的名称。
.vmdk

MONOLITHIC_FLAT

VMFS_FLAT

VMFS_THIN

如果勾选了立即分配磁盘空间,虚拟磁盘文件将会提前分配所有空间,不会动态增长。第一个VMDK文件很小,并指向一个大的文件,它的名称包含“flat”,但是没有数字序号。

同样在VMFS分区上,这个虚拟磁盘文件指向了虚拟磁盘数据文件,thickthin类型。
-flat.vmdk
SPLIT_SPARSE 如果只勾选“分割成2GB大小的文件”,虚拟磁盘文件将会在需要更多空间时扩展。第一个VMDK文件很小,并指向一系列的其他VMDK文件,它们在序号数字前都有一个S标志,表明是稀疏类型的(sparse)VMDK文件的数字依赖于所需要的磁盘大小。随着数据增长,将会在这个序列中新增更多的VMDK文件。 -s<###>.vmdk
SPLIT_FLAT 如果勾选立即分配磁盘空间将磁盘分成2GB大小的文件两个选项,那么虚拟磁盘空间将会提前分配,不会动态扩展。第一个VMDK是一个小文件,指向一系列的其他文件,这些文件在数字序号之前都有一个f前缀,表示flat。数字有磁盘大小决定。 -f<###>.vmdk
MONOLITHIC_SPARSE或者SPLIT_SPARSE的快照 当给虚拟机创建快照时,会生成回写日志,也叫做子磁盘(child disk)或者差异链接(delta link)。快照文件中有序号数字,但是没有fs前缀。针对原来的父磁盘或者更早的回写日志(即更早的快照)的数据修改,将会写进这些带编号的的VMDK文件中。 -<###>.vmdk
SE_SPARSE 有效利用空间的稀疏(seSparse)文件格式。在vShpere 5.1或更新版本的VMWare View中用于模板克隆。
n/a 虚拟机的快照,包含了指向所有VMDK文件的信息。 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\vmwareSystè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主机上任何VMDKVMWare vSphere有它自己的一组权限(privileges),所以只要有正确的权限和登陆凭据,VixDiskLib可以访问由vCenter Server管理的任何ESX/ESXi主机上任意VMDKVixDiskLib支持:

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虚拟磁盘作为ATAATAPIPATASATA等等设备。当有旧的软件(legacy software)明确需要时,就必须选择这种类型。

VIXDISKLIB_ADAPTER_SCSI_BUSLOGIC使用Buslogic适配器的虚拟SCSI磁盘。在一些平台上这是默认类型,并且在使用IDE磁盘时,为了更好的性能也推荐使用这种类型。

VIXDISKLIB_ADAPTER_SCSI_LSILOGIC使用LSILogic适配器的虚拟SCSI磁盘。Windows Server 2003和大部分Linux虚拟机默认使用这种类型。性能和Buslogic类似。

虚拟磁盘传输方式(Transport Methods)

使用SANNAS存储的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(NBDSSLNBD with encryption)SAN以及SCSI HotAdd(热添加的SCSI)

本地文件访问(Local File Access)

虚拟磁盘库从ESX/ESXi主机上的/vmfs/volumes位置或者主机产品的本地文件系统中读取磁盘数据。文件访问方式集成在VixDiskLib中,所以它在本地存储中总是可用的,但是它不是一种网络传输方法。

SAN Transport

SAN模式要求应用程序运行在一台备份服务器上,服务器访问包含需要读写的虚拟磁盘所在的SAN存储(Fibre ChanneliSCSI,或者SAS连接)。如图3-1所示,因为这种方法不需要通过ESX/ESXi主机传输数据,所有很高效。SAN备份代理必须是一台物理机器。如果它有光驱或磁带,整个备份过程都不需要局域网(LAN-free)

VMware虚拟磁盘编程指导(三)_第1张图片

SAN传输模式中,虚拟磁盘库从ESX/ESXi主机获取VMFS LUN的布局信息,并且使用这些信息直接从虚拟磁盘所在的存储单元(storage LUN)上读取数据。这是发布在SAN连接的ESX/ESXi主机上的软件的最快的传输方式。

SAN存储设备可以包括SATA硬盘,但是在VMWare硬件兼容性列表上,目前还没有连接SAN设备的SATA硬盘。

在任何存储设备上的SAN传输模式,通常都作为LUN工作在驱动一级(而不像NTFSEXT之类的文件系统)SAN模式必须能够将LUN作为一个原始的设备进行访问。关键在于设备是否作为一个到底层LUN的原始链接(The real key is whether thedevice behaves like a direct raw connection to the underlying LUN)。光纤通道(Fibre Channel)iSCSI,以及基于SAS(多个挂载的SCSIserial attached SCSI)的存储阵列都支持SAN传输模式。

VMWarevSAN作为一种使用直接挂载磁盘的基于网络的存储解决方案,并不支持SAN传输方式。vSAN使用和SAN传输不兼容的模式和方法,如果虚拟磁盘库检测到vSAN,它将会禁用SAN方式。其他高级传输方式仍然有用。

HotAdd Transport

如果备份程序工作在appliance中,它可以从备份快照中创建一个虚拟机的克隆链接(linked-clone virtualmachine),然后从克隆的虚拟磁盘中读取备份数据。这需要在备份程序所在的主机上插入一个SCSI设备(SCSI HotAdd),克隆链接相关的磁盘在备份程序所在机器(备份代理)上是临时插入的。

HotAddVMware的一个特性,运行虚拟机运行时插入设备。除了SCSI磁盘,还可以添加CPU和内存。

VixTransport处理临时的克隆链接以及虚拟磁盘的挂载。VixDiskLib将热插入的磁盘作为完整的VMDK(本地主机上的虚拟磁盘,virtual disk on the local host)磁盘进行打开和读取。这种策略只在虚拟机使用SCSI硬盘时才有效,并且不支持虚拟IDE硬盘的备份。

HotAdd能够方便地从虚拟机获取虚拟磁盘数据到备份应用(或备份代理)中。HotAdd磁盘如图3-2所示。

VMware虚拟磁盘编程指导(三)_第2张图片

HotAdd传输方式也适用于存储在NFS分区上的虚拟机。

将备份应用作为虚拟机运行有两个优点:很容易将一个虚拟机迁移到新的服务器,并且可以不通过局域网访问本地存储,尽管这会比SAN传输方式对物理ESX/ESXi主机产生更多的负载。

关于HotAdd代理

HotAdd备份代理必须是一台虚拟机。HotAdd需要将虚拟磁盘挂载到备份代理,就像将磁盘挂载到虚拟机一样。

通常一个HotAdd备份代理可以备份WindowsLinux系统,但不会同时备份。如果要并行备份,需要部署多个代理。

    如果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

VMware虚拟磁盘编程指导(三)_第3张图片

NBDNBDSSL传输

当其他传输方式都无法工作时,网络存储应用程序可以使用LAN作为数据访问的传输方式,如NBD(network block device)或者NBDSSL(加密的,encrypted)NBD是一种Linux类型的内核模块,它将远程主机作为一个块设备。NBDSSLNBD类似,它使用SSL来加密所有通过TCP连接传输的数据。NBD传输方式集成在虚拟磁盘库中,它总是可用的,并且当其他传输方式不可用时会自动使用。

VMware虚拟磁盘编程指导(三)_第4张图片

使用这种方式时,ESX/ESXi主机从存储设备读取数据,并通过网络将数据发送到备份服务器。使用局域网传输,大数据的虚拟磁盘的传输会消耗更多的时间,并且向局域网增加流量(SANHotAdd并不会),但是NBD传输还是可以提供以下好处:

1.ESX/ESXi主机可以使用任何存储设备,包括本地存储或远程挂载的NAS

2.备份代理可以是一台虚拟,这样客户就可以使用vSphere的资源池来减小备份时产生的性能冲突(minimize theperformance impact of backup)。例如,备份代理的资源分配优先级可以低于ESX/ESXi主机产品。

3.如果虚拟机和备份代理在一个私有网路中,客户可以选择不加密的数据传输。NBDNBDSSL更快且需要更少的资源。尽管可以使用私有网络,但是VMWare还是建议对敏感数据进行加密。

SSL证书和安全

VDDK5.1已经强化了安全措施,虚拟机也被设置为可以验证SSL证书。在Windows上,下面的注册表路径中需要表3-3所示的键值:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\VMware,Inc.\VMware Virtual Disk Development Kit

为了支持注册表重定向,64Windows上的VDDK需要的注册表项,必须设置在Wow6432Node中,这对64Windows上的3264位程序都是正确的。

VMware虚拟磁盘编程指导(三)_第5张图片

Linux上,SSL证书验证需要使用指纹(use of thumprints),否则没有任何其他验证机制。vShpere上指纹是指从一个可信源(vCenter Server)获得一个哈希值(hash),并传入NFC票据(ticket) SSLVerifyParam结构。如果下面信息加入VixDiskLib_InitEx配置文件,Linux虚拟机会检测SSL指纹:

vixDiskLib.linuxSSL.verifyCertificates= 1

下面的库函数增强了Linux SSL指纹:InitExPrepareForAccessEndAccessGetNfcTicket,以及用于高级传输模式的GetRpcConnection接口。

NFC会话限制(Session Limits)

    NBD使用VMware网络文件拷贝(NFC, network filecopy)协议。从表3-4中可以看出,在多个主机类型上网络连接数量的限制。VixDislib_Open对于ESX/ESXi主机上的每一个虚拟磁盘都使用一个连接。 VixDiskLib_Clone()同样需要一个连接。无法在多个磁盘间共享连接。这是主机的限制,而不是进程的限制,所以SANHotAdd没有此限制。