To be a better coder
分类: LINUX
2017-12-29 13:46:19
cpu支持虚拟化, 虚拟机软件(例如kvm)是全虚拟化,仅需要模拟一部分硬件指令,虚机性能更高。
cpu不支持虚拟化, 虚拟机软件(例如xen)是半全虚拟化,需要模拟全部硬件指令,虚机性能要差些。
半虚拟化(Para-Virtualization),全虚拟化
1、KVM的虚拟化需要硬件支持(如IntelVT技术或者AMDV技术)。是基于硬件的完全虚拟化。
2、Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己到进程调度器,存储管理模块等,所以代码较为庞大。
3、广为流传的商业系统虚拟化软件VMwareESX系列也是基于软件模拟的Para-Virtualization。
关于KVM:
· KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。
· 是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。
· 它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。
· KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。
· KVM能在不改变linux或windows镜像的情况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)。
· 在主流的Linux内核,如2.6.20以上的内核均已包含了KVM核心。
[1] 硬件支持
KVM需要虚拟机宿主(host)的处理器带有虚拟化支持(对于Intel处理器来说是VT-x,对于AMD处理器来说是AMD-V)。你可以通过以下命令来检查你的处理器是否支持虚拟化:
$ lscpu
如果你的处理器支持虚拟化,输出结果中会有一行Virtualization的信息。
你也可以运行:
$ grep -E "(vmx|svm)" --color=always /proc/cpuinfo
如果运行后没有显示,那么你的处理器不支持硬件虚拟化,你不能使用KVM。
注意: 您可能需要在BIOS中启用虚拟化支持
[2] KVM模块
如果你的内核是用 CONFIG_IKCONFIG_PROC 这个选项编译的话,你可以通过以下命令来检查你的内核是否已经包含了支持虚拟化所必须的模块(kvm及kvm_amd与kvm_intel这两者中的任意一个):
$ zgrep KVM /proc/config.gz
如果模块设置不等于 y或m,则该模块不可用。
嵌套虚拟化就是在基于宿主机A搭建的虚拟机B上再跑一个虚拟机C。主要问题在于,虚拟机B是否支持硬件虚拟化,否则KVM无法启用。
[1]方法一
在宿主机A启用kvm_intel模块的嵌套虚拟化功能:
# modprobe -r kvm_intel
# modprobe kvm_intel nested=1
使嵌套虚拟化永久生效:
/etc/modprobe.d/modprobe.conf
options kvm_intel nested=1
检验嵌套虚拟化功能是否已被激活:
$ systool -m kvm_intel -v | grep nested
nested = "Y"
使用以下命令来运行guest虚拟机B:
$ qemu-system-x86_64 -enable-kvm -cpu host
启动虚拟机B并检查是否有vmx标志:
$ grep vmx /proc/cpuinfo
[2]方法二
要使物理机内核支持nested,第一步需要升级系统内核到Linux 3.X版本,第二步要为内核添加新的引导参数
默认情况下,系统并不支持nested
#查看当前系统是否支持nested systool -m kvm_intel -v | grep -i nested nested = "N"
#或者这样查看
cat /sys/module/kvm_intel/parameters/nested
N
第一步升级内核,用3.18内核做测试,升级内核很简单,下载编译好的内核rpm包,,安装,然后修改grub.conf默认引导内核为新内核
第二步添加引导参数同样很简单,只需要在 kernel 那一行的末端加上 "kvm-intel.nested=1"
#升级内核
rpm -ivh kernel-ml-3.18.3-1.el6.elrepo.x86_64.rpm
#修改grub.conf
default=0 #使用新内核
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server(3.18.3-1.el6.elrepo.x86_64)
root (hd0,0)
kernel/vmlinuz-3.18.3-1.el6.elrepo.x86_64 roroot=UUID=9c1afc64-f751-473c-aaa6-9161fff08f6f rd_NO_LUKS rd_NO_LVMLANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcy
rheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgbquiet kvm-intel.nested=1
...
上面修改之后,重启系统,用"uname -r"查看系统内核,并检查nested是否支持
[3]方法三(对于在vmware workstation上的虚拟机)
在workstation上实现嵌套虚拟化,需要编辑虚拟机的vmx文件,添加
vhv.enable= "TRUE"
找到虚拟机安装文件,带有.vmx后缀,添加即可。
通过命令行查看,是否包含vmx:
# cat/proc/cpuinfo |grep flags
参考链接:
http://www.cnblogs.com/jython/p/4458807.html?utm_source=tuicool&utm_medium=referral