KVM 在2013年左右在当时的公司中一直做为生产环境在用,习惯以后,在自己平时的测试环境中也不再使用vmware workstation 和 EXSi 。不过最近在了解rhel 7 版本的rhce 课程。拿到的一套rhce 环境解压后发现是vmdk 格式的。这里通过qemu-img工具转换后,导入kvm并成功启动该环境。比较坑爹的是进到该虚拟机里后,里面又开了三个KVM虚拟机---classroom 、server、desktop 。KVM 启动的guest 主机的cpu 默认是不支持vmx 的,所以kvm guest 里再开启 kvm 一样不成功,后来通过开启nested 成功在虚拟机中运行虚拟机。

一、vmware转qcow2

拿到的压缩包解压后,内容如下:

vmware

可以看到上面标注的,主要数据文件在两个vmdk文件中,先通过qemu-img 查看两个vmdk文件的信息如下:

 1[root@361way RHEL7.0_Server]# qemu-img info RHEL7_Server.vmdk
 2image: RHEL7_Server.vmdk
 3file format: vmdk
 4virtual size: 200G (214748364800 bytes)
 5disk size: 9.7G
 6cluster_size: 65536
 7Format specific information:
 8    cid: 1940791077
 9    parent cid: 4294967295
10    create type: monolithicSparse
11    extents:
12        [0]:
13            virtual size: 214748364800
14            filename: RHEL7_Server.vmdk
15            cluster size: 65536
16            format:
17[root@361way RHEL7.0_Server]# qemu-img info RHEL7_Server-000002.vmdk
18image: RHEL7_Server-000002.vmdk
19file format: vmdk
20virtual size: 200G (214748364800 bytes)
21disk size: 36M
22cluster_size: 65536
23backing file: RHEL7_Server.vmdk
24Format specific information:
25    cid: 2122094490
26    parent cid: 1940791077       ---> 父cid为 RHEL7_Server.vmdk
27    create type: monolithicSparse
28    extents:
29        [0]:
30            virtual size: 214748364800
31            filename: RHEL7_Server-000002.vmdk
32            cluster size: 65536
33            format:

接下来将vmdk文件转换为qcow2文件:

1# qemu-img  convert -f vmkd -O qcow2 RHEL7_Server.vmdk jiaoshiji.img

转换完成后,可以参看kvm虚拟化小结(六)libguestfs-tools 篇 ,查看镜像文件的内容。经该步确认,我这里只需要用到RHEL7_Server.vmdk 文件,RHEL7_Server-000002.vmdk 文件非必须,这里就不再进行转换。

二、启动虚拟机

从当前已经存在的的kvm guest主机中,复制了一个jiaoshiji.xml 模板,并更改相关信息后,通过virsh define /xxxx/jiaoshiji.xml 并virsh start jiaoshi 时发现启不成功。这里换成直接使用kvm命令试下:

1# /usr/libexec/qemu-kvm -m 4096 -drive file=jiaoshiji.qcow2 -vnc 0.0.0.0:20

通过VNC客户端连接后,可以正常启动进入系统。

rhce-classroom

不过在启动三台主机时出错:

error: Faild to start domain classroom error: unsupported configuration: Domain requires KVM, but it is not available. Check that virtualization is enabled in the host BIOS, and host configuration is setup to load the kvm modules.

rht-vmctl

通过cat /proc/cpuinfo 发现kvm guest 主机的cpu 不支持vmx 特性。通过查看物理机的-cpu 参数,结果如下:

 1[root@361way RHEL7.0_Server]# /usr/libexec/qemu-kvm -cpu help
 2x86           qemu64  QEMU Virtual CPU version 1.5.3
 3x86           phenom  AMD Phenom(tm) 9550 Quad-Core Processor
 4x86         core2duo  Intel(R) Core(TM)2 Duo CPU     T7700  @ 2.40GHz
 5x86            kvm64  Common KVM processor
 6x86           qemu32  QEMU Virtual CPU version 1.5.3
 7x86            kvm32  Common 32-bit KVM processor
 8x86          coreduo  Genuine Intel(R) CPU           T2600  @ 2.16GHz
 9x86              486
10x86          pentium
11x86         pentium2
12x86         pentium3
13x86           athlon  QEMU Virtual CPU version 1.5.3
14x86             n270  Intel(R) Atom(TM) CPU N270   @ 1.60GHz
15x86      cpu64-rhel6  QEMU Virtual CPU version (cpu64-rhel6)
16x86           Conroe  Intel Celeron_4x0 (Conroe/Merom Class Core 2)
17x86           Penryn  Intel Core 2 Duo P9xxx (Penryn Class Core 2)
18x86          Nehalem  Intel Core i7 9xx (Nehalem Class Core i7)
19x86         Westmere  Westmere E56xx/L56xx/X56xx (Nehalem-C)
20x86      SandyBridge  Intel Xeon E312xx (Sandy Bridge)
21x86          Haswell  Intel Core Processor (Haswell)
22x86        Broadwell  Intel Core Processor (Broadwell)
23x86       Opteron_G1  AMD Opteron 240 (Gen 1 Class Opteron)
24x86       Opteron_G2  AMD Opteron 22xx (Gen 2 Class Opteron)
25x86       Opteron_G3  AMD Opteron 23xx (Gen 3 Class Opteron)
26x86       Opteron_G4  AMD Opteron 62xx class CPU
27x86       Opteron_G5  AMD Opteron 63xx class CPU
28x86             host  KVM processor with all supported host features (only available in KVM mode)
29Recognized CPUID flags:
30  pbe ia64 tm ht ss sse2 sse fxsr mmx acpi ds clflush pn pse36 pat cmov mca pge mtrr sep apic cx8 mce pae msr tsc pse de vme fpu
31  hypervisor rdrand f16c avx osxsave xsave aes tsc-deadline popcnt movbe x2apic sse4.2|sse4_2 sse4.1|sse4_1 dca pcid pdcm xtpr cx16 fma cid ssse3 tm2 est smx vmx ds_cpl monitor dtes64 pclmulqdq|pclmuldq pni|sse3
32  smap adx rdseed rtm invpcid erms bmi2 smep avx2 hle bmi1 fsgsbase
33  3dnow 3dnowext lm|i64 rdtscp pdpe1gb fxsr_opt|ffxsr mmxext nx|xd syscall
34  perfctr_nb perfctr_core topoext tbm nodeid_msr tce fma4 lwp wdt skinit xop ibs osvw 3dnowprefetch misalignsse sse4a abm cr8legacy extapic svm cmp_legacy lahf_lm
35  pmm-en pmm phe-en phe ace2-en ace2 xcrypt-en xcrypt xstore-en xstore
36  kvm_pv_unhalt kvm_pv_eoi kvm_steal_time kvm_asyncpf kvmclock kvm_mmu kvm_nopiodelay kvmclock
37  pfthreshold pause_filter decodeassists flushbyasid vmcb_clean tsc_scale nrip_save svm_lock lbrv npt

