快轉到主要內容

淺談Linux的Nvidia閉源驅動問題,以及nvidia-open、Nouveau、NVK驅動的選擇

· 民國114年乙巳年
·
切換繁體/簡體
分類   人文藝術 自由軟體議題
標籤   Linux Kernel Nvidia Wayland X Server Ubuntu
目錄

註解:撰文當下Nvidia閉源驅動版本為570,測試的Linux發行版為Ubuntu 24.04 LTS。 未來Nvidia官方更新可能會解決本文所講述的諸多弊端……但願如此。黃仁勳,救救孩子。

在Linux使用Nvidia顯示卡,一定要安裝Nvidia官方發表的閉源驅動,不能使用開源驅動。這樣才能完整發揮Nvidia顯示卡的效能,並使用他們獨家的CUDA、cuDNN、TensorRT技術。

不過Linux的Nvidia驅動是出了名的難搞,如果拿它來做純GPU計算以外的用途就會問題多多。這時,大家便會想起2012年,Linus Torvalds的那個經典中指手勢。

如果你研究過Nvidia驅動問題,可能還會聽到Nouveau、NVK、NOVA這類名詞,他們又是什麼呢?

這篇文章Ivon主要討論Linux系統的Nvidia驅動問題,還有面對多種選擇的時候,應該採取哪一個方案,範圍希望涵蓋大部份發行版。為了避免文章變成純粹的靠北文,文末會提供具體解決方式。

(有人說,你不應該買對Linux支援度不佳的硬體設備,包含Nvidia顯示卡就是一例。可是呀,人不能逆流而行,很多時候為了某些技術,沒有其他選擇,所以這裡我忽略了採購Intel或AMD顯示卡的選擇。專注於採取務實的角度,解決這些問題。)

1. Linux的Nvidia驅動為什麼難搞,問題在圖形
#

安裝方式繁雜、變種多等都是因素,後面會說,這裡先說Nvidia驅動造成的影響為何,為什麼難搞,問題那麼多。

不論國內外的Linux社群,都會不約而同的說Nvidia驅動問題很多。

你說不對呀,現在許多資料中心伺服器都用Nvidia顯示卡運算,如果驅動問題很多的話,那麼這些公司不就危險了。這裡我們要有個認識:資料中心跑的都是無頭的Linux伺服器,這方面的Nvidia驅動是沒有什麼太大問題的。但是若是桌面版Linux,需要輸出畫面的,就很容易遇到各種詭異圖形bug。

下圖來自Nvidia官方文件,說明了Nvidia驅動各個部位負責的部份。如果Linux伺服器只要跑CUDA計算,不需要輸出畫面,那就只要裝右下角那一塊的Nvidia Compute驅動就好了(所以你會在Ubuntu的套件庫看到-headless-server後綴的Nvidia驅動套件)。但是對Linux桌面使用者而言,需要安裝右上角綠色區塊的驅動。那如果同時要用Nvidia驅動輸出畫面和跑CUDA計算,就是兩個都安裝了!而圖形輸出這一塊就正好是Nvidia驅動問題最多的地方。

過去Linux桌面環境使用「X伺服器」顯示圖形界面,Nvidia驅動在X11環境的桌面,比如GNOME和KDE Plasma,動不動就會碰到畫面撕裂的問題,不如Intel和AMD的驅動穩定。

而針對Linux桌面環境未來的顯示協定「Wayland合成器」,Nvidia一直在努力改善支援度,但依然問題多多,常常會遇到破圖問題,或者畫面更新率上不去。儘管Nvidia驅動在X11環境比Wayland相對穩定一些,但未來將會是Wayland的天下!

Nvidia驅動的不穩定,對日常使用Linux電腦上網和玩遊戲的用戶會造成不良的體驗,輕則畫面閃爍,重則黑螢幕。有些軟體開發者也會因為Nvidia驅動的諸多問題,乾脆兩手一攤說我們不支援,比如Steam Gamescope、Waydroid、VirGL Renderer、Sway等等。

範例:以前Wayland合成器Sway的原始碼,因為Nvidia閉源驅動問題太多,所以Sway要求使用者加入「我不會再買Nvidia顯示卡」的參數才能啟動不穩定的桌面,後來改成中性的unsupported-gpu。

再來就是Nvidia筆電的圖形問題了,搭載Intel + Nvidia或AMD + Nvidia的筆電,難以切換Nvidia作為主要計算的顯示卡,也就是說玩遊戲需要重度3D渲染的時候得手動設定Nvidia PRIME參數切換Nvidia顯示卡。

2012年Linus Torvalds在罵的就是這個功能,十年過去了這功能依然有問題,得靠社群開發的第三方解決方案才能切換主顯示卡,但依然不完美,沒有Windows系統切換那樣自然。GNOME桌面提供的解決方式是加入一按鈕,允許在雙GPU筆電手動切換為Nvidia顯示卡渲染。但KDE Plasma沒有此選項。

基本上,Nvidia驅動之所以難搞,在於他們開源的部分不足,一直都是整包式的專有驅動。Intel和AMD雖然也有閉源blob部份,但他們與社群配合度高,所以驅動都沒什麼問題,而Nvidia就相對容易爆掉,尤其Ubuntu以外的滾動更新發行版。Ubuntu、Debian、Rocky Linux、CentOS是以穩定為主的系統,更新頻率較低,Nvidia驅動相對穩定。但若遇到Arch Linux、Fedora、openSUSE Tumbleweed這些常常更新的系統,Nvidia驅動便容易出事。

或許使用Ubuntu、Pop!_OS、Zorin OS、Deepin這些把使用者照顧的服服貼貼的發行版的用戶,感受不到我說的痛苦,因為他們背後都處理好了。但當你真正跳出舒適圈,你將會見證地獄。

其實Linux的Nvidia驅動一直有在改進,我這裡講的很多現有的圖形問題,Linux社群多半也有提供解決方式(workarounds),例如加入一些環境變數就能解決,但就是時不時出現的小bug讓人覺得很煩躁。

2. Nvidia驅動如何裝?很多種方式!
#

Linux的Nvidia驅動是一個很典型的「你要聽我的還是聽他的?」兩難問題。

你應該用APT套件管理器收的.deb檔呢,還是直接用Nvidia官網.run安裝器?

你要信Ubuntu的文件?

還是Nvidia官方的原廠文件?

如果你讀過Debian Wiki,他們一定會跟你說,不要任意執行廠商的安裝器,用我們打包好的!免得搞壞系統!

Rocky Linux有多種安裝途徑:看你要從RPM Fusion還是ELRepo的社群套件庫安裝,或者用Nvidia官方的套件庫呢?

這實在難以定奪。只能粗略的說,如果你的Linux發行版夠主流,像DEB系、RPM系的發行版,有列在Nvidia官方文件的支援列表裡面,那麼依照Nvidia說明下去裝應該是沒太大問題,只要方便用套件管理員管理就行(這很重要,文章末尾會提出我的意見)。反之就得求助該發行版的Wiki,或者社區成員幫助才能搞定Nvidia驅動了!

好,那讓我們專注在Ubuntu就好。若要在Ubuntu安裝Nvidia驅動,你就有了以下選項:

  1. 從Ubuntu系統版本的套件庫安裝並透過DKMS裝載。也就是apt install。這個方法通常很穩定,不過驅動版本偏舊。
  2. 從Ubuntu的graphics-drivers PPA安裝並透過DKMS裝載。Ubuntu團隊維護的額外套件庫,能取得最新驅動但可能不穩定。
  3. 從Nvidia官網下載deb檔匯入PPA安裝(Local)。即新增Nvidia維護的PPA套件庫,將完整驅動下載下來,再apt install
  4. 從Nvidia官網套件管理員匯入PPA安裝(Network)。即新增Nvidia維護的PPA套件庫,再apt install,再從Nvida的套件庫下載驅動套件。
  5. 從Nvidia官網下載Runfile檔安裝。就是透過執行.run的安裝器來安裝驅動,不建議,會無法被套件管理器追蹤。

這還只是從方法論上進行分類而已喔!如果要選擇Nvidia驅動的變種,那還有得研究呢。此外越新的Nvidia驅動版本不代表就好,可能有未經測試的bug。

當然,如果你使用ubuntu-drivers工具自動安裝驅動,那麼應該不會煩惱這個問題,它會自動挑選適合你顯示卡的穩定驅動版本。


Nvidia驅動還有很明顯的代數限制,如果是發售十年以上的舊卡就沒辦法繼續更新專有驅動了。比如GTX 10系列以前出的Nvidia舊卡,最多只能裝到470版的驅動。

這使得選取驅動版本就是個大問題,比如openSUSE就要分G04、G05、G06的套件。

Fedora更是要看你的顯示卡型號來選取適合版本的驅動套件。

就算Arch Linux只要一條pacman -S nvidia指令便能安裝Nvidia驅動,但也要是你的顯示卡不能太舊,才不會裝到不相容的最新版驅動!

比較友善的發行版嘗試解決了這個問題,像Ubuntu開發的ubuntu-drivers安裝器幫使用者節省了選版本的困難。

即使如此,要用CUDA的時候又得注意Nvidia專有驅動版本的問題,有時候得重裝來重裝去。遇到太舊的卡只能淘汰了。

3. Nvidia驅動不是只有一種!?
#

Linux的Nvidia驅動大致上有兩個派別:一個是閉源,一個是開源。

在此需要知道一個觀念:Linux的驅動程式可以分為核心以及使用者空間的驅動,前者負責跟底層的硬體溝通,後者則是跟應用程式溝通。

如果兩方面的驅動開源程度高的話,Linux社群開發者便能介入,協助解決問題。但若這兩個東西都是只有Nvidia公司才知道原理的黑盒子,那就只能看使用者造化了,Nvidia公司不眷顧你的系統的話,就有可能在下次更新後開機黑螢幕。

閉源驅動
#

Nvidia的閉源驅動有兩個。

最多人使用的是閉源驅動(proprietary driver),又稱為專有驅動,乃Nvidia公司釋出的封閉原始碼軟體,由Nvidia官方維護,包括核心以及使用者空間的驅動,功能最完整,支援OpenGL與Vulkan。使用CUDA一定要裝這個驅動。

通常,你不需要到Nvidia官網下載安裝器,而是應該透過Linux發行版的套裝管理器來安裝Nvidia驅動,這樣日後才能追蹤變更。依照Ubuntu的打包方法,Nvidia閉源驅動除了一般的版本之外,還有提供headless版本,這是給伺服器專用的版本,表示不需要畫面輸出的部份。

然而就像我上面說的,Nvidia與開源社群合作關係不佳,因此在圖形方面問題多多。


2024年,Nvidia基於GSP韌體,釋出了「NVIDIA Linux open GPU kernel module」版本的驅動,簡稱nvidia-open,部份開放原始碼。不要被open的名字誤導,這裡Nvidia只有小部份的核心模組開源,其他部份使用者空間的驅動依然閉源。

要是Nvidia驅動全開源的話,CUDA護城河就要蒸發啦。

Nvidia將閉源驅動的大部分功能移植到open GPU kernel module後,便開始建議使用者安裝這個版本,不過這個驅動需要相對新穎的顯示卡才能安裝,舊卡還是只能使用閉源驅動。

開源驅動
#

Nvidia的開源驅動有兩個。

為了讓Nvidia GPU開機至少有個畫面,Linux社群嘗試逆向Nvidia驅動,實現了一些開源驅動(open source driver)。

最古老的就是「Nouveau」,2012年開始開發,包括核心以及使用者空間的驅動,只有基本的OpenGL加速功能,效能也不佳。功能支援度不如Nvidia官方的閉源驅動,更不可能使用CUDA。

這東西唯一的好處是能幫舊卡續命,他們無法安裝最新Nvidia閉源驅動,有了Nouveau起碼還能做簡單的3D加速。

許多Linux發行版因為軟體授權緣故,無法內建Nvidia閉源驅動,就會使用這個驅動,讓Nvidia顯示卡開機至少能有個畫面。但通常一般人發現nouveau效能爛透了之後,便會安裝Nvidia閉源驅動取而代之,並將它列入黑名單。

是的!這裡有個雙關語:nouveau核心模組需要用modprobe.blacklist=nouveau禁止載入,否則會跟Nvidia閉源驅動衝突。大部份發行版的套件管理器會自動處理,但有時候需要使用者手動操作。


2024年,Redhat的工程師基於GSP韌體,搞了「NVK」與「NOVA」兩個專案,前者是核心驅動,後者為使用者空間驅動。

開發者使其支援Vulkan,用Rust寫的效能更好,聽說已經能玩一些Steam上的3A大作遊戲。或許有望取代nouveau,但仍處於高度實驗性狀態,沒有nouveau穩定。

4. 所以Nvidia驅動到底該怎麼選?
#

Arch Wiki提供了非常詳細的表格,讓你知道手上的Nvidia顯示卡支援哪個驅動版本。這裡的資料也適用其他Linux發行版,比Nvidia官方文件容易理解。

以目前Ubuntu提供的Nvidia 570版本驅動,以及同時代的其他方案來看:

1. 穩定之選:安裝Nvidia閉源驅動與小撇步,以Ubuntu為例,適用大多數Nvidia顯示卡。推薦使用Nvidia官方套件庫的版本,並用DKMS裝載,讓它跟著Linux核心自動更新。如果你不喜歡CUDA強迫跟著更新Nvidia驅動版本的話,不妨用Nvidia Container Toolkit,在Docker裡面跑CUDA吧!

2. 次佳選擇: NVIDIA Linux open GPU kernel module,需要RTX 20系列以上的顯示卡才能安裝。推薦使用Nvidia官方套件庫的版本,並用DKMS裝載,讓它跟著Linux核心自動更新。

3. 自由軟體愛好者 & 戰未來: NVKNOVA

4. 自由軟體愛好者 & 你的卡真的太老了: Nouveau。通常不需要特別安裝,沒有Nvidia閉源驅動的時候,就會自己載入了。

我個人覺得啦,Linux安裝軟體一定要用套件管理器追蹤變更,不要用官方.run安裝器,免得造成日後管理困難。

但若套件庫收的是過時的Nvidia驅動版本呢?折衷方案就是透過第三方套件庫的方式,安裝Nvidia官方發表的驅動套件,這個Ubuntu、Fedora、openSUSE都可以採用。Arch Linux就靠社群各顯神通了,AUR什麼都有。

關於Nvidia驅動安裝之後的疑難雜症,同樣也是Arch Wiki提供最多的資訊。

相關文章

用Linux越久,就越想獨裁解決碎片化問題,然而自由軟體是不可能統一的
分類   人文藝術 自由軟體議題
標籤   Free Software Ubuntu Fedora Systemd Freedesktop Specifications
Ubunchu!看漫畫學Linux,認識自由軟體社群文化
分類   人文藝術 自由軟體議題
標籤   OS-Tan Ubuntu Debian Anime
比較X11與Wayland。2024年了,你是否該切換到Wayland,拋棄X視窗系統
分類   人文藝術 自由軟體議題
標籤   Wayland X Window Linux

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。