在ovirt环境中,有1个手动池,用户每次使用完后,需要将虚拟机回退到原始版本。
在ovirt原有的实现里,是通过快照来实现的,他所谓的快照,其实就是创建原磁盘的一个增量文件,虚拟机运行时,原来的磁盘作为模板,数据写入到增量文件中,虚拟机关闭时只要把增量文件删除了就行,不会影响到原磁盘。
这种社区的方式在生产环境中也出现了一些小问题,于是我们引入了qemu自带的snapshot参数,这样qemu读写磁盘时会写在临时文件或者内存中,我们乐的什么也不用管,而且很稳定。
但是,后来发现了这种方式在块设备+qcow自动扩容时存在大问题。
为什么需要扩容
为了节省容量,自动池的虚拟机都是基于模板生成增量文件,这个虚拟机磁盘本身是1个增量,如果用lvm块设备来创建的话,刚创建的时候会使用很少的容量,ovirt在主机端的vdsm进程会监控这个磁盘的物理容量和使用量,必要的时候自动扩容。
扩容时产生的问题:
1,qemu使用snapshot参数是,不会再写原磁盘,会创建1个临时磁盘,这个磁盘的容量从0开始增长,写多少增长多少。
2,Libvirt读取虚拟机磁盘信息时,读到的是临时磁盘的容量,而且每次读到的磁盘容量和使用量相等,于是向spm主机发起扩容需求。
3,spm主机收到扩容请求,对原磁盘进行扩容,扩容的大小总是4G+当前使用量,当前容量总是1M,2M,3M这样临时磁盘的容量