VMWare提供磁盘布局选项,这里将要讨论动态库中封装的数据结构。
在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单片、稀疏格式对数据流进行压缩。这种格式不支持随机读写。
在持久化磁盘模式中,数据将直接并永久地写入虚拟磁盘,尽管重新开机启动,数据还是会存储在虚拟磁盘中。
在非持久化(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),没有用的块在分配时就已经清空。
对于一个精简置备型磁盘,vSphere客户端报告的置备的大小可能会大于磁盘的容量。精简磁盘的置备大小是指当磁盘空前分配时需要占用的最大大小。实际大小则是精简磁盘的当前大小。过量使用(Overcommit)意味着如果所有精简磁盘都已完全置备,没有足够的空间容纳所有这些磁盘。
虚拟机以及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。
虚拟磁盘的内部格式技术文档5.0(Virtual Disk Format 5.0)很好的描述了VMDK的格式,可以通过下面的URL获得:
http://www.vmware.com/support/developer/vddk/vmdk_50_technote.pdf
稀疏(SPARSE)类型的虚拟磁盘使用结构化的方式来组织磁盘扇区。详细信息请看“虚拟磁盘内部格式”中提到的VirtualDisk Format 5.0。这里的分页(Grain)是指数据单元的粒度,大小超过一个扇区。这种结构包括:
分页目录(Grain directory,以及冗余目录),它们的每一项都指向分页表格
分页表格(Grain tables,以及冗余表格),它们的每一项都指向数据单元页(Grains)
每页(Grain)就是一块扇区,包含虚拟磁盘的数据。默认的大小是128个扇区或者是64KB。
这里只简单介绍一些重要的数据结构:
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支持。到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“这样的错误。
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类似。
使用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)。
虚拟磁盘库从ESX/ESXi主机上的/vmfs/volumes位置或者主机产品的本地文件系统中读取磁盘数据。文件访问方式集成在VixDiskLib中,所以它在本地存储中总是可用的,但是它不是一种网络传输方法。
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方式。其他高级传输方式仍然有用。
如果备份程序工作在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备份代理可以备份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。
当其他传输方式都无法工作时,网络存储应用程序可以使用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还是建议对敏感数据进行加密。
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接口。
NBD使用VMware网络文件拷贝(NFC, network filecopy)协议。从表3-4中可以看出,在多个主机类型上网络连接数量的限制。VixDislib_Open对于ESX/ESXi主机上的每一个虚拟磁盘都使用一个连接。 VixDiskLib_Clone()同样需要一个连接。无法在多个磁盘间共享连接。这是主机的限制,而不是进程的限制,所以SAN或HotAdd没有此限制。