kvm虚拟化小结(十二)nested之KVM的嵌套
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
拿到的压缩包解压后,内容如下:
可以看到上面标注的,主要数据文件在两个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客户端连接后,可以正常启动进入系统。
不过在启动三台主机时出错:
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.
通过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"
2或
3# 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特性:
至此就是通过该环境操作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=)
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/kvm-nested/4745.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.