測試環境:
- FreeBSD 15 Release
- Nvidia閉源驅動版本:580
介紹如何在FreeBSD系統設定Nvidia顯示卡的驅動。
Nvidia除了Linux之外,尚有提供其他Unix-like系統的驅動,包括FreeBSD與Solaris。
FreeBSD沒有開源的Nvidia驅動。Nvidia在Linux有逆向工程出來的「nouveau」開源驅動可用,功能不若Nvidia官方閉源驅動完善,頂多讓電腦開機有畫面。但是FreeBSD這邊由於xf86-video-nouveau已經很久沒人維護了,需要手動編譯,FreeBSD沒有nouveau驅動可用,所以不裝Nividia閉源驅動就是沒法顯示圖形界面。或者即使有辦法輸出畫面,也會是CPU渲染的「llvmpipe」。
除驅動之外,Nvidia推出的閉源技術,例如CUDA,壓根沒有官方FreeBSD版。不過可以用Linuxulator技術跑Linux版的CUDA,這樣部份Python函式庫依賴CUDA的問題也能得到解決。
裝CUDA的用途為何?這不是必要元件,只是有些程式會用到,比如我參考的教學文章的作者是為了在FreeBSD跑Stable Diffusion WebUI的AI生圖才研究怎麼裝CUDA的~!Man of culture的力量好偉大。
但是這樣也代表依賴CUDA的程式得用Linux模擬方式跑啊。比如FreeBSD套件庫的Blender得用特殊指令才能存取CUDA。
1. 安裝Nvidia閉源驅動#
Nvidia官網只有編譯好的驅動壓縮包,沒有提供FreeBSD專門的套件庫,所以我們直接從FreeBSD套件庫裝驅動就可以了。
到Nvidia官網查看顯示卡是否仍受Linux閉源驅動支援,像我的顯示卡為Nvidia GTX1050Ti已經停止支援,最高只能裝到580版本的驅動,因此得從FreeBSD套件庫選取對應版本的
nvidia-driver-xxx驅動。若是還有支援的顯示卡就直接選最新版nvidia-drm-kmod驅動。
指定安裝特定版本的Nvidia驅動,這裡的例子是580版本,也就是最後支援GTX1050Ti的驅動版本:
sudo pkg install nvidia-driver-580 nvidia-settings若是最新Nvidia顯示卡,就直接裝這個drm-kmod:
sudo pkg install nvidia-drm-kmod- 之後,把Nvidia核心模組加入開機自動啟動選項。根據FreeBSD手冊指示,最新版驅動應該以DRM模組方式載入,所以使用
nvidia-drm,表示啟用modesetting。舊版的驅動是使用nvidia-modeset。
sudo sysrc kld_list+=nvidia-drm註:如果以上驅動會導致kernel panic,請使用舊版載入Nvidia驅動的方法:
sudo sysrc kld_list+=nvidia
# 或者
sudo sysrc kld_list+=nvidia-modeset- 強制讓驅動啟用modesetting
echo "hw.nvidiadrm.modeset=1" | sudo tee -a /boot/loader.conf- 如果重開機後無法啟動X Server,就強迫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-rl9-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-rl9-libglvnd以取得libGL.so.1
sudo pkg install linux-rl9-libglvnd3. 執行需要CUDA的程式#
以Blender為例,從FreeBSD套件庫安裝
sudo pkg install blender然後用nvidia-slurp執行,Blender的選單就認得到CUDA裝置了
nvidia-slurp blenderffmpeg、OBS Studio的NVENC加速比照辦理。
註:FreeBSD論壇的用戶ziomario使用FreeBSD 13成功執行CUDA加上Blender,但是FreeBSD 15會出現錯誤exec: No such file or directory,似乎是bug?
根據用戶julien40的回報,將Nvidia驅動降版可以解決該問題。
4. 雙螢幕問題#
FreeBSD 15對不同顯示卡的雙螢幕支援度不太好的樣子。如果同時使用「Intel CPU內顯 + Nvidia」的場合,i915kms和nvidia-drm只能有一個DRM模組載入,因此只有一個螢幕會有畫面。
解決方法是將螢幕線都插在Nvidia的孔上。
另外一個方案是將Intel顯示卡作為主要顯示卡,Nvidia以nvidia而非nvidia-drm的方式載入模組。這樣開機後雖然只有一個螢幕輸出,但Nvidia命令行仍能使用。
Nvidia PRIME在FreeBSD的使用方法未知。


