v2v(virtual machine to virtual machine)是通过各种手段将不同平台的虚拟机进行迁移的一种方式。现在常见的迁移有
VMware –> KVM
KVM –> VMware
Xen –> VMware
本篇将介绍如何使用工具和手动方式来将VMware上虚机迁移到KVM环境中,以及博主在实际操作中遇到一些实际问题的troubleshooting。
分为两种,一种是静态迁移,另一种是在线迁移。
静态迁移(offline migration)也叫做常规迁移,离线迁移。在迁移之前将虚拟机暂停,同时拷贝虚拟机镜像和状态到目的主机。相比较于在线迁移(online migration),其缺点就是静态迁移方式的过程需要显式的停止虚拟机的运行,而在线迁移的过程仅有非常短暂的停机时间,保证迁移过程中虚拟机服务的持续可用;静态迁移的优点是兼容性强,不需要VMM的同意API接口,可以借助第三方工具辅助迁移。由于目前VMM的开发没有统一的标准,不同的虚拟化厂商,尤其是闭源的厂商开发的VMM各成一套,静态迁移是解决不同类型虚拟机之间迁移的有效办法。我们分别演示使用手动方式将VMware虚拟机迁移到KVM和使用自动化迁移工具virt-v2v方式来迁移。
成功迁移虚拟机的一个重要的验证标准就是文件的正确性和完整性。下图中列出与 VMware 虚拟机相关的文件,但是迁移 VMware 虚拟机到 KVM 并不需要用到所有的文件。
VMware 虚拟机的文件主要包括 .nvram 文件,.vmx 文件,vmdk 文件,.vswp 文件,.vmss 文件,.vmsd 文件,.vmsn 文件,.log 文件,.vmxf 文件。与迁移相关的最主要的是 .vmx 文件和 .vmdk 文件。
* .vmx 文件:包括虚拟机所有配置信息与硬件设置。不管你对虚拟机的设置做了何种编辑,所有的信息都会以文本形式保存在这个文件里。如特殊硬件配置(例如 RAM 大小,网络接口信息,硬盘驱动信息,串行与并行信息),高级能源与资源配置、VMware 工具选项及能源管理选项。迁移虚拟机时,需要更改这个文件的格式到 KVM 支持的 xml 文件,并且重新确认文件信息的有效性。
* .vmdk 文件:包含虚拟磁盘的信息。虚拟机的文件系统就建立在 .vmdk 文件上。迁移时需要拷贝这个文件到 KVM 主机,并且转换成能够被 libvirt 识别的文件格式。
* 以下的虚拟机文件有些只在虚拟机处于的某种状态时出现,迁移过程中不会用到。例如当虚拟机开启时出现 .vswp 文件,当虚拟机暂停时出现 .vmss 文件。
* .nvram 文件:包括虚拟机启动过程一部分的 Phoenix BIOS。它类似于拥有 BIOS 芯片的物理服务器,能够设置硬件配置选项。如果删除的话,在虚拟机启动时会自动地重新创建。
* .vswp file:这些文件的大小等于分配给虚拟机的内存大小,再减去任何内存预留(默认是 0)。这些文件通常创建在虚拟机里,但是只有当 ESX 主机耗尽所有物理内存时才使用。当虚拟机关闭或暂停时,这些文件将删除。
* .vmss 文件:这个文件用于虚拟机暂停时,保存虚拟机的存储内容,以便在重新开始时继续运行。
* .vmsd 文件:这个文件与快照一起使用,用于存储元数据和其他活动在虚拟机里的每个快照的信息。这个文本文件在创建快照之前的初始大小是 0 字节,并在每次创建或删除快照时更新信息。
* .vmsn 文件:这个文件与快照一起使用,用于存储虚拟机在进行快照时的状态。每在虚拟机上创建一个快照就会生成一个 .vmsn 文件,在删除快照时,文件自动删除。
* .log 文件:这些文件创建来用于存储虚拟机的日志信息,并常常用于故障检查。在虚拟机目录里,有大量的这样的文件。当前的日志文件通常命名为 vmware.log。
* .vmxf 文件:这是一个附加配置文件,不用于 ESX,用于与 Workstation 兼容的目的。这个文件是文本格式,Workstation 用来聚合虚拟机(VM teaming),将多个虚拟机分配成一组,作为一个单一对象开启或关闭、暂停或恢复它们。
2.使用virt-v2v迁移虚拟机
virt-v2v 是由 perl 语言编写的脚本,可以自动化的将创建在 Xen,KVM 和 VMware ESX 上的虚拟机拷贝到 virt-v2v 的主机,并且自动的更改配置,使之能够被 libvirt 进行管理。目前,virt-v2v 支持静态迁移下列虚拟机:RHEL4、RHEL5, RHEL6,Windows XP,Windows Vista, Windows 7, Windows Server 2003 和 Windows Server 2008。
yum install -y qemu-kvm
yum install -y libvirt
yum install -y virt-manager
yum install -y virt-v2v
这里演示如何将VMspher下的linux虚拟机通过工具和VMware workstation手动的方式迁移到KVM环境中。
如果虚机是ESXi种的虚机,那么我们可以使用virt-v2v的工具直接进行自动迁移。virt-v2v工具可以将其他hypervisor平台上的虚拟机迁移到KVM上。它可以读取Xen,Hyper-v,VMware平台上的虚拟机,将它们迁移到由libvirt管理的KVM,openstack或者RHEV环境中。本节只针对ESCi上如何将虚机迁移到KVM中,往openstack和RHEV上迁移只需要转换镜像和导入即可不做赘述。
mkdir -p /data/vmfs
virsh pool-define-as vmdisk --type dir --target /data/vmfs
virsh pool-build vmdisk
virsh pool-autostart vmdisk
virsh pool-start vmdisk
(本步骤不是必须步骤,如果不做配置的话则在使用virt-v2v的时候需要稍微改变命令)
vim /root/.netrc
machine YourESXiServerIPAddress login root password YourESXiServerIPAddress
chmod 0600 ~/.netrc
virsh -c esx://172.17.20.80/no_verify=1 list --all
如果能够看到运行在这个ESXi上的主机说明连接没有问题。
virt-v2v -ic esx://172.17.20.80/no_verify=1 -os vmdisk -of qcow2 -b virbr0 inner-db
注:1.如果遇到了类似于“ Peer certificate cannot be authenticated with given CA certificates”这一类的错误通过在url后面设置no_verify=1 参数来忽略证书检查。
2.整个url的组成由user@esxi组成。如果在3.2没有创建认证文件的话这里需要将命令改成如下
virt-v2v -ic esx://[email protected]/no_verify=1 -os vmdisk -of qcow2 -b virbr0 inner-db
3.如果用户名使用的是域账户(domain\name)或者虚机名中包含有反斜线,则反斜线需要转码特殊标示,使用“%5c”代替“\”
4.-os表示指定到KVM中的哪个存储池,-of表示迁移转出的虚机磁盘格式,我这里指定的事qcow2,-b表示指定KVM中的虚拟网桥。
输出结果如下
[root@localhost ~]# virt-v2v -ic esx://172.17.20.80/?no_verify=1 -os vmdisk -of qcow2 -b virbr0 inner-db
db_inner-db2: 38% [==*================================= ]ETA 13:39db_inner-db2: 100% [==============================================================================================]D 1h26m58s
virt-v2v: No capability in config matches os='linux' name='virtio' distro='rhel' major='3' minor='8'
virt-v2v: No capability in config matches os='linux' name='cirrus' distro='rhel' major='3' minor='8'
virt-v2v: WARNING: Display driver was updated to cirrus, but unable to install cirrus driver. X may not function correctly
virt-v2v: WARNING: /etc/fstab references unknown device /dev/cdrom. This entry must be manually fixed after conversion.
virt-v2v: inner-db configured without virtio drivers.
(因为迁移的目标虚机中没有安转virtio驱动所以报错,这里可以忽略)
这里需要注意v2v工具把虚机的磁盘bus总重定义为了ide的,说明盘符变成了hd形式,如果出现开机无法加载则需要把启动步骤暂定进入启动文件修改启动分区,把/dev/sda1改成/dev/hda1,这里具体盘符视每个人的自己情况修改。
virsh list --all查看KVM下的虚机
virsh strrt inner-db 开启虚拟机
这里说的手动迁移思路指的是,将VMspher或者VMware workstation中的虚拟机运用命令的方式来迁移。在刚刚的VMware知识扩展中我们可以了解到,VMware存储虚机的文件系统可以分为两种模式,一种是单文件的存储,一种是多文件存储。在这里最好处理的就是单文件情况。如果遇到了多文件来提供虚机的磁盘存储情况我们需要使用vmware自带的工具来做文件合并。因为在KVM中是不支持多个存储文件的。介于在VMsphere中可以直接使用virt-v2v的命令来进行v2v的迁移,所以自动的就能将多存储文件合并,所以这里只针对在VMware workstation中如何将多存储文件进行合并。VMware Workstation自带了一个离线的磁盘管理工具vmware-vdiskmanager.exe。
命令语法:
vmware-vdiskmanager [选项]
这里的选项你必须包含以下的一些选择项或参数
选项和参数
描述
在powershell中运行vmware-vdiskmanager命令
PS C:\WINDOWS\system32> F:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager -r F:\Virtual Machines\db\i nner-db2.vmdk -t 0 F:\Virtual Machines\db\inner-db2-new.vmdk
注意:
1.指定vmware-vdiskmanager的绝对路径和与当前目录的相对路径
2.多个文件存储的话指定那个几K或者几百K的vmdk描述文件而不用一一指定那些存储文件
参数解释:
-r
转换已经指定类型的虚拟磁盘的类型,结果会输出创建一个新的虚拟磁盘。你必须用-t选项来指定你想要转换成的磁盘类型,并且指定目标虚拟磁盘的文件名。一旦转换完成,你可以先测试虚拟磁盘以确保它能够像你所希望的那样工作,然后再删除原来的那个虚拟磁盘文件。为了让虚拟机重新认识转换后的虚拟磁盘,你应该使用虚拟机设置编辑器先从虚拟机中移除先前存在的虚拟磁盘,然后添加转换好的虚拟磁盘给虚拟机。
-t [0|1|2|3]
你在创建一个新的虚拟磁盘或者重新配置一个虚拟磁盘时必须指定虚拟磁盘的类型。指定以下类型之一:
0 —— 创建一个包含在单一虚拟文件中的可增长虚拟磁盘
1 —— 创建一个被分割为每个文件2GB大小的可增长虚拟磁盘
2 —— 创建一个包含在单一虚拟文件中的预分配虚拟磁盘
3 —— 创建一个被分割为每个文件2GB大小的预分配虚拟磁盘
Usage: vmware-vdiskmanager.exe OPTIONS |
Offline disk manipulation utility
Operations, only one may be specified at a time:
-c : create disk. Additional creation options must
be specified. Only local virtual disks can be
created.
-d : defragment the specified virtual disk. Only
local virtual disks may be defragmented.
-k : shrink the specified virtual disk. Only local
virtual disks may be shrunk.
-n : rename the specified virtual disk; need to
specify destination disk-name. Only local virtual
disks may be renamed.
-p : prepare the mounted virtual disk specified by
the mount point for shrinking.
-r : convert the specified disk; need to specify
destination disk-type. For local destination disks
the disk type must be specified.
-x <new-capacity> : expand the disk to the specified capacity. Only
local virtual disks may be expanded.
-R : check a sparse virtual disk for consistency and attempt
to repair any errors.
-e : check for disk chain consistency.
-D : make disk deletable. This should only be used on disks
that have been copied from another product.
Other Options:
-q : do not log messages
Additional options for create and convert:
-a : (for use with -c only) adapter type
(ide, buslogic, lsilogic). Pass lsilogic for other adapter types.
-s : capacity of the virtual disk
-t : disk type id
Disk types:
0 : single growable virtual disk
1 : growable virtual disk split in 2GB files
2 : preallocated virtual disk
3 : preallocated virtual disk split in 2GB files
4 : preallocated ESX-type virtual disk
5 : compressed disk optimized for streaming
6 : thin provisioned virtual disk - ESX 3.x and above
The capacity can be specified in sectors, KB, MB or GB.
The acceptable ranges:
ide/scsi adapter : [1MB, 8192.0GB]
buslogic adapter : [1MB, 2040.0GB]
ex 1: vmware-vdiskmanager.exe -c -s 850MB -a ide -t 0 myIdeDisk.vmdk
ex 2: vmware-vdiskmanager.exe -d myDisk.vmdk
ex 3: vmware-vdiskmanager.exe -r sourceDisk.vmdk -t 0 destinationDisk.vmdk
ex 4: vmware-vdiskmanager.exe -x 36GB myDisk.vmdk
ex 5: vmware-vdiskmanager.exe -n sourceName.vmdk destinationName.vmdk
ex 6: vmware-vdiskmanager.exe -r sourceDisk.vmdk -t 4 -h esx-name.mycompany.com \
-u username -f passwordfile "[storage1]/path/to/targetDisk.vmdk"
ex 7: vmware-vdiskmanager.exe -k myDisk.vmdk
ex 8: vmware-vdiskmanager.exe -p
(A virtual disk first needs to be mounted at )
转换成一个单文件的vmdk存储文件之后,将这个文件拷贝到你KVM环境下的linux机器中。
qemu-img convert -f vmdk -O qcow2 inner-db.vmdk db_inner-db.qcow2
(建议cd到你拷贝文件的目录执行,方便操作
qemu-img info db_inner-db.qcow2
[root@template test]# qemu-img info db_inner-db2
image: db_inner-db2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 50G
cluster_size: 65536
在本地环境中挂载这个卷然后查看所要迁移虚机的磁盘格式,这个很重要,要是选择磁盘格式错误的话之后挂载很可能因为驱动问题无法找到根分区。这里给出三种挂载方式分别针对qcow2和raw的镜像来如何挂载。
1.使用nbd挂载qcow2磁盘文件:(如果没有nbd驱动的话请看第二种)
modprobe nbd max_part=8
qemu-nbd -c /dev/nbd0 db_inner-db.qcow2
mount /dev/nbd0p1 /mnt
查看这个迁移虚机的分区。
umount分区
#umount /mnt
#qemu-nbd -d /dev/nbd0
2.当然你也可以使用guestmount来挂载
guestmount -a 磁盘文件 –rw -m 要挂载的磁盘分区 本地目录
guestmount -a db_inner-db2 --rw -m /dev/sda2 /mnt/
3.挂载raw格式的磁盘
对于已分区的挂载:
losetup /dev/loop0 db_inner-db2
kpartx -a /dev/loop0
mount /dev/mapper/loop0p1 /mnt
注意:
kpartx命令用来让Linux内核读取一个设备上的分区表,然后生成代表相应分区的设备。
之后的话使用qemu命令来打开下这个镜像看是否能够打开
qemu-kvm -name inner_db -smp 8 -m 8000 -drive file=db_inner-db2-flat.qcow2,if=virtio -net nic,model=virtio -net user -usbdevice tablet -vnc :94
注意:如果待虚机的一开始没有安转virtio驱动的话,用这个命令是无法加载根分区的。
然后使用vnc打开查看
之后我在这里出了一个错误,错误如下
(笔者在之后用virt-v2v工具转的自后才发现虚机的磁盘驱动是ide的所以一开始很纳闷为什么会找不到根分区,因为笔者不知道虚机在vmware上配置。)
如果虚机在vmware使用的是ide的bus总线则需要将virtio参数去掉。
qemu-kvm -name inner_db -smp 8 -m 8000 -drive file=db_inner-db2-flat.qcow2 -net nic -net user -usbdevice tablet -vnc :94
如果能够通过vnc链接看到系统正常加载启动的画面说明可以在KVM中使用这个镜像创建虚机。这个时候只需要使用virt-manager图形化操作即可。将虚机的镜像指定为本地的我们刚刚转好的qcow2镜像即可。
这里记得选择“import existing disk image”
注意在之后的创建虚机的过程当中配置需要尽可能的与vmware中虚机的配置一致,否则很有可能导致创建不成功。
如果有读者想在虚机中做这方面的测试一定要开启虚机支持硬件虚拟化,否则转换的时候会出现错误。
类似于:qemu-img:…:CURL:Error opeing file: Server does not support ‘rang’(byte ranges)
查看是否支持硬件虚拟化的方法
egrep '(vmx|svm)' /proc/CPUinfo
参考文献
http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm3/
http://libguestfs.org/virt-v2v.1.html#output-to-rhev