为了用React Native,装上Android Studio和AVD之后,启动VMWare,结果提示VM 与 Device/Credential Guard 不兼容……猜测是AVD的某些设置影响了虚拟化。但是总不能为了保住VMWare就放弃Android吧,所以还是得寻找解决方案。
首先按照网上的说法,处理Device/Credential Guard的问题:
-
在“设置”里找到“内核隔离”并关闭
-
在“Windows功能”里关闭Hyper-V
-
在组策略里禁用“基于虚拟化的安全设置”
(本地计算机策略 > 计算机配置 > 管理模板>系统 > Device Guard)
-
进入PowerShell(管理员),彻底关闭Hyper-V:
bcdedit /set hypervisorlaunchtype off
-
重启电脑
重启之后,VMWare是能打开了,但是虚拟机一启动就会卡死,并且无法关闭,只能重启电脑。后来在网上找到了一个解决方案:
删除虚拟机的根目录下的
*.lck
文件,然后重启电脑。
说起来很诡异,但是确实有效。可是,为什么呢?
后来看到一个解释,说得蛮有道理的:
我们打开任务管理器,会发现vmware.exe和vmware-vmx.exe两个重要的进程。其中vmware-vmx.exe是主程序,虚拟机在这个进程下运行;VMware.exe是外壳程序,负责显示vmware-vmx.exe中运行的虚拟系统并解释传送各种命令和操作,是我们最常用的 VMware用户界面,该程序可重入即同时打开多个。
因为VMware Workstation是可重入的,为了避免同一个虚拟系统同时被多个VMware.exe打开操作,造成错误,所以每个VMware打开相应的虚拟机选项卡时都会先检查该虚拟机根目录下是否有*.vmx.lck的文件夹并验证其中的文件,如果该文件中包含合法生成的uuid(通用唯一识别码),那么将无法打开该虚拟机的选项卡.
如果没有相应的合法文件,就会在该虚拟机根目录下生成*.vmx.lck文件夹,并在该文件夹下生成一个包含uuid的*.lck文件,打开虚拟机选项卡,并从主程序接收显示信息。
这个*.lck文件可以用记事本编辑。里面是uuid={一串字母数字},uuid是通用唯一识别码 (Universally Unique Identifier),它的特点就是唯一性。为的是同时只有一个vmware.exe能接受主程序的显示,并对虚拟机操作。lck是lock的缩写,即对请求资源的锁定。
VMware 虚拟机在运行时会在相应的虚拟机目录下生成三个文件*.vmx.lck,.vmdk.lck,.vmem.lck文件夹,里面包含以*.lck命名的文件。 其中的*.vmx.lck是伴随vmware.exe中选项卡的打开时生成的;另外两个是关于虚拟磁盘和内存的使用的,它们伴随着虚拟系统的运行而产生。如果关闭VMware.exe让虚拟机在后台运行,*.vmx.lck文件夹会消失另外两个则不会。
在VMware.exe中打开某个虚拟机选项卡时,会短暂生成*.vmsd.lck的文件夹,估计这个是在最初传送数据(send data)时生成的,防止多个外壳程序同时请求打开虚拟机。
所以,为什么会看到这几个文件?这几个文件是VMWare用来标识虚拟机正在运行的,如果正常退出,这几个文件应该消失;但因为没有正常退出,这几个文件就一直留着,给VMWare一种虚拟机正在运行的错觉。删掉就好了。