想要在我的搭載獨顯的MSI Modern 15 A10筆電搞GPU直通給虛擬機,才發現我遇到奸商了。心很累。
雖然我大部分時候使用Ubuntu的KDE桌面作業,不過偶爾還是需要用到Windows軟體,所以我就想裝個KVM虛擬機,並在需要3D加速的時候直通GPU進去。原來GPU直通並不像桌機那樣簡單,還得研究一下筆電構造。
1. 確認筆電連接獨顯的配置#
很多有獨顯筆電的都是Intel內顯 + Nvidia獨顯的配置。少部份為AMD + Nvidia獨顯。
Nvidia顯示卡在筆電上仰賴「Optimus」技術來切換顯示卡。根據Lan Tian Blog的介紹,搭載Nvidia的筆電,內部會有以下三種接法:
- Nvidia Optimus MUXless架構,難以GPU直通
- Nvidia Optimus MUXed架構,最適合GPU直通
- Nvidia顯卡直連螢幕,難以GPU直通
- 確認筆電連接獨顯的方式,可以從lspci輸出的訊息來推斷:
lspci -nnk | grep -A 3 -i "VGA\|3D"- 判讀方式:
- VGA compatible controller:代表這是MUXed。
- 3D controller:這是MUXless。
如果是MUXed的話,直通GPU的方式就跟一般桌機沒兩樣,參見Ubuntu Nvidia GPU直通教學。
可,我這台MSI Modern 15 A10有Intel UHD620內顯 + Nvidia MX350獨顯,但是在lspci輸出的資訊顯示3D Controller,表示我的電腦屬於「Nvidia Optimus Muxless」架構,也就是Nvidia顯示晶片不是連在HDMI輸出孔上的,是經過內顯傳送的。這樣的話,即使用VFIO方式將Nvidia顯示卡直通進去,虛擬機也不能輸出畫面。與此同時,宿主機的HDMI孔依然會輸出內顯的訊號。
簡單來說,就是這種架構下直通Nvidia GPU屬於是沒屁用的。雖然Linux虛擬機是可以認到Nvidia GPU,但它並不能用於渲染。
大概是因為我筆電顯卡太低階了,不可能將獨顯弄成像PC一樣是獨立的PCI裝置吧。
於是我就只好改用GPU虛擬化的方式了。Intel舊型GPU都支援GVT-g的顯示卡虛擬化技術。透過mdev分配給虛擬機,然後安在虛擬機內裝驅動就可以了。但是這個Intel在虛擬機內沒有HDMI輸出怎麼辦呢?Virt Manager的監視器又容易lag。只得用Looking Glass技術,透過KVM Framebuffer的方式來輸出虛擬機畫面。Intel內顯的VRAM由RAM決定。
2. 替代方案#
因此,要讓虛擬機使用3D加速,就得搞GPU虛擬化,例如Intel GVT-g或者SR-IOV的方法。
我這台是Intel i5-1020u,可以使用Intel GVT-g分割資源給虛擬機使用。


