NVIDIA Optimus - Arch Linux 中文维基

跳至內容

# NVIDIA Optimus

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 NVIDIA Optimus，最近一次同步於 2025-02-09，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- PRIME
- Bumblebee
- Nouveau
- NVIDIA
- nvidia-xrun
- External GPU

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

原因：

- 明確哪些內容特定於 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，但是務必要修改 `UseEDID` 和 `IgnoreEDID`。

### 無 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-amdgpu包 或 xf86-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` 中。

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

分類：​

- 圖形

NVIDIA Optimus
新增話題