一、问题背景
我一直在使用VMware来管理虚拟机,最近有个需求是在vmware虚拟机里面使用kvm创建kvm虚拟机。众所周知,这个需要vmware虚拟机开启CPU虚拟化才可以,但是我在使用的时候提示 此平台不支持虚拟化的 AMD-V/RVI 。
我已经在BIOS里面开启了CPU虚拟化(SVM那个选项)。在任务管理器里面可以看到CPU虚拟化已经开启。

所以就很奇怪,不知道什么原因导致的。其实好久之前就发现这个问题了,不过我没有虚拟机里面再创建虚拟机的需求,所以,CPU虚拟化就关掉了,没有在意。甚至我一度以为是AMD CPU的问题,和VMware不兼容导致的。
二、排查
于是我在网络上大量的文章。终于找到了思路。
按照这位博主的话说,是因为win10的Hyper-V特性开启,导致VMware的CPU虚拟化不能正常使用。
而我自己一直在使用WSL2的ubuntu子系统。WSL2的ubuntu子系统是运行在windows平台的一个Linux虚拟机,拥有独立的Linux内核,它可以使用宿主机全部CPU和内存资源,最重要的是,它可以运行docker。因为我平时用docker频繁,所以用这个ubuntu子系统很方便,而且通过配置开机自启,可以让我那些容器开机就可以启动,不要太方便。
而问题就在于,WSL2的Linux子系统是建立在Hyper-V之上的。Hyper-V的微软出的一款虚拟化产品。关于虚拟化技术我下面简单说下。
虚拟化技术
就我们我所接触到的虚拟化技术,有下面三种:VMware虚拟化,kvm虚拟化,Hyper-V虚拟化。另外还有Openvz和Xen,不过我就没有接触过了。
VMware虚拟化分别面向个人用户和企业用户。个人用户经常使用的是VMware workstation,在个人PC上使用的;企业常用的是VMware ESXi,像很多中小公司自建机房的都会用到VMware ESXi
kvm虚拟化也是非常出名的,一般搭建openstack都才用kvm虚拟化。像很多云厂商,阿里云,AWS等大部分都才用的kvm虚拟化技术。
Hyper-V虚拟化技术是微软推出的一款虚拟化技术,可以认为是微软拿来和VMware竞争的一款产品。
言归正传,Hyper-V和VMware本身是两款竞争产品,所以不兼容的情况也不难理解。另外,根据查阅的资料显示,微软的Hyper-V是type 1类型的虚拟化,也就是windows系统在硬件底层和windows应用层之前插入了一层Hyper-V,而原来的 Windows 应用层则变成了一个运行在 Hyper-V 上的虚拟机。
这样一来VMware便运行在Hyper-V虚拟环境里面了,无法直接访问CPU内奸的虚拟化功能,也就不支持嵌套虚拟化这一说了。
另外根据小道消息,windows开启了Hyper-V虚拟化后,系统性能会降低10%,不知是真是假,隐约感觉到自己电脑关闭windows虚拟化后流畅了些许。
Hyper-V开启后会导致哪些问题
- 1、VMware不再支持嵌套虚拟化。包括不能在虚拟机里面使用kvm虚拟化;不能使用某些网络设备模拟器等
- 2、大多数的安卓模拟器不能运行。具体需要去官网查看说明。
三、解决办法
至于Hyper-V开启好还是关闭好,网友们各有说辞。我认为好与不好,完全因人而异。
我个人使用wsl2已经一年多了,一直没啥大问题,就是电脑在锁屏后再解锁会卡一段时间,不知道和这个有没有关系。而且我本人也很少用安卓模拟器,网络设备模拟器,因此对我来说没什么大的影响。平时写代码我都放在wsl2虚拟机里面,docker环境也用得很顺手,传输文件也很方便。
但是最近刚好准备考个rhce,网上下的环境需要用到CPU虚拟化,所以只能先将Hyper-V停掉一段时间了,下个月RHCE考完了再开启。
我在停掉Hyper-V虚拟化之前都做了哪些事情?
-
1、导出我的ubuntu子系统
-
#查看所有的linux子系统 PS D:\wsl2.0> wsl --list -v NAME STATE VERSION * ubuntu1804 Running 2 ubuntu2004 Running 2 #停止linux子系统 PS D:\wsl2.0> wsl -t ubuntu1804 PS D:\wsl2.0> wsl -t ubuntu2004 #确认子系统已经停掉 PS D:\wsl2.0> wsl --list -v NAME STATE VERSION * ubuntu1804 Stopped 2 ubuntu2004 Stopped 2 #导出子系统 PS D:\wsl2.0> wsl --export ubuntu1804 ubuntu1804-20211109.tar PS D:\wsl2.0> wsl --export ubuntu2004 ubuntu2004-20211109.tar
-
-
2、移除wsl开机启动脚本
%AppData%\Microsoft\Windows\Start Menu\Programs\Startup 有个ubuntu.vbs,内容如下: set ws=wscript.createobject("wscript.shell") ws.run "wsl -d Ubuntu1804 -u root /etc/init.wsl", vbhide ws.run "wsl -d Ubuntu2004 -u root /etc/init.wsl", vbhide
-
3、将Linux系统转化为WSL1,这样我后面还能继续用,只是少了部分功能而已
PS C:\Windows\system32> wsl --list -v NAME STATE VERSION * ubuntu1804 Stopped 2 ubuntu2004 Stopped 2 PS C:\Windows\system32> wsl --set-version ubuntu1804 1 正在进行转换,这可能需要几分钟时间... 转换完成。 PS C:\Windows\system32> wsl --list -v NAME STATE VERSION * ubuntu1804 Stopped 1 ubuntu2004 Stopped 2 #转换完成后,那个vhdx虚拟磁盘文件会被解压到当前目录下
-
4、停止Hyper-V
参考:https://www.zhihu.com/question/38841757
1、执行bcdedit /set hypervisorlaunchtype off 2、重启电脑
然后我的电脑就恢复正常了