摘要 : 3 虚拟磁盘接口VMWare提供磁盘布局选项,这里将要讨论动态库中封装的数据结构。VMDK文件位置在ESX/ESXi主机上,虚拟机磁盘(VMDK)文件通常存放在共享存储设备的某个/vmfs/volumes中。在vSphere Client上,可以从主机 ...
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_FLAT VMFS_FLAT 对于惰性清零平面磁盘(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)是指数据单元的粒度,大小超过一个扇区。这种结构包括: • •
这里只简单介绍一些重要的数据结构: 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存储设备可以包括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传输
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 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没有此限制。
|