通过在启动时,-cpu Nehalem 等尝试使用各种CPU,发现启动的虚拟机都无法支持vmx 。通过查看CPU定义的默认配置文件/usr/share/libvirt/cpu_map.xml ,发现默认的定义的几种类型的CPU都没有包含vmx项(fedora系统的KVM CPU定义文件为/usr/share/qemu-kvm/cpu-model/cpu-x86_64.conf)。本来正准备尝试通过修改该文件使CPU默认支持VMX特性,不过在查相关资料时发现了嵌套式虚拟nested 技术。

三、嵌套式虚拟nested

嵌套式虚拟nested是一个可通过内核参数来启用的功能。它能够使一台虚拟机具有物理机CPU特性,支持vmx或者svm(AMD)硬件虚拟化。关于nested的具体介绍,可以看这里 。该特性需要内核升级到Linux 3.X版本 ,所以在centos6下是需要先升级内核的,而在centos7下已默认支持该特性,不过默认是不开启的,需要通过修改参数支持。

1、确认主机是否支持nested

通找到如下文件或在模块特性中能grep到该特性值 ,证明当前内核支持nested,如下是查到支持但未开启:

1#查看当前系统是否支持nested
2systool -m kvm_intel -v  | grep -i nested
3nested              = "N"
4#或者这样查看
5cat /sys/module/kvm_intel/parameters/nested
6N

2、开机启动该nested

有两种方法可以开机自启动该特性:

1在 kernel 那一行的末端加上 "kvm-intel.nested=1"
23# echo "options kvm-intel nested=1" >> /etc/modprobe.d/kvm-intel.conf

不重启主机也可以通过重新加载模块支持:

1# rmmod kvm_intel
2# modprobe kvm-intel nested=1
3# cat /sys/module/kvm_intel/parameters/nested
4Y

3、建议VMX支持虚拟机

通过virsh 指定xml 文件启动虚拟机时,可以在xml 中通过如下三种方法支持

 1<cpu mode='custom' match='exact'>
 2    <model fallback='allow'>core2duo</model>
 3    <feature policy='require' name='vmx'/>
 4  </cpu>
 5#这种方式为虚拟机定义需要模拟的CPU类型"core2duo",并且为虚拟机添加"vmx"特性
 6#也可以使用这种
 7  <cpu mode='host-model'>
 8    <model fallback='allow'/>
 9  </cpu>
10#或者这样
11 <cpu mode='host-passthrough'>
12    <topology sockets='2' cores='2' threads='2'/>
13  </cpu>
14#CPU穿透,在虚拟机中看到的vcpu将会与物理机的CPU同样配置,这种方式缺点在于如果要对虚拟机迁移,迁移的目的服务器硬件配置必须与当前物理机一样

通过qemu-kvm 命令启动时,可以通过如下参数支持:-enable-kvm -cpu qemu64,+vmx

四、成功运行rhce虚拟机

以下才是本篇嵌套虚拟机的重点

通过如下方法启动jiaoshiji 虚拟机:

1/usr/libexec/qemu-kvm -m 8096 -cpu qemu64,+vmx  -smp 4,sockets=4,cores=1,threads=1 -drive file=jiaoshiji.qcow2 -vnc 0.0.0.0:20

VNC连接后,通过cat /proc/cpuinfo查看支持VMX特性:

qemu64-vmx

至此就是通过该环境操作rhce环境了,如果嫌每次者了跳到VNC里操作不爽,也可以通过以下三种方简单解决:

  • 方法1:启qemu-kvm 的-serial参数(串口功能),可以通过-serial tcp:192.168.0.2:4444 启动映射物理机端口,并开启jiaoshiji 的串口连接--- 在kernel 启动时加,这个在之前的kvm 总结中有。再连接时可以通过SCRT进接;

  • 方法2:对jiaoshiji 虚拟机配置一个桥接网络,和物理机在同一个网段,跳到jiaoshiji 后再通过ssh跳另外三台主机;

  • 方法3:将jiaoshiji 内的三台主机qcow2镜像和xml 文件复制出来,在直接埴加到外面的物理机中。

参考文档

[百度文库 kvm嵌套虚拟化的配置方法](http://wenku.baidu.com/view/1f59aa7b866fb84ae45c8d9d.html target=)

fedoraproject虚拟化文档