Windows 11下玩轉虛擬機
時間:2023-06-30 19:09:01 | 來源:網站運營
時間:2023-06-30 19:09:01 來源:網站運營
Windows 11下玩轉虛擬機:終于升級win11了,可之前用的好好的vmware workstation 16.2.1卻發(fā)生了非常嚴重的不兼容情況。沒辦法,作為一個潔癖癥患者,不允許自己的真機上存在任何臃腫多余的軟件,虛擬機幾乎是必須的。于是只能不斷摸索了,現在算是用的比較爽了。我發(fā)現網上的資料都比較零散,所以寫下來,給需要的人用。
我的硬件是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,都使用了名為根調度器的新調度器。和傳統(tǒng)的經典調度器和新服務器上增加的核心調度器不同,根調度器,顧名思義,是一個工作在根OS上的調度器。也就是說,你的虛擬機,本質上都是依靠你的主機操作系統(tǒng)來進行調度的,而不是像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的安全執(zhí)行環(huán)境(把edge和office都放虛擬機里執(zhí)行來保證安全)也都有用到。它的原理基本就是API透傳,所以可以說,你主機的顯卡什么樣子,透傳過去的顯卡就是什么樣子。在我的WDDM2.7里,全屏狀態(tài)下偶爾還有一些不穩(wěn)定的情況,但窗口模式已經很穩(wěn)定了。
要想使用這玩意兒,需要在命令行輸入如下命令:
$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的虛擬機不帶聲卡,沒有聲音?。?!
這絕對是微軟這幫三哥開發(fā)們做的最SB的事兒了。目前我找到的最好的解決辦法是一個叫做AudioRelay的軟件。這玩意兒的原意是假設你的電腦喇叭壞了,正好手頭有臺手機,可以讓手機充當喇叭的。我們可以變通一下,讓我們的主機當那個‘手機‘,讓虛擬機當那個喇叭壞掉的電腦。AudioRelay是一個免費軟件,有windows、linux、android和macOS版本,非常實用。具體方法就不累述了,你自己去網站翻吧。網址:Stream your PC audio to your phone - AudioRelay
它還會給你推薦一個虛擬聲卡來配合它工作,你也需要下載下來。
5、USB
我收回剛才的話,hyper-v不支持主機usb轉接才是這幫三哥干的最SB的事兒。目前解決的辦法只有usb over ip??蛇z憾的是,目前稍微能看的usb over ip方案都是付費的,免費的方案爛到慘不忍睹,寫代碼都不愿意用的那種。這里就推薦一個,大家湊合用吧:Home | VirtualHere
這個的好處是,它可以免費讓你無限期連接一個usb而不用付費。壞處就是,這破玩意兒有個bug,當客戶端(在虛擬機里運行的那一端)選擇了自動搜索并連接服務器之后,客戶端連接服務器后會發(fā)送一些莫名其妙的連接測試包,讓服務器認為客戶端已經請求了一個usb設備的連接,從而當你再次連接想要連接的usb設備(例如ukey或u盤)的時候,報一個無法連接,需要購買更多授權的錯誤。解決的方法就是,在客戶端把自動搜索并連接服務器功能勾掉,每次使用都手動輸入主機的ip地址和端口連接。
6、打開虛擬機的嵌套虛擬化
1、查看是否打開:Get-VMProcessor -VMName 主機名 | fl看ExposeVirtualizationExtensions的true/false2、打開或關閉(ture or false)Set-VMProcessor -ExposeVirtualizationExtensions $true -VMName 主機名
7、其他的像如何限制虛擬機的硬盤、網絡IO速度,如何配置橋接網絡之類的就不在這里說了,很煩,需要很多網絡知識,家用也不一定能用上。