前言
前一阵子写了篇v2v的博客,主要是倾向于如何使用virt-v2v工具将VSphere平台虚机进行跨平台迁移至KVM环境中。对手动迁移叙述的不够详细,并且对手动手动迁移中的细节描述的也不够具体。在本篇中我将会大篇幅的细叙述如何使用qemu-kvm,qemu-img等kvm命令对虚机进行跨平台迁移,以及针对openstack环境如何制作镜像上传的一些细节。本节中所需要的环境和一些kvm虚拟化的包安装都在上一节中说明,如果对环境有不清楚的请参考上一篇博文。V2V迁移测试–VMware/VSphere环境迁移至KVM
先决条件
1.1在做转化之前一定需要注意的是,VMware的虚机不能安装有VMware的特有驱动。重要的事情这里在提一遍,KVM是没办法把这些驱动模拟出来的。
1.2在准备迁移前事先查看虚机是否有做快照,磁盘存储方式是否是单独磁盘,如果你在VMware上的虚机是有多快照并且存储磁盘方式是多文件存储的话,需要使用vmware-vdiskmanager工具将虚机多磁盘文件合并为单磁盘文件。并且要事先选择你想转化虚机某个状态的快照点,根据快照进行回滚。如果为当前状态则不用考虑。注意一点就是,转换为KVM的虚机之后事先在VMware上的快照将会丢失,这点请务必注意。
vmware-vdiskmanager.exe的语法参数在上一个章节中已经说明这里不再赘述。
磁盘文件转化
kvm中qemu命令支持磁盘格式转化。首先将要转换的vmdk文件拷贝到KVM环境中,使用qemu-img指令查看磁盘文件信息。
#qemu-img info inner-db.vmdk
image: inner-db2-flat.vmdk
file format: vmdk
virtual size: 50G (53687091200 bytes)
disk size: 8G
virtual size表示这个虚拟磁盘文件预定义的大小,disk size表示这个磁盘在文件系统中实际占用的大小。如果引入quota的概念可能会更好理解。你一开始创建虚机的时候定义虚机磁盘上限大小是多少,但是对于不同的文件格式,虚机磁盘文件实际上占的物理机文件系统的大小是不一样的。例如对于vmdk,qcow2文件格式来说,有可能你的虚机一开始定义的是30G但是你实际在这个虚机里面放了4G的文件,那么这个磁盘文件在物理机中实际所占用的大小可能只有4G。
这里给出一个qcow2文件格式的实例:
# qemu-img info disk
image: disk
file format: qcow2
virtual size: 30G (32212254720 bytes)
disk size: 1.7G
# ll -h
total 1.8G
-rw-rw---- 1 qemu qemu 1 Oct 26 02:40 console.log
-rw-r--r-- 1 qemu qemu 1.8G Nov 6 06:12 disk
-rw-r--r-- 1 nova nova 79 Oct 26 02:35 disk.info
-rw-r--r-- 1 nova nova 1.7K Oct 26 02:40 libvirt.xml
这里可以看到他实际上占用的磁盘大小也就1.8G。
我们继续使用qemu-img指令对这个磁盘文件进行转化。
qemu-img convert 语法格式如下:
convert [-c] [-p] [-f fmt] [-t cache] [-T src_cache] [-O output_fmt] [-o options] [-S sparse_size] filename [filename2 […]] output_filename
-c 表示目标镜像必须被压缩(仅支持qcow2)这种压缩是只读的,如果压缩的扇区被重写,则会被重写为未压缩的数据。
-p 显示转化进程的参数
-f参数,是指定文件的格式,如果不是指定格式qemu-img会自动检测。
-O 输出镜像文件格式,默认会被转换为raw文件格式。
-o 表示可以添加的选项,例如可以指定文件的大小,是否加密,后端镜像。
-S 表明在转换的过程中qemu-img命令创建出一串连续个含0的稀疏镜像。
支持的格式如下:
raw cow qcow vdi vmdk cloop dmg bochs vpc vvfat qcow2 qed vhdx parallels nbd blkdebug null host_cdrom host_floppy host_device file gluster
转化语句
#qemu-img convert -f vmdk -O qcow2 inner_db.vmdk(原有磁盘文件名) inner_db.qcow2(转化磁盘文件名)
[root@iaas img]# qemu-img info inner_db.qcow2
image: inner-db2-flat.img
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 15G
cluster_size: 65536
这里的显示有稍微有点不同了,块设备被保存在了cluster中。每个lcuster包含了若干个sector,每个sector有512个字节。
保险起见可以在装换完之后使用check参数对装换的磁盘进行检查,确保转换没有问题。检查命令如下:
#qemu-img check inner_db.qcow2
check [-f fmt ] filename 查找镜像文件中的错误,目前仅支持对“qcow2”,“qed”,“vdi”格式文件的检查。
如果检查没有任何报错的话则会看到输出语句为:”No errors were found on the image. “
使用qemu-kvm命令打开转换后的磁盘镜像
这一步非常关键,需要加载适当的驱动来正常打开镜像,加载根分区,配置客户化特定想要的信息在系统中。所以在这里需要事先查一下你的虚机在vmware中使用的是什么总线,是否在系统中安装了virtIO等等。在附注中,我会给大家拓展一些qemu-kvm所支持和能够加载的驱动类型。
当然使用virt-manage图形化工具也是可以的,上一篇博客中说明了所以这里我们的侧重点是没有图形化界面系统时该怎么操作。
使用的是命令依旧是qemu-kvm,语法如下:
qemu-kvm 选项 值 [选项 值……]
qemu-kvm -name inner_db -smp 8 -m 8000 -drive file=inner-db.qcow2 -net nic -net user -usbdevice tablet -vnc :99
这里针对我所使用的参数给出了具体的解释,关于这个命令更多的信息可以参考如下链接:
http://qemu.weilnetz.de/qemu-doc.html
-name string1[,process=string2]
为这个虚拟机设置名称,string1表示设置窗口title显示的名字,string2表示设置这台虚机在linux中进程的名字。
-smp [cpus=]n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]
指定了cpu的核数,同样也可以指定核心数和线程数
-m megs 设置虚拟内存大小,默认是128MB
-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]
指定驱动镜像,模拟输出的虚拟驱动,bus总线类型。
file参数指定了使用哪个镜像来,如果文件名包含了逗号的话需要再用一个逗号隔开。例如(”file=my.file”则需要使用”file=mu..file”)
if=interface
这个选项定义了哪种类型的接口加载到这个虚机中,可用的类型选项为:ide,scsi,sd,mtd,floppy,pflash,virtio
bus=bus,unit=unit
这两个选项定义了从bus何unit的那个位置来启动这个虚机。
index=index
这个选项定义了使用一个可用的列表接到驱动器,列表中的列出了可用接口类型。
-net nic[,vlan=n][,macaddr=mac][,model=type] [,name=name][,addr=addr][,vectors=v]
指定网卡类型和使用
name 在监控命令中赋值给net一个名称
nic 创建一个新的网卡然后连接到vlan上(默认vlan是0),PC机上NIC设备类型默认是e1000。QEMU可以模拟不同几种不同型号的网卡,例如: virtio, i82551,i82557b, i82559er,ne2k_pci, ne2k_isa, pcnet, rtl8139,e1000, smc91c111, lance and mcf_fec。具体机器要具体区分,可以使用 -net nic,model=?来查看你机器上能够支持模拟的网卡。
-usbdevice 添加指定use设备驱动
tablet 使用绝对坐标来构造一个输出设备,这意味着QEMU不需要抓取鼠标从而能够获取到鼠标的位置。
注:除开tablet之外还有起的USB驱动设备
mouse:虚拟鼠标设备,当激活使用这个选项的时候将会覆盖PS/2模拟鼠标。
-vnc 使用vnc来打开这个镜像
之后使用VNC来打开这个镜像:
至此,如果能使用得了vnc打开镜像,看到系统被成功加载并且能进入系统看到网卡能被正常显示说明成功加载出系统,镜像的转换没有问题了。之后如果需要对这个镜像做特殊化配置的话就看各位的需求了。这里不做详细说明。
注:作者在打开这个镜像的时候没有指定驱动的参数,如果想精益求精的大大们需要根据qemu支持的驱动和你在VMware安转虚机的驱动做对比,然后可以设置驱动参数。
将制作好的镜像上传到glance中
实际生产环境中由于glance下挂的存储可能不仅仅是本地存储或者iscsi存储,很有可能是分布式存储例如ceph或者smartx,如果使用到了ceph或者smartx如果不能自动同步到池中可能还需要在后端导入。这里不是本文的重点,如果不会的童鞋还请Google~
这里说明下怎么用指令上传,在指令中该如何加参数来适应vmware虚拟化的虚拟机。指令介绍 glance image-create
#glance image-create --name inner_db --is-public True --min-disk 50 --property os_type=linux --container-format bare hw_disk_bus=ide hw_vif_model=pcnet --disk-format qcow2 --file ./inner_db.qcow2
--name 指定这个镜像的名字
--is-public 是否允许镜像公开访问
--propery 指定镜像的属性
--disk-format 镜像的格式,可以接受的格式包含:ami,ari,aki,vhd,vmdk,raw,qcow2,vdi,iso。
--container-format 镜像容器的格式,可以接受的格式包含:ami,ari,bare,ovf。
hw_disk_bus=ide/hw_vif_model=pcnet(e1000)追加适用于vmware的参数
在这里可以对比我用virt-v2v指令转化的虚机生成的xml文件来看看。就知道我为什么要指定hw_disk_bus=ide/hw_vif_model=pcnet这两个参数。
上传镜像成功之后就可以用该镜像批量创建虚机。至此跨平台迁移到这里也暂时告一段落了。
附注
qemu的系统仿真支持以下系统,在使用qemu-kvm打开镜像的时候请注意
* PC (x86 or x86_64 processor)
* ISA PC (old style PC without PCI bus)
* PREP (PowerPC processor)
* G3 Beige PowerMac (PowerPC processor)
* Mac99 PowerMac (PowerPC processor, in progress)
* Sun4m/Sun4c/Sun4d (32-bit Sparc processor)
* Sun4u/Sun4v (64-bit Sparc processor, in progress)
* Malta board (32-bit and 64-bit MIPS processors)
* MIPS Magnum (64-bit MIPS processor)
* ARM Integrator/CP (ARM)
* ARM Versatile baseboard (ARM)
* ARM RealView Emulation/Platform baseboard (ARM)
* Spitz, Akita, Borzoi, Terrier and Tosa PDAs (PXA270 processor)
* Luminary Micro LM3S811EVB (ARM Cortex-M3)
* Luminary Micro LM3S6965EVB (ARM Cortex-M3)
* Freescale MCF5208EVB (ColdFire V2).
* Arnewsh MCF5206 evaluation board (ColdFire V2).
* Palm Tungsten|E PDA (OMAP310 processor)
* N800 and N810 tablets (OMAP2420 processor)
* MusicPal (MV88W8618 ARM processor)
* Gumstix "Connex" and "Verdex" motherboards (PXA255/270).
* Siemens SX1 smartphone (OMAP310 processor)
* AXIS-Devboard88 (CRISv32 ETRAX-FS).
* Petalogix Spartan 3aDSP1800 MMU ref design (MicroBlaze).
* Avnet LX60/LX110/LX200 boards (Xtensa)
QEMU PC系统模拟器模拟外围设备如下:
* i440FX host PCI bridge and PIIX3 PCI to ISA bridge
* Cirrus CLGD 5446 PCI VGA card or dummy VGA card with Bochs VESAextensions (hardware level, including all non standard modes).
* PS/2 mouse and keyboard
* 2 PCI IDE interfaces with hard disk and CD-ROM support
* Floppy disk
* PCI and ISA network adapters
* Serial ports
* Creative SoundBlaster 16 sound card
* ENSONIQ AudioPCI ES1370 sound card
* Intel 82801AA AC97 Audio compatible sound card
* Intel HD Audio Controller and HDA codec
* Adlib (OPL2) - Yamaha YM3812 compatible chip
* Gravis Ultrasound GF1 sound card
* CS4231A compatible sound card
* PCI UHCI USB controller and a virtual USB hub.
SMP支持的最大CPU上限为255个。