把物理机转换为虚拟机的简单方法
把物理机转换为虚拟机简单方法
by 沈东良 http://blog.csdn.net/shendl
要把业务转换到虚拟化环境的客户,常常需要面对这样的问题:如何把现在运行业务的物理机转换为虚拟机,迁移到Hypervisor上运行。
这就是把物理机转换为虚拟机技术的用武之地。英文缩写P2V(Physical to Virtual)。
一台运行业务的物理机,其有价值的东西,不是它的硬件:CPU,内存,显卡,网卡等等。而是它的硬盘,因为软件和数据都在这里。而数据是无价的!
一台虚拟机,它的最核心的部分也是硬盘—虚拟化中应该称作“虚拟硬盘”了。
物理机的硬件信息,只需要记录下来,以便构建虚拟机时给它分配对应的虚拟资源即可。这些信息包括:CPU类型,内存大小,网卡数量,IP地址等等。
还有一些hypervisor为了实现更多对虚拟机的管理功能和提升虚拟机的性能,需要在虚拟机中安装服务软件。这些软件可以在P2V过程完成后再安装。而且即使不安装这类软件也不会影响虚拟机的正常使用。
因此,P2V转换的过程,核心就是对硬盘数据的转换。
虚拟机的虚拟硬盘,可以是一个块设备,也可以是一个文件。
我们这里可以使用dd命令,把物理机的每一个磁盘的内容原封不动地复制到文件中。具体方法见拙作:《在linux上用dd命令实现ghost功能》http://blog.csdn.net/shendl/article/details/7384755。
这个过程,其实也就是一个ghost的过程。
物理机的磁盘一般都很大,而dd命令的特点是,只能生成一模一样大小的备份文件,因此这会是一个问题。但你可以使用该文中的压缩方法,在dd备份执行的同时进行压缩,这样就能生成较小的文件。
得到备份文件后,你就可以使用hypervisor启动虚拟机了。(如果你使用压缩方法生成备份文件,你就必须首先解压这个文件)这个dd生成的备份文件,按照虚拟化的术语,叫做RAW格式的虚拟磁盘文件。
我们知道,块设备就是一次读写一个扇区512字节的设备。文件是可以一次读写1-N个字节的操作系统对象。因此,完全可以使用任意文件来模拟块设备。
所有Hypervisor都支持RAW格式的文件作为虚拟磁盘。RAW格式,就是没有格式。Hypervisor根据文件的大小除以512字节,得到该文件一共有多少个“扇区”。虚拟机读写扇区时,就调用read/write系统调用读写“扇区”。
物理机的磁盘一般很大,但实际使用的数据可能并不多。我们可以使用sparse稀疏格式的虚拟磁盘来生成更小的虚拟磁盘文件。
qemu-img
命?令?行?工?具?是?Xen和? KVM用?来?格?式?化?各?种?文?件?系?统?的?。
它支持一个sparse格式的文件:qcow2格式的文件。
qcow2,使用了Copyon write技术。它在文件的头部建立了一些块表。块表分成几个级别。类似与Linuxkernel的多级页表。
块表中每一项代表一个块的数据。一个块由多个扇区组成(比如说一个块大小是1MB)。初始时,块表全为0,表示没有分配。当需要向这一个块写入数据时,就把qcow2文件加长1MB。然后把这1MB的文件偏移量设置到块表中该项中。
这样,下次读写该块时,就能够正确读写数据了。
如果你需要一个1TB大小的虚拟磁盘,用qcow2格式创建虚拟磁盘文件,一开始只会占用几百KB大小的空间。它只会在VM真正需要写入数据时才会增加文件的大小。
我们可以使用qemu-imgconvert命令,把我们用dd命令生成的RAW格式的虚拟磁盘转换为qcow2格式的虚拟磁盘。
当发现RAW格式文件中某一个块的数据全为0时,qcow2文件不会为这个块分配空间。这样就能够大大缩小虚拟磁盘文件的大小。
如,RAW格式文件名为vm.img,容量为100G,执行如下命令:
qemu-imgconvert -c -f raw -O qcow2 -S 100G ./vm.img ./vm.qcow2
能够生成一个小得多的qcow2格式的vm.qcow2文件。
现在,你就能够把100G大小的vm.img文件扔掉了!
当然,qcow2格式的虚拟磁盘比RAW格式的虚拟磁盘读写速度会略为下降。因为读写qcow2格式文件,多了一个查表的过程。大小和速度之间的权衡,要看用户具体的需求而定了!
除了KVM/XEN使用sparse虚拟磁盘格式文件:qcow2外,其他主流Hypervisor也有类似的sparse格式的虚拟磁盘文件。具体请看厂商文档。
现代企业中,一般都会使用集中的数据存储SAN。特别是在企业虚拟化环境中更是如此,因为只有用了SAN或者类似的集中网络存储技术,才能实现有效的虚拟机活迁移。
因此,企业也可以选择在把物理机转换为虚拟机的过程中,把物理机的存储转到SAN等集中存储的块设备中。
我们可以在SAN上分配一块和物理机的磁盘一样大小的LUN。然后照样使用dd命令,把物理机的本地磁盘整个备份到LUN上。
这样,Hypervisor只要能够访问这个LUN,就能够启动虚拟机。
现代很多SAN已经支持存储over-commit技术了。就是说,SAN可以导出一个1TB的LUN,但它在SAN上实际只占用几百KB大小的空间。随着使用的增加,会动态增加实际大小。其背后使用的技术也是COW(CopyOn Write)技术!
用户也可以使用LVM来切分LUN为LV。也可以使用前文提到的dd命令,把物理机磁盘整个备份到相同大小的LV中。
现在的LVM也支持存储over-commit技术,用的也是COW(CopyOn Write)技术。
使用LVM,可以给用户提供独立与SAN厂商的存储分配能力。我推荐使用LVM而不是直接使用SAN来存储虚拟磁盘。这让你不被厂商绑定,不会被厂商敲竹杠!