透過一連串技巧將特定裝置加入黑名單,讓FreeBSD系統不要去動它。
1. 問題點#
在Intel UHD 630 + Intel Arc A380的電腦,目前Intel Arc A380獨顯在FreeBSD 15開機會導致kernel panic,因為i915kms驅動有問題。我可不可以只用Intel UHD 630的內顯開機不管獨顯,問題是兩者共用同一個i915kms的kernel module,不能透過禁止載入該模組的方式來封鎖。那我想FreeBSD有沒有類似Linux的vfio的東西可以把PCI裝置抓走不讓主機看到。
於是找到了pttdevs。這東西確實是為bhyve的PCI Passthrough所設計的機制。
2. 新增裝置到pptdevs#
列出顯卡的PCI位址,Intel Arc A380有GPU和音訊裝置。
pciconf -lv編輯/boot/loader.conf,寫入pptdevs將裝置交給pptdevs管理。
pptdevs="3/0/0 4/0/0"3. 設定device.hints#
除了pptdevs之外,還要透過/boot/device.hints設定disbled,用黑名單的方式徹底停用這個裝置。
hint.pci.3.0.0.disabled="1"
hint.pci.4.0.0.disabled="1"照理說device hints應該就會禁止顯卡載入了,pptdevs顯得沒必要。但在我的測試是依然會載入。
4. 強制X11使用特定GPU#
透過這次的實踐,我重新理解了FreeBSD的開機處理順序。/boot/loader.conf裡面的設定類似GRUB,是在開機核心初始化的時候就會執行的設定,接著才會從/etc/rc.conf載入系統服務。考慮到我們要在系統開機早期就搶顯卡控制權,那麼就要在/boot/loader.conf裡面儘早載入vmm,然後才可以馬上設定pptdevs。如果是在/etc/rc.conf裡面設定載入vmm模組的話就來不及了,就會導致pptdevs設定失敗。
可是雖然這樣做了,FreeBSD理論上看不到Arc A380了才對,開機是能載入i915kms(tty解析度有變化),但載入SSDM卻還是會crash掉系統,用tty啟動Wayland或X11也都是crash.
好吧,我嘗試在/usr/local/etc/xorg.conf.d/20-intel.conf強制指定只能用內顯。耶,成功了。這樣問題可能在於X Server啟動的時候會嘗試去動被封印的獨顯導致kernel panic。
Section "Device"
Identifier "Intel iGPU"
Driver "modesetting"
BusID "PCI:0:2:0" # pciconf -lv查詢
EndSection防止Wayland來亂,然後在SDDM設定檔/usr/local/etc/sddm.conf.d/kde_settings.conf強制以X11後端啟動
[General]
DisplayServer=x11但是目前就變成只能用KDE X11了,不能用KDE Wayland。Wayland做不到指定使用哪個顯卡的機制…? 哦哦,KDE Wayland依然可以啟動耶,只要SDDM有起來就行了。


