一、问题背景

我一直在使用VMware来管理虚拟机,最近有个需求是在vmware虚拟机里面使用kvm创建kvm虚拟机。众所周知,这个需要vmware虚拟机开启CPU虚拟化才可以,但是我在使用的时候提示 此平台不支持虚拟化的 AMD-V/RVI

我已经在BIOS里面开启了CPU虚拟化(SVM那个选项)。在任务管理器里面可以看到CPU虚拟化已经开启。

image-20211110191910424

所以就很奇怪,不知道什么原因导致的。其实好久之前就发现这个问题了,不过我没有虚拟机里面再创建虚拟机的需求,所以,CPU虚拟化就关掉了,没有在意。甚至我一度以为是AMD CPU的问题,和VMware不兼容导致的。

二、排查

于是我在网络上大量的文章。终于找到了思路。

https://www.cnblogs.com/jaycethanks/p/14087318.html

按照这位博主的话说,是因为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、重启电脑
    

然后我的电脑就恢复正常了