在XenServer中,基本的存储库(SR)、物理块设备、虚拟磁盘映像、虚拟块设备之间的关系如下图:
其中,PBD为物理存储设备的抽象,基本无法改变,SR为XenServer对物理存储设备的抽象,起到组织管理的作用,SR的类型对虚机VDI的格式以及性能有一定的影响,但是SR的类型受限制于物理存储的形式,所以,暂停也跳过,VBD与VDI对应,而最终VM拿到的虚拟块设备VBD,则为VDI的虚拟,所以,SR中VDI的格式对存储空间消耗以及性能产生比较重要的影响。
基于不同的SR,一般情况下,VDI的物理保存方式有三种:
- File-based VHD(基于文件的VHD):VM的image将会以精简置备(thin provisioning)的VHD格式保存在本地的EXT格式的SR或者共享的NFS的存储上。
- LVM-based VHD(基于LVM逻辑卷的VHD):默认XenServer连接光纤(LVMoHBA)、iSCSI(LVMoISCSI)或者SAS(LVM0HBA)的本地存储,以及基于SAN附加的LUN,这些类型存储上的VDI,都是卷管理器中的卷,并以VHD格式保存,以支持快照和克隆引用节点的精简置备。
- LUN per VHD(每个LUN作为一个VDI):这种类型主要指Netapp,Equallogic或者StorageLink提供的存储类型,这种方式由于会有特殊的插件提供支持,所以VDI会直接抽象为存储中的一个LUN,然后直接附加到VM。很明显,该种方式对存储性能的利用最好,而且能够更方便的管理存储,因为都是基于存储的管理功能,而不是XenServer本身的功能。
每种VHD类型,有每一种的特点,以及对存储空间的占用,存储的性能损耗都不一样:
首先说明一下,在XenServer中,模板生成虚机都是采用VDI连接的形式进行管理的。
由于每VDI使用一个LUN,这种形式,VHD的管理由存储控制器来管理,所以,其大小和性能由存储的管理方式来决定,所以这里就不准备详细讨论了,但相对于其他两种形式而言,每VDI一个LUN的形式,其性能最高。比如,存储支持Thin Provisioning,那么空间占用将会由实际大小决定,不管XenServer声明该VHD的大小是多少,如果不支持,那么声明多少,将占用多少。性能,由存储管理方式决定,比如,跨多少磁盘,RAID的级别等等。
如上图:假设,XenServer创建一VM,并分配20G大小的空间给VM,VM实际使用数据空间为10G,然后我们基于该VM复制两个出来,然后第一个VM,改变了5G的数据后,做快照,成为最终的VM1,而VM2虚机改变了2G的数据。
基于该假设,存储中,VDI的空间消耗如上图所示。
首先,基于LVM的VHD格式,最开始20G的VM,需要消耗20G空间,在转成模板以后,copy出VM1和VM2以后,原始VM空间将会压缩到实际大小10G,然后形成两个链接,供VM1和VM2使用,VM改变5GB大小以后,快照,则,快照只保存更改的数据5GB,新的VM1,将会占用20G空间,而VM2 copy出来也会占用20G空间。
而基于文件的VHD格式,很容易理解,再任何时候,VM以及快照的大小为实际改变大小。
基于VHD克隆或者copy的VM,每个子VM都会形成一个链,修改写入新的VDI,读取则从父模板读取,如果进一步,讲子VM在克隆,这样,链接将会越来越长,存储的性能也会越来越差。XenServer中,最大的链接长度为30,使用copy命令复制VM,讲会将链接长度重置为0.
VHD链的合并
VHD链接树会不断的创建、修改、删除。在删除链中的VDI时,XenServer会合理化链中的其他VDI,并删除非必要的VDI。合并过程为异步运行,且对于SR来说,永远只有一个合并过程处于活动状态,该过程由SR主节点主机的线程处理。
这里说明一点,VDI的删除,会导致VHD链的合并,但不是马上合并,该操作为异步执行,但最终会合并,而不是只删除链接节点名称保留直接链接。
楼主,请问,如果我想要针对每一个虚拟机,都单独给它分配一个独立的硬盘,应该怎么做
给每个 VM 分配一个物理硬盘?目前没法直接做。
只能先在硬盘上建XS SR(Storage Repository),然后从 SR 里面划分空间给 VM。
目前我就用一个小型的NAS当做存储服务器,然后用iscsi去链接它,让它作为一个SR,每次创建虚拟机都需要new 一个新的iscsiSR,,,,,,感觉很浪费,但是没有办法,只能这样解决了。。。。
多个VM使用同一个SR也是可行的。没有必要每个VM一个SR,对性能的影响并没有那么大。
请问一下楼主,我这里部署了xenserver6.0,SR后台部署的是HP p4500,在xenserver中每次新建虚机,后台存储容量都变小,但是删除虚机,容量没有增加,现在存储一直在缩小,请问是什么原因。
简单的可以尝试re-scan对应的SR,这时最基本的,如果还有问题,可能需要检查是否有隐藏的VDI没有被合并或者正确移除。
http://support.citrix.com/article/CTX123400
http://discussions.citrix.com/topic/303965-issue-with-reclaiming-disk-space-in-xenserver-60/
谨记:在进行操作之前,一定要对做进行的操作有深刻的了解,否则,可能导致错误的移除有用的VDI,最终导致数据丢失。
你好,就请问博主一个问题,就是我使用xen新建一个模板机器,刚开始不知道,每次需要新的虚拟机的时候,使用的fast copy,后来知道这样影响性能,那个模板机器我没启动,现在就是想问下,我删除那个没启动的模板机器,会对其他copy出来的虚拟机有影响么?
不会。不管是Fast copy或者Full Copy,删除模板都不会影响到从模板生成的VM
Hi!楼主,你的文章非常的棒,让我理解了建立虚机的存储使用情况。
请教一个问题:
1.如何设置模板参数,linux的根据模板会直接设定好根分区和其他分区大小,这个比例如何设置。
2.如何在建立的时候,直接设置虚机的存储为lun per vhd,这样对客户的体验也会更好。
非常期待你的回答。
1.从模板创建的VM应该所有的设置都是和模板VM完全一直的,据我了解应该无法通过模板参数来调整新创建VM的分区大小。如果是系统内置模板,那么应该是根据你分配的磁盘大小,全部使用后来分区的。
2.要实现LUN per VHD需要使用storage link才可以,一般情况下,添加LUN,需要管理员来操作,客户自行创建VM的时候不一定有权限。由于Storage link功能没有具体研究过,不是很确定,但以我的经验来看,可能不行。
恩,暂时从官网support也没找到相关的资料,非常感谢你的回答。
请问物理机FC HBA上面的NTFS 磁盘(里面有大量数据),XENSERVER里面的windows虚机如何直接加载,我看了KB,好像啥RAW LUN,有些不明白,你清楚吗?
RAW Disk是相对XenServer来说的。
XenServer不支持直接附加存储到Windows VM,除非是iSCSI。
froyo,您好,看完文章后获益匪浅。有些xenserver的问题也想咨询您一下:
1.我公司搭建的测试环境用的是本机的存储,sata盘,所以VDI应该是File-based VHD形式。我创建一个新的虚机,为其分配20G空间,实际使用空间为3.98G(在虚拟机系统内查看分区使用空间)。我在xenserver的storage查看存储却只增加了1.78G。不知这是为何?
2.我往虚拟机中拷贝2G数据,在xneserver中的storage存储使用情况未有任何改变。
3.此时做snapshot,storage增加2.5G空间(这个能够理解)。
4.做完snapshot后,再删除snapshot,storage空间不降反升,大约上升了0.1G空间。
1、有可能是2G内存,pagefiles大小加上实际大小,实际可能只是临时写入,所以,会有差别。
2、copy的数据,可能有一个刷新的时间,不一定是直接写入到VHD文件里面的。
4、snapshot不是实时删除的,比如你做了很多,中间因为是链接,所以,会有一些标记,会延迟合并,所以可能会上升~
froyo,您好,最近没上网, 谢谢您的回复。我再研究研究。
好文章,学习了,谢谢分享
请教一个XenApp Speed Screen Latency Reduction 不生效的问题:
参照了XenApp的配置文档:
1、通过 Speed Screen Latency Reduction Manager工具,配置server,默认对整个服务器上的应用,开启本地回显和鼠标反馈功能,并且也尝试过单独添加特殊的应用。
2、安装citrix support上相关XenApp Speed Screen Latency Reduction不生效的解决方案,修改 default.ica ,在Appcation section增加ZLMouse和ZLKey(缩写)设置为1的参数。
3、查看应用的ica文件,发现ZLMouse 和 ZLKey参数也存在,但是连接后发现SLR还是关闭状态。
查看了各种文档也没发现还需要配置其他的地方。
不知道博主是否有遇见过相同的问题???如何解决的??
首先,检查你的网络延迟,默认情况下,Speed Screen是在500ms以上延迟的情况下才生效。
再者,检查应用程序是否支持。可以优先针对server来配置策略测试Speed Screen是否已经启用。
主要先检查延迟是否符合启用的条件。
BTW:你的环境:系统,xenapp版本等。
悲催。。。
原来SLR功能不支持中文输入法,恰巧服务端没有添加英文输入法,只有、中文输入法,所以一直出不来。。。。
谢谢博主了
写的很好,慢慢消化