測試環境:
- FreeBSD 14 Release
- Nvidia專有驅動版本:550.54.14
介紹如何在FreeBSD系統設定Nvidia顯示卡的驅動。
Nvidia除了Linux之外,尚有提供Unix系統的驅動。
由於xf86-video-nouveau已經很久沒人維護了,FreeBSD沒有開源版的Nvidia驅動「nouveau」可用,所以不裝Nividia專有驅動就是沒法顯示X視窗系統的畫面。
除驅動之外,Nvidia推出的專有技術,例如CUDA,壓根沒有官方FreeBSD版。不過可以用Linuxulator技術跑Linux版的CUDA,這樣部份Python函式庫依賴CUDA的問題也能得到解決。
裝CUDA的用途為何?這不是必要元件,只是有些程式會用到,比如我參考的教學文章的作者是為了在FreeBSD跑Stable Diffusion WebUI才研究怎麼裝CUDA的~!Man of culture的力量好偉大。
但是這樣也代表依賴CUDA的程式得用Linux模擬方式跑啊。比如FreeBSD套件庫的Blender得用特殊指令才能存取CUDA。
1. 安裝Nvidia專有驅動#
Nvidia官網只有原始碼,沒有提供FreeBSD專門的套件庫,所以我們直接從FreeBSD套件庫裝驅動就可以了。
- Nvidia的驅動是專有軟體,需要看FreeBSD手冊的顯示卡代數表格選擇適合的驅動。像我的顯示卡為Nvidia GTX 1050Ti,可以直接裝最新版驅動:
sudo pkg install nvidia-driver nvidia-settings libva-vdpau-driver libvdpau libvdpau-va-gl
- 如果需要跑Wayland桌面,得安裝DRM驅動
sudo pkg install nvidia-drm-kmod
- 之後,把Nvidia核心模組加入開機自動啟動選項。根據FreeBSD手冊指示,最新版驅動應該以DRM模組方式載入,所以使用
nvidia-drm
,表示啟用modesetting。舊版的驅動是使用nvidia-modeset
。
sudo sysrc kld_list+=nvidia-drm
註:舊版載入Nvidia驅動,不啟用modesetting的方法如下。如果開機黑螢幕,請取消使用DRM模組。
sudo sysrc kld_list+=nvidia
- 啟用modesetting
echo "hw.nvidiadrm.modeset=1" | sudo tee -a /boot/loader.conf
- 如果重開機後無法啟動顯示管理器,就強迫Nvidia產生
/etc/X11/xorg.conf
:
sudo nvidia-xconfig
另一種方式是手寫X.org設定檔。用pciconf -lv | grep -B4 VGA
指令查看Nvidia顯示卡的BusID。接著編輯/usr/local/etc/X11/xorg.conf.d/20-nvidia.conf
,啟用Nvidia DRM驅動:
Section "Device"
Identifier "Nvidia"
Driver "modesetting" # 使用DRM驅動,如果不要用就改回nvidia
BusID "PCI:1:0:0"
# Option "AccelMethod" "uxa" 如果畫面撕裂取消註解這二行
# Option "TearFree" "true"
EndSection
- 最後用
nvidia-smi
指令確認Nvidia驅動版本:
2. 安裝CUDA#
需要給FreeBSD啟用Linuxulator支援,但不需要安裝Jail
安裝以下套件,libc6-shim可讓FreeBSD跑Linux的glibc
sudo pkg install libc6-shim linux-nvidia-libs
- 預設情況跑
nvidia-smi
是不會印出相容的CUDA版本的,故改用nvidia-slurp執行
nv-sglrun nvidia-smi
這樣會看到該Nvidia GPU相容的CUDA版本:
CUDA Version: 12.0
安裝Linux的編譯器
pkg install linux-c7-devtools
- 使用Linux的cc編譯 uvm_ioctl_override.c.
fetch https://gist.githubusercontent.com/shkhln/40ef290463e78fb2b0000c60f4ad797e/raw/f640983249607e38af405c95c457ce4afc85c608/uvm_ioctl_override.c
/compat/linux/bin/cc --sysroot=/compat/linux -m64 -std=c99 -Wall -ldl -fPIC -shared -o dummy-uvm.so uvm_ioctl_override.c
- 然後安裝linux-c7-libglvnd以取得libGL.so.1
sudo pkg install linux-c7-libglvnd
3. 執行需要CUDA的程式#
以Blender為例,從FreeBSD套件庫安裝
sudo pkg install blender
然後用nvidia-slurp執行,Blender的選單就認得到CUDA裝置了
nvidia-slurp blender
ffmpeg、OBS Studio的NVENC加速比照辦理。
註:FreeBSD論壇的用戶ziomario使用FreeBSD 13成功執行CUDA加上Blender,但是FreeBSD 14會出現錯誤exec: No such file or directory
,似乎是bug?
根據用戶julien40的回報,將Nvidia驅動降版可以解決該問題。
4. 雙螢幕問題#
FreeBSD 14對不同顯示卡的雙螢幕支援度不太好的樣子。如果同時使用Intel CPU內顯 + Nvidia的場合,i915kms
和nvidia-drm
只能有一個DRM模組載入,因此只有一個螢幕會有畫面。
解決方法是將螢幕線都插在Nvidia的孔上。
另外一個方案是將Intel顯示卡作為主要顯示卡,Nvidia以nvidia
而非nvidia-drm
的方式載入模組。這樣開機後雖然只有一個螢幕輸出,但Nvidia命令行仍能使用。
Nvidia PRIME的使用方法未知: