跳至內容
出自 Arch Linux 中文维基

這篇文章的某些內容需要擴充。

原因:
  • 明確哪些內容特定於 X,哪些內容可用於 Wayland。
  • 刪除剩餘的「Intel」提及,改為「集成」:Optimus 也適用於 AMD 集成顯卡。
(在 Talk:NVIDIA Optimus 中討論)

NVIDIA Optimus 是一項允許集成圖形處理器(GPU)和英偉達(NVIDIA)獨立圖形處理器置入並通過一台筆記本電腦訪問的技術。作為前提條件,請為兩張顯卡安裝相關的 GPU 驅動

可用方法

這裡有幾種可行的方法:

  • #僅使用集成顯卡 - 能節約用電,因為此時英偉達 GPU 是完全關閉(不通電)的。
  • #僅使用英偉達顯卡 - 能比集成顯卡提供更強的性能表現,但是更耗電(這對行動裝置不太友好)。此方法和 optimus-manager 以及 nvidia-xrun 兩者一樣採用了相同的底層處理,所以在選用一種更自動化的方法之前,應該先利用這個方法來排除故障和驗證一些常規功能。
  • 兩者兼用 (在需要的時候使用英偉達 GPU,其他時候關閉它以節省電量):
    • #使用 PRIME 渲染分載(render offload) - 英偉達官方支持方法。
    • #使用 optimus-manager - 用一個簡單的命令切換顯卡(需要註銷重新登錄來生效)。還支持與 PRIME 渲染分載的混合模式。這可實現需要時使用英偉達 GPU 達到最大性能,不用時則將後者關閉。自 1.4 版本起,還支持 AMD+NVIDIA 組合。
    • #使用 nvidia-xrun - 使用英偉達顯卡在另外的 TTY 上運行單獨的 X 會話。這可實現需要時使用英偉達 GPU 達到最大性能,不用時則將後者關閉。
    • #使用大黃蜂(Bumblebee) - 提供了與 Windows 下相似的功能,可以選擇需要的程序使用英偉達顯卡,而其他的程序則用集成顯卡運行。不過大黃蜂有重大的性能問題。
    • #使用 switcheroo-control - 類似於大黃蜂,但專為 GNOME 用戶設計。允許應用程式在其桌面項文件中指定是否偏好使用獨立顯卡,並允許你從右鍵菜單中手動選擇在英偉達 GPU 上運行任意應用程式。
    • #使用 nouveau - (與英偉達官方提供的專有驅動相比)提供的性能較差,而且可能導致睡眠和休眠問題。不適用於最新的英偉達 GPU。
    • #使用 EnvyControl - 類似於 optimus-manager,但不需要複雜的配置或後台運行守護進程,如果你是 GNOME 用戶,也不需要安裝修補版的 GDM。
    • #使用 NVidia-eXec - 類似於大黃蜂,但沒有性能影響。它適用於 Xorg 和 Wayland。這個包是實驗性的,目前僅在 GNOME/GDM 下進行測試。
    • #使用 nvidia-switch - 類似於 nvidia-xrun,但不需要切換 TTY,切換將通過登錄和註銷在顯示管理器中完成。這個包在基於 Debian 的系統上進行測試,但像 nvidia-xrun 一樣,它應該可以在所有 Linux 系統上工作。
注意:所有這些方法選擇都是互斥的,如果測試了一種方法後又決定使用另一種方法,則必須確保在嘗試另一種方法之前,還原通過遵循前一種方法所做的所有配置更改,否則可能會發生文件衝突和不定行為。

僅使用集成顯卡

如果你只想使用某個特定的GPU而不進行切換,請檢查你系統BIOS中的選項。應該有一個選項可以禁用其中一個顯卡。有些筆記本電腦只允許禁用獨立顯卡,或者反之,但如果你只計劃使用其中一個顯卡,值得檢查一下。

如果你的BIOS不允許禁用Nvidia顯卡,你可以從Linux內核本身禁用它。參見Hybrid graphics#完全關閉獨立GPU

在不切換渲染提供程序的情況下使用CUDA

你可以在不將渲染切換到Nvidia顯卡的情況下使用CUDA。你只需要確保在啟動CUDA應用程式之前Nvidia顯卡已通電,詳見Hybrid graphics#完全關閉獨立GPU

現在,當你啟動CUDA應用程式時,它將自動加載所有必要的內核模塊。在使用CUDA後關閉Nvidia顯卡之前,必須先卸載nvidia內核模塊:

# rmmod nvidia_uvm
# rmmod nvidia

僅使用英偉達顯卡

專有的英偉達驅動可配置為主渲染提供程序。它也有明顯的畫面撕裂問題——除非通過啟動 NVIDIA#DRM 內核級顯示模式設置啟用 PRIME Sync,更多信息請參見 [1]。專有驅動確實允許使用獨立 GPU,而且(截至 2017 年一月)它相比 nouveau 驅動有更明顯的性能優勢。

首先,安裝英偉達驅動和 xorg-xrandr 軟體包。然後,配置 /etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf,其中的選項將與軟體包提供的 /usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf 文件結合提供與此配置的兼容性。

注意:在一些配置上,此配置會使英偉達驅動無法通過 EDID 文件自動探測顯示參數值。解決方案可參考#解析度和屏幕掃描錯誤「EDID errors in Xorg.log」
/etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
Section "OutputClass"
    Identifier "intel"
    MatchDriver "i915"
    Driver "modesetting"
EndSection

Section "OutputClass"
    Identifier "nvidia"
    MatchDriver "nvidia-drm"
    Driver "nvidia"
    Option "AllowEmptyInitialConfiguration"
    Option "PrimaryGPU" "yes"
    ModulePath "/usr/lib/nvidia/xorg"
    ModulePath "/usr/lib/xorg/modules"
EndSection

接下來,依所使用的登錄圖形的方式不同而有所不同,請按實際情況選擇閱讀。

startx

請在 ~/.xinitrc 文件的開頭處添加下列兩行內容:

~/.xinitrc
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

現在重啟以加載驅動,X 伺服器也應該啟動了。

如果顯示 DPI 不正確,請再添加下列一行:

xrandr --dpi 96

如果在啟動 X 伺服器時出現黑屏,請確保 ~/.xinitrc 文件中的兩個 xrandr 命令後面沒有「&」符號。如果有「&」號,窗口管理器可能在 xrandr 命令執行完成前就運行了,從而導致了黑屏。

顯示管理器

如果打算使用顯示管理器,就不是使用 ~/.xinitrc 文件了,而是需要為顯示管理器創建或編輯顯示配置腳本。

LightDM

LightDM 顯示管理器創建/編輯腳本:

/etc/lightdm/display_setup.sh
#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

然後賦予腳本可執行權限。

通過編輯 /etc/lightdm/lightdm.conf[Seat:*] 部分配置 LightDM 來運行這個腳本:

# nano /etc/lightdm/lightdm.conf
[Seat:*]
display-setup-script=/etc/lightdm/display_setup.sh

現在重啟,然後顯示管理器應該能啟動了。

SDDM

SDDM 顯示管理器創建/編輯腳本(SDDM 是 KDE 的默認顯示管理器):

/usr/share/sddm/scripts/Xsetup
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

GDM

要為 GDM 創建啟動腳本,請創建兩個新的 .desktop 文件,如下:

/usr/share/gdm/greeter/autostart/optimus.desktop
/etc/xdg/autostart/optimus.desktop
[Desktop Entry]
Type=Application
Name=Optimus
Exec=sh -c "xrandr --setprovideroutputsource modesetting NVIDIA-0; xrandr --auto"
NoDisplay=true
X-GNOME-Autostart-Phase=DisplayServer

並且請確保 GDM 使用 Xorg 作為後端

檢查 3D 設置

可通過安裝 mesa-utils 並運行以下命令來檢查英偉達顯卡是否被使用:

$ glxinfo | grep NVIDIA

更多信息

更多信息請參見英偉達官方網頁上的這個主題文章 [2]

使用可切換顯卡

使用 PRIME 渲染分載(render offload)

這是 NVIDIA 官方支持可切換顯卡的方法。

參見 PRIME#PRIME 渲染分載

使用 nouveau

圖形切換參見 PRIME,開源 NVIDIA驅動程序見 nouveau

使用大黃蜂(Bumblebee)

參見 Bumblebee

使用 switcheroo-control

參見 PRIME#GNOME 集成

使用 nvidia-xrun

參見 nvidia-xrun

使用 optimus-manager

參見 Optimus-manager 上游文檔。它涵蓋了在 Arch Linux 系統中的安裝和配置。

使用 EnvyControl

參見 EnvyControl 上游文檔。它涵蓋了安裝和使用說明。

使用 NVidia-eXec

參見 NVidia-eXec 上游文檔。它涵蓋了安裝和使用說明。

使用 nvidia-switch

參見 nvidia-switch 上游文檔。它涵蓋了安裝和使用說明。

疑難解答

垂直同步撕裂

開啟 DRM 內核級顯示模式設置,這將啟用 PRIME 同步並修復撕裂問題。

官方論壇查看詳細信息:forum thread

Failed to initialize the NVIDIA GPU at PCI:1:0:0 (GPU fallen off the bus / RmInitAdapter failed!)

添加 rcutree.gp_init_delay=1 到內核參數。原始話題見 [3][4]

解析度和屏幕掃描錯誤「EDID errors in Xorg.log」

這是由於 NVIDIA 的驅動程序沒有檢測顯示器的 EDID。你需要手動指定路徑的 EDID 文件或以類似的方式提供相同的信息。

增加這些線路和變化部分反映你自己的系統:

/etc/X11/xorg.conf
Section "Device"
       	Option		"ConnectedMonitor" "CRT-0"
       	Option		"CustomEDID" "CRT-0:/sys/class/drm/card0-LVDS-1/edid"
	Option		"IgnoreEDID" "false"
	Option		"UseEDID" "true"
EndSection

如果 Xorg 不會啟動,嘗試將所有 CRT 替換為 DFB。card0 是標識為英特爾卡,顯示器通過 LVDS 連接。EDID 二進制文件位於此目錄。如果硬體配置不同,CustomEDID 的值可能有所不同,但這已得到證實。不管怎樣,路徑都將從 /sys/class/drm 開始。

或者你可以使用工具如 read-edid 生成你的 EDID,並將驅動指向此文件。也可以使用 modelines,但是務必要修改 UseEDIDIgnoreEDID

無 EDID 錯誤的解析度問題

使用 nvidia-xconfig 時,可能會在 xorg.conf 中生成錯誤的信息,特別是錯誤的顯示器刷新率,限制了可能的解析度。嘗試注釋掉 HorizSync/VertRefresh 行。如果這有幫助,你可能還可以刪除本文中未提及的其他內容。

鎖定問題(lspci 掛起)

問題:lspci 掛起,系統暫停失敗,關機時掛起,optirun 掛起。多出現在新的筆記本電腦或使用了類似 bbswitch GTX 的 965m 時(例如 bumblebee)以及 nouveau 的情況。

當獨立顯卡接通電源,可能出現這種情況,參見 (kernel bug 156341)。

具體解決方法參見 this issue。 你可以添加 acpi_osi="!Windows 2015"acpi_osi=! acpi_osi="Windows 2009"內核參數中。

筆記本電腦未發現屏幕/NVIDIA Optimus

檢查輸出是否類似:

$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 02)
01:00.0 VGA compatible controller: nVidia Corporation Device 0df4 (rev a1)

NVIDIA 驅動自 319.12 Beta [5] 起已經包含在內核(版本 3.9 級以上)中。

另一個解決方案是安裝 Intel 驅動進行顯示,如果需要運行 3D 軟體,可以使用 Bumblebee 來使用 NVIDIA 顯卡。

隨機凍結 "(EE) NVIDIA(GPU-0): WAIT"

在使用集成 AMD 卡和專用 NVIDIA 卡的設置上使用專有驅動時,用戶報告凍結長達 10 秒,Xorg 日誌中出現以下錯誤:

[   219.796] (EE) NVIDIA(GPU-0): WAIT (2, 8, 0x8000, 0x0002e1c4, 0x0002e1cc)
[   226.796] (EE) NVIDIA(GPU-0): WAIT (1, 8, 0x8000, 0x0002e1c4, 0x0002e1cc)

雖然尚未找到根本原因,但似乎與集成卡和專用卡與 Xorg 的交互方式衝突有關。

解決方法是使用可切換顯卡,詳見 PRIME#PRIME render offload

使用 optimus-manager 時出現 "No Devices detected"

在某些情況下,lspci 會將 PCI 域作為第一列輸出,導致 optimus-manager 生成的文件在嘗試映射 BusID 時在多款筆記本電腦上出現問題。

如果你遇到黑屏、GUI 部分加載或 Xorg 崩潰並顯示 (EE) - No Devices detected,解決方法和錯誤報告可在 上游 GitHub 找到。

Xorg:外部顯示器僅在滑鼠移動時更新

解決方法是卸載 iGPU 的 Xorg 驅動(例如 xf86-video-amdgpuxf86-video-intel[6]。只要外部顯示器埠(HDMI/DP/USB-C)直接連接到 NVIDIA dGPU,這應該有效。

提示:桌面行為可能會變得不穩定(例如切換虛擬桌面或 Alt-Tab 時外部顯示器圖像凍結),也可以通過禁用筆記本電腦的顯示器來解決。

低功耗(TDP)

自 530.41 驅動版本以來,出現了顯卡鎖定在低功耗限制的情況(參見 GitHub issue 483)。NVIDIA 驅動已禁用使用 nvidia-smi 命令手動設置功耗限制的功能,因此許多筆記本電腦被鎖定在低功耗和性能不佳的狀態。

要解決此問題(適用於 Ampere 代或更新),啟動/啟用 nvidia-powerd.service,這將啟用 DynamicBoost

NVIDIA GPU 無法關閉或保持停用狀態

某些進程可能會由於它們與 GPU 的交互方式而保持你的 NVIDIA GPU 處於活動狀態。這會導致功耗顯著增加、電池壽命縮短和溫度升高。

你可以通過運行以下命令檢查你的 GPU 是否處於活動狀態或已掛起:

$ cat /sys/bus/pci/devices/0000\:01\:00.0/power/runtime_status

如果狀態為 active,你可能正在運行一個保持 GPU 活動的進程。

如果你使用一個探測 GPU 溫度的溫度監控器,它通常會調用 nvidia-smi 來獲取此溫度,這將喚醒你的 GPU 並保持其處於活動狀態。

你可以使用 nvtop 檢查是否有進程(如 Xorg)正在使用 NVIDIA GPU,但此方法並非在所有情況下都有效。例如,如果你運行 ollama 伺服器,它將始終保持你的 GPU 處於活動狀態,但不會顯示在 nvtop 或調用 nvidia-smi 中。

記得檢查與你選擇的故障排除方法相關的文章。