Windows 11下玩转虚拟机
时间:2023-06-30 19:09:01 | 来源:网站运营
时间:2023-06-30 19:09:01 来源:网站运营
Windows 11下玩转虚拟机:终于升级win11了,可之前用的好好的vmware workstation 16.2.1却发生了非常严重的不兼容情况。没办法,作为一个洁癖症患者,不允许自己的真机上存在任何臃肿多余的软件,虚拟机几乎是必须的。于是只能不断摸索了,现在算是用的比较爽了。我发现网上的资料都比较零散,所以写下来,给需要的人用。
我的硬件是HP probook 635 G8(5600u),核显单卡,内存扩充到32G,硬盘加到2T。目前已经实现的包括:
- 跑win11,可以较为灵活的分配CPU、内存、网络和硬盘资源
- 主机的USB设备可以在虚拟机内使用
- 虚拟机内具备全功能的D3D 12,具备全功能的opengl,3D性能可以达到主机3D性能的95%
- 虚拟机内有声音
- 虚拟机内具备嵌套虚拟化的能力,可以安装wsl2,可以安装其他类型的虚拟机(virtualbox、vmware、hyper-v、qemu等)
大致的实现步骤如下:
1、windows 11家庭版开启hyper-v:
因为默认家庭版不带hyper-v,但我又要必须尽量用正版,不用破解,所以选择了笔记本自带的家庭版。开启hyper-v的方法如下:
pushd "%~dp0"dir /b %SystemRoot%/servicing/Packages/*Hyper-V*.mum >hv.txtfor /f %%i in ('findstr /i . hv.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%/servicing/Packages/%%i"del hv.txtDism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALLpause
将上面代码复制到文本文件,改扩展名为bat,以管理员权限运行一遍即可(需要重启)
2、关于windows 11版hyper-v的一些说明:
最近这几个非服务器版windows带的hyper-v,都使用了名为根调度器的新调度器。和传统的经典调度器和新服务器上增加的核心调度器不同,根调度器,顾名思义,是一个工作在根OS上的调度器。也就是说,你的虚拟机,本质上都是依靠你的主机操作系统来进行调度的,而不是像hyper-v之前版本一样,依靠一个独立的hypervision底层来进行调度。这样做的目的是为了配合windows defender以及容器等和虚拟机相关的windows功能而做的。根调度器的效率不错,和经典调度器不相上下,强于核心调度器(安全性上略差)。但根调度器有一个问题,它不能再灵活的按照百分比来对CPU进行调配了。也就是说,你在hyper-v里设置了一个虚拟机只占用一个核心30%的资源。到了根调度器这里,这个设置将被忽略,虚拟机仍将能使用这个核心的全部cpu资源。
当然,你可以随时更换调度器类型,更换方式如下,powershell管理员权限运行:
bcdedit /set hypervisorschedulertype 调度器类型(Classic,Core,Root)
查看当前调度器类型可以用如下命令:
Get-WinEvent -FilterHashTable @{ProviderName="Microsoft-Windows-Hyper-V-Hypervisor"; ID=2} -MaxEvents 1显示:2 - 经典3 - 核心4 - 根
当然,如果你像我一样,不太愿意改微软的默认配置(改的越多,将来被搞坏的概率越大),可以使用如下方法缓解:
- 给win11虚拟机分配4个内核
- 在虚拟机运行的时候,在任务管理器寻找名为vmmem的进程,右键选择相关性,勾选4个CPU内核(以偶数开始的相邻内核,例如2、3、4、5)
这样可以保证虚拟机的4个内核全部都运行在主机的2个物理核心上。至于为什么要这么做,还是洁癖吧。
多说一句,使用经典调度器也可以绑定单独的核心,需要使用微软提供的一个批处理工具:CPUGroups
关于hyper-v虚拟机和主机的文件共享,只需要在主机建一个共享文件夹,给共享文件夹分配(新建)一个有完全读写权限的用户,并把文件夹的访问权限也赋予这个用户即可。当然,如果你的虚拟机windows 11 和主机windows 11登录的是同一个微软ID,也可以直接使用微软ID访问,不过这样我总觉得不太安全。3、3D支持
微软在最近几版的WDDM内引入了一种基于API透传的显卡虚拟化机制,叫做GPU-PV。目前它主要应用在给wsl2提供gpu计算支持上。windows沙盒、defender的安全执行环境(把edge和office都放虚拟机里执行来保证安全)也都有用到。它的原理基本就是API透传,所以可以说,你主机的显卡什么样子,透传过去的显卡就是什么样子。在我的WDDM2.7里,全屏状态下偶尔还有一些不稳定的情况,但窗口模式已经很稳定了。
要想使用这玩意儿,需要在命令行输入如下命令:
$vm = "我的虚拟机名字"Add-VMGpuPartitionAdapter -VMName $vmSet-VMGpuPartitionAdapter -VMName $vm -MinPartitionVRAM 80000000 -MaxPartitionVRAM 100000000 -OptimalPartitionVRAM 100000000 -MinPartitionEncode 80000000 -MaxPartitionEncode 100000000 -OptimalPartitionEncode 100000000 -MinPartitionDecode 80000000 -MaxPartitionDecode 100000000 -OptimalPartitionDecode 100000000 -MinPartitionCompute 80000000 -MaxPartitionCompute 100000000 -OptimalPartitionCompute 100000000Set-VM -GuestControlledCacheTypes $true -VMName $vmSet-VM -LowMemoryMappedIoSpace 1Gb -VMName $vmSet-VM -HighMemoryMappedIoSpace 32GB -VMName $vm
其中Set-VMGpuPartitionAdapter里的那个80000000和100000000是显存大小的限制(16进制数),你可以根据你自己显存的大小来设定,例如我的5600u核显只有512m的共享显存,就需要把参数改为10000000(256m)
添加完显卡,你还需要关掉虚拟机的检查点,并删除所有的检查点。
配置完这些,还需要把你的显卡驱动复制到虚拟机里。你需要win+r运行dxdiag,在显示那一栏里点击保存所有信息。在保存信息的文本文件内,将所有文件都复制到虚拟机里。
C:/Windows/System32/DriverStore/FileRepository目录的文件和目录都复制到C:/Windows/System32/HostDriverStore/FileRepository目录下
C:/Windows/System32和C:/Windows/SysWOW64目录下的文件都复制到C:/Windows/System32/HostDriverStore/FileRepository/System32和C:/Windows/System32/HostDriverStore/FileRepository/SysWOW64
如图:
最后重启虚拟机就可以了,注意,你虚拟机的OS版本一定要高于主机的版本,不然没戏
这样,D3D就搞定了。如果你还想opengl、vulkan、opencl什么的,可以尝试以下mesa,不过预先提醒一下,性能损失很大。
4、声音
hyper-v的虚拟机不带声卡,没有声音!!!
这绝对是微软这帮三哥开发们做的最SB的事儿了。目前我找到的最好的解决办法是一个叫做AudioRelay的软件。这玩意儿的原意是假设你的电脑喇叭坏了,正好手头有台手机,可以让手机充当喇叭的。我们可以变通一下,让我们的主机当那个‘手机‘,让虚拟机当那个喇叭坏掉的电脑。AudioRelay是一个免费软件,有windows、linux、android和macOS版本,非常实用。具体方法就不累述了,你自己去网站翻吧。网址:Stream your PC audio to your phone - AudioRelay
它还会给你推荐一个虚拟声卡来配合它工作,你也需要下载下来。
5、USB
我收回刚才的话,hyper-v不支持主机usb转接才是这帮三哥干的最SB的事儿。目前解决的办法只有usb over ip。可遗憾的是,目前稍微能看的usb over ip方案都是付费的,免费的方案烂到惨不忍睹,写代码都不愿意用的那种。这里就推荐一个,大家凑合用吧:Home | VirtualHere
这个的好处是,它可以免费让你无限期连接一个usb而不用付费。坏处就是,这破玩意儿有个bug,当客户端(在虚拟机里运行的那一端)选择了自动搜索并连接服务器之后,客户端连接服务器后会发送一些莫名其妙的连接测试包,让服务器认为客户端已经请求了一个usb设备的连接,从而当你再次连接想要连接的usb设备(例如ukey或u盘)的时候,报一个无法连接,需要购买更多授权的错误。解决的方法就是,在客户端把自动搜索并连接服务器功能勾掉,每次使用都手动输入主机的ip地址和端口连接。
6、打开虚拟机的嵌套虚拟化
1、查看是否打开:Get-VMProcessor -VMName 主机名 | fl看ExposeVirtualizationExtensions的true/false2、打开或关闭(ture or false)Set-VMProcessor -ExposeVirtualizationExtensions $true -VMName 主机名
7、其他的像如何限制虚拟机的硬盘、网络IO速度,如何配置桥接网络之类的就不在这里说了,很烦,需要很多网络知识,家用也不一定能用上。