Bumblebee - Arch Linux 中文维基

跳至內容

# Bumblebee

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

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

相關文章

- NVIDIA Optimus
- Nouveau
- NVIDIA
- Intel圖形卡

引自 Bumblebee FAQ:

"Bumblebee 致力於使 NVIDIA Optimus 在 GNU/Linux 系統上可用，實現兩塊不同的供電配置的顯卡同時插入使用，共享同一個 framebuffer。"

## Bumblebee: Linux上的 Optimus

Optimus 技術是不依賴於硬體複雜結構的 交火顯卡 實現。獨立顯卡按需渲染，並傳輸給集成顯卡，集成顯卡則負責顯示功能。當筆記本通過電池供電時，獨立顯卡將關閉，以延長電池壽命。在使用 Intel 集成顯卡和 NVIDIA 獨立顯卡的台式機上也能使用這項技術。

Bumblebee 通過軟體來實現它的功能，包括兩個部分：

- 利用獨立顯卡渲染程序，並通過集成顯卡將圖像顯示在屏幕上。這是利用 VirtualGL 或 primus （見後面小節）實現的，相當於連接到了一個供獨立顯卡使用的 X 伺服器。
- 獨立顯卡空閒的時候會被禁用。（參見 #電源管理）

Bumblebee 試圖模擬 Optimus 技術的行為；當需要的時候，使用獨立顯卡進行渲染，不使用的時候則關閉。當前的版本僅支持按需渲染，高負荷程序自動調用獨立顯卡的功能仍然在開發之中。

## 安裝

安裝 Bumblebee 之前，檢查你的 BIOS 並儘可能激活 Optimus (老式電腦稱之為"可切換顯卡"，BIOS有可能沒有提供此項設置)。如果 "Optimus" 和 "switchable" 都沒有在BIOS裡，就保證兩種GPU都已啟用並且集成顯卡是主要顯示設備。顯示應該連接在主板上的集成顯卡，而不是獨立顯卡。如果集成顯卡之前被禁用而安裝了獨立顯卡的驅動，那就刪除 `/etc/X11/xorg.conf` 或者有關獨立顯卡的 `/etc/X11/xorg.conf.d` 中的文件。

安裝:

- bumblebee包 - 提供守護進程以及程序的主要安裝包。
- mesa包 - 開源的 OpenGL 標準實現。
- 對於合適的NVIDIA驅動，參看NVIDIA#安裝。
- xf86-video-intel包 - Intel 驅動（可選）。

對於32位程序 (必須啟用Multilib）在64位機器上的支持，安裝:

- lib32-virtualgl包 - 為32位應用提供的渲染/顯示橋。
- lib32-nvidia-utils包 或者 lib32-nvidia-340xx-utilsAUR（和64位對應）。

要使用 Bumblebee，請確保添加你的用戶到 `bumblebee` 組：

    # gpasswd -a user bumblebee

並啟用 `bumblebeed.service`。重啟系統並參考#用法。

## 用法

### 測試

安裝 mesa-utils包 並使用 `glxgears` 測試 Bumblebee 是否工作：

    $ optirun glxgears -info

如果失敗，嘗試下列命令:

- 64位系統:

    $ optirun glxspheres64

- 32位系統:

    $ optirun glxspheres32

如果一個內有動畫的窗口出現，那麼 Optimus 和 Bumblebee 正在工作。

注意：如果 `glxgears` 失敗但 `glxspheresXX` 有效，替換所有 "`glxgears`" 為 "`glxspheresXX`"。

### 一般用法

    $ optirun [options] application [application-parameters]

例如，用 Optimus 啟動 Windows 程序:

    $ optirun wine application.exe

另外，用 Optimus 打開 NVIDIA 設置面板:

    $ optirun -b none nvidia-settings -c :8

注意：一個打了補丁的 nvdockAUR 版本可用： nvdock-bumblebeeAUR

更多 `optirun` 的選項參見手冊頁:

    $ man optirun

## 配置

你可以按需配置 Bumblebee 的行為，可以通過 `/etc/bumblebee/bumblebee.conf` 來調節諸如優化，電源管理，以及其他任務。

### 速度優化

#### 使用VirtualGL作為橋接

Bumblebee 使用你的 Optimus NVIDIA 顯卡來渲染一個配置了 VirtualGL 的不可見的 X 伺服器，並且將結果傳輸到你當前的 X 伺服器上。傳輸之前將壓縮偵，這可以節省帶寬並且能夠用於加速 bumblebee 的優化。

要為單個應用程式指定不同的壓縮方法：

    $ optirun -c compress-method application

壓縮方法會影響 GPU性能和GPU使用，壓縮方法會最大限度的使用 CPU,並且儘可能少的使用 GPU；非壓縮的方法最大限度的使用 GPU，而儘可能少的使用 CPU。

壓縮方法

  - `jpeg`
  - `rgb`
  - `yuv`

非壓縮方法

  - `proxy`
  - `xv`

以下是用 Asus N550JV 筆記本和測試程序 unigine-heavenAUR的性能測試結果:

Command | FPS | Score | Min FPS | Max FPS
--- | --- | --- | --- | ---
optirun unigine-heaven | 25.0 | 630 | 16.4 | 36.1
optirun -c jpeg unigine-heaven | 24.2 | 610 | 9.5 | 36.8
optirun -c rgb unigine-heaven | 25.1 | 632 | 16.6 | 35.5
optirun -c yuv unigine-heaven | 24.9 | 626 | 16.5 | 35.8
optirun -c proxy unigine-heaven | 25.0 | 629 | 16.0 | 36.1
optirun -c xv unigine-heaven | 22.9 | 577 | 15.4 | 32.2

注意：使用 `jpeg` 壓縮方法時會有延遲。

要為所有應用程式使用一個標準的壓縮方法， 在 `/etc/bumblebee/bumblebee.conf` 裡把 `VGLTransport` 設為 `compress-method`:

    /etc/bumblebee/bumblebee.conf

    [...]
    [optirun]
    VGLTransport=proxy
    [...]

你也可考慮 VirtualGL 從你的顯卡讀回像素的方式。設置 `VGL_READBACK` 環境變量為 `pbo` 應該能提升性能。比較以下兩者:

    # PBO should be faster.
    VGL_READBACK=pbo optirun glxgears
    # The default value is sync.
    VGL_READBACK=sync optirun glxgears

注意：調整CPU頻率將直接影響渲染性能

#### Primusrun

注意：因為合成會損害性能，所以不建議在合成窗口管理器（compositing WM）工作時使用primus。參照 #Primus issues under compositing window managers[損壞的連結：無效的章節]。

`primusrun` (來自 primus包) 正成為默認選項，因為其耗電量更低並且有時可以提供比 `optirun`/`virtualgl`更好的性能。它可以獨立運行，但不能接受 `optirun` 的選項。將 `primus` 設置為 `optirun` 的橋接可提供更過的靈活性。

對於64位系統上32位程序的支持，安裝 lib32-primus包（須啟用multilib）。

用法（獨立運行）：

    $ primusrun glxgears

`optirun` 的橋接：

默認的配置將 `virtualgl` 作為橋接。在命令行上將其覆蓋：

    $ optirun -b primus glxgears

或者，在 `/etc/bumblebee/bumblebee.conf` 中設置 `Bridge=primus` 使其永久生效。

提示：如果要禁用 `VSYNC` 請參考 #Primusrun mouse delay (disable VSYNC)[損壞的連結：無效的章節]。這也可以取消滑鼠延遲並輕微提高性能。

### 電源管理

電源管理的目的是為了自動關閉 bumblebee 不再使用的 NVIDIA 顯卡。 如果已安裝 bbswitch包 ，Bumblebee 守護進程啟動時會自動檢測到，不需要特別設置。

#### 使用bbswitch時默認的 NVIDIA 電源狀態

bbswitch的默認行為是保持顯卡的電源狀態。 `bumblebeed` 啟動時並不禁用顯卡，所以你沒有bumblebeed時使用bbswitch需要以下內容。

根據需要設置 `load_state` 和 `unload_state` 模塊選項 (見 bbswitch documentation).

    /etc/modprobe.d/bbswitch.conf

    options bbswitch load_state=0 unload_state=1

#### 關機時啟用NVIDIA顯卡

如果上次關機時關閉了NVIDIA顯卡的電源，NVIDIA顯卡可能會在下一次啟動時初始化異常。一個解決的辦法是在 `/etc/bumblebee/bumblebee.conf` 裡設置 `TurnCardOffAtExit=false`， 然而這麼做會導致每次停止bumblebee守護進程時啟用NVIDIA顯卡，就算是手動停止也是一樣。為確保NVIDIA顯卡總是在關機時啟用，添加如下 systemd 服務(如果使用 bbswitch包 的話):

    /etc/systemd/system/nvidia-enable.service

    [Unit]
    Description=Enable NVIDIA card
    DefaultDependencies=no

    [Service]
    Type=oneshot
    ExecStart=/bin/sh -c 'echo ON > /proc/acpi/bbswitch'

    [Install]
    WantedBy=shutdown.target

然後以root權限運行 `systemctl enable nvidia-enable.service` 以啟用服務。

### 多顯示器

#### 顯示器連接在 Intel 顯卡上

如果 (DisplayPort/HDMI/VGA) 接口連接到 Intel 顯卡上，你可以通過 xorg.conf 設置多個顯示器。設置他們使用 Intel 顯卡，同時 Bumblebee 仍然可以使用 NVIDIA 顯卡。下面的配置文件示例配置了兩個不同的 1080p 的顯示器，並且使用了 HDMI 輸出。

    /etc/X11/xorg.conf

    Section "Screen"
        Identifier     "Screen0"
        Device         "intelgpu0"
        Monitor        "Monitor0"
        DefaultDepth    24
        Option         "TwinView" "0"
        SubSection "Display"
            Depth          24
            Modes          "1980x1080_60.00"
        EndSubSection
    EndSection

    Section "Screen"
        Identifier     "Screen1"
        Device         "intelgpu1"
        Monitor        "Monitor1"
        DefaultDepth   24
        Option         "TwinView" "0"
        SubSection "Display"
            Depth          24
            Modes          "1980x1080_60.00"
        EndSubSection
    EndSection

    Section "Monitor"
        Identifier     "Monitor0"
        Option         "Enable" "true"
    EndSection

    Section "Monitor"
        Identifier     "Monitor1"
        Option         "Enable" "true"
    EndSection

    Section "Device"
        Identifier     "intelgpu0"
        Driver         "intel"
        Option         "XvMC" "true"
        Option         "UseEvents" "true"
        Option         "AccelMethod" "UXA"
        BusID          "PCI:0:2:0"
    EndSection

    Section "Device"
        Identifier     "intelgpu1"
        Driver         "intel"
        Option         "XvMC" "true"
        Option         "UseEvents" "true"
        Option         "AccelMethod" "UXA"
        BusID          "PCI:0:2:0"
    EndSection

    Section "Device"
        Identifier "nvidiagpu1"
        Driver "nvidia"
        BusID "PCI:0:1:0"
    EndSection

你可能需要為Intel和NVIDIA顯卡調整 BusID 欄位的值:

    $ lspci | grep VGA

    00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)

BusID 值為 0:2:0

#### 顯示器連接在 NVIDIA 顯卡上

在一些筆記本上，數字視頻輸出(HDMI 或 DisplayPort) 是硬線連接到NVIDIA晶片上的。如果你想同時使用所有的顯示器，你需要開兩個 X Server.第一個使用Intel驅動用於筆記本面板和連接到VGA上的顯示，第二個由optirun啟用NVIDIA顯卡用於數字顯示。

目前網上有一些有關這個的設置教程。其中一個可在Bumblebee的 wiki 頁面找到，另一個詳見下文。

##### xf86-video-intel-virtual-crtc 和 hybrid-screenclone

本方法使用了一個打了補丁來擴展為含有一個虛擬顯示器的Intel驅動，而hybrid-screenclone程序用於把虛擬顯示器的內容複製到通過optirun運行於NVIDIA顯卡的第二個X Server上的顯示器上。有幸發現 Triple-head monitors on a Thinkpad T520 它是這一切在Ubuntu系統上如何完成的詳細解說。

精簡起見，下文DP指代 Digital Output (DisplayPort).如果筆記本是HDMI接口的話教程也是一樣。

- 設置系統為只使用 NVIDIA 顯卡，測試 DP/顯示器組合，並生成 xorg.nvidia.conf.這步並非必須但推薦在支持設置為nvidia-only的BIOS上執行。為此，首先卸載 bumblebee 包，並只安裝 NVIDIA 驅動。然後重啟，進入BIOS設置為NVIDIA-only.重啟進入Arch時，把顯示器連接到DP並使用 startx 來檢測這一切是否正常工作。使用 Xorg -configure 來為你的NVIDIA顯卡生成 xorg.conf 文件。這在向下進一步深入時會派上用場。

- 重新安裝 bumlbebee 和 bbswitch,重啟並在BIOS裡設置系統 Gfx 值回到 Hybrid.
- 安裝 xf86-video-intel-virtual-crtcAUR[損壞的連結：package not found],並以它替換掉 xf86-video-intel.
- 安裝 screenclone-gitAUR[損壞的連結：package not found]
- 改變以下 bumblebee.conf 設置:

    /etc/bumblebee/bumblebee.conf

    KeepUnusedXServer=true
    Driver=nvidia

注意：把 PMMethod 保留不變為 "bumblebee".這與上面連結裡教程的做法相反，但在Arch裡需這麼做以使 bbswitch 模塊自動加載。

- 複製在第一步裡生成的 xorg.conf 到 `/etc/X11` (例如 `/etc/X11/xorg.nvidia.conf`).在 `bumblebee.conf` 的[driver-nvidia]部分，修改 `XorgConfFile` 為它的路徑。
- 測試你的 `/etc/X11/xorg.nvidia.conf` 是否有效 `startx -- -config /etc/X11/xorg.nvidia.conf`
- 為了你的DP顯示器在虛擬顯示器上以正常解析度出現，你需要編輯 `/etc/X11/xorg.nvidia.conf` 裡的Monitor section.由於這是附加步驟，你仍需要測試你自動生成的 xorg.conf.當發現 xrandr 顯示的虛擬顯示器解析度不對後，再回來參考教程裡的這條步驟。
  - 首先要生成 Modeline.你需要工具 amlc,它用於輸入一些基本參數後自動生成 Modeline.

    例子: 24" 1920x1080 Monitor
    以 `amlc -c` 參數啟動工具

    Monitor Identifier: Samsung 2494
    Aspect Ratio: 2
    physical size[cm]: 60
    Ideal refresh rate, in Hz: 60
    min HSync, kHz: 40
    max HSync, kHz: 90
    min VSync, Hz: 50
    max VSync, Hz: 70
    max pixel Clock, MHz: 400

這就是 `amlc` 生成的 Monitor Section:

    Section "Monitor"
        Identifier     "Samsung 2494"
        ModelName      "Generated by Another Modeline Calculator"
        HorizSync      40-90
        VertRefresh    50-70
        DisplaySize    532 299  # Aspect ratio 1.778:1
        # Custom modes
        Modeline "1920x1080" 174.83 1920 2056 2248 2536 1080 1081 1084 1149             # 174.83 MHz,  68.94 kHz,  60.00 Hz
    EndSection  # Samsung 2494

在 `xorg.nvidia.conf` 裡加入這個 Monitor Section.你還可以編輯你的文件使其包含 ServerLayout, Monitor, Device 和 Screen 部分。以下是我的，僅供參考:

    /etc/X11/xorg.nvidia.conf

    Section "ServerLayout"
            Identifier     "X.org Nvidia DP"
            Screen      0  "Screen0" 0 0
            InputDevice    "Mouse0" "CorePointer"
            InputDevice    "Keyboard0" "CoreKeyboard"
    EndSection

    Section "Monitor"
        Identifier     "Samsung 2494"
        ModelName      "Generated by Another Modeline Calculator"
        HorizSync      40-90
        VertRefresh    50-70
        DisplaySize    532 299  # Aspect ratio 1.778:1
        # Custom modes
        Modeline "1920x1080" 174.83 1920 2056 2248 2536 1080 1081 1084 1149             # 174.83 MHz,  68.94 kHz,  60.00 Hz
    EndSection  # Samsung 2494

    Section "Device"
            Identifier  "DiscreteNvidia"
            Driver      "nvidia"
            BusID       "PCI:1:0:0"
    EndSection

    Section "Screen"
            Identifier "Screen0"
            Device     "DiscreteNvidia"
            Monitor    "Samsung 2494"
            SubSection "Display"
                    Viewport   0 0
                    Depth     24
            EndSubSection
    EndSection

- 也要把額外顯示器插上之後再 startx.查看 `/var/log/Xorg.0.log`.確保你的VGA顯示器以正確的模式被檢測出來。你也要看看虛擬輸出出現的模式。
- 運行 `xrandr` 然後三個顯示器以及它們支持的模式都會被列出來。
- 如果對於你的VIRTUAL顯示器沒有符合你原生解析度的Modelines輸出, 記下輸出的名稱。對我來說是 `VIRTUAL1`.然後再看看 Xorg.0.log 文件。你應該會看到一條消息: "Output VIRTUAL1 has no monitor section".我們需要在 `/etc/X11/xorg.conf.d` 裡放入含有合適 Monitor Section 的文件，稍後退出並重啟X.

    /etc/X11/xorg.conf.d/20-monitor_samsung.conf

    Section "Monitor"
        Identifier     "VIRTUAL1"
        ModelName      "Generated by Another Modeline Calculator"
        HorizSync      40-90
        VertRefresh    50-70
        DisplaySize    532 299  # Aspect ratio 1.778:1
        # Custom modes
        Modeline "1920x1080" 174.83 1920 2056 2248 2536 1080 1081 1084 1149             # 174.83 MHz,  68.94 kHz,  60.00 Hz
    EndSection  # Samsung 2494

- 為開啟NVIDIA顯卡，運行: `sudo tee /proc/acpi/bbswitch <<< ON`
- 為 DisplayPort 顯示器開啟另一個X Server: `sudo optirun true`
- 檢查位於 `/var/log/Xorg.8.log` 的第二個 X Server 的日誌。
- 運行 xrandr 以把 VIRTUAL 顯示器設置成正確的大小和位置，例如: `xrandr --output VGA1 --auto --rotate normal --pos 0x0 --output VIRTUAL1 --mode 1920x1080 --right-of VGA1 --output LVDS1 --auto --rotate normal --right-of VIRTUAL1`
- 請注意在 xrandr 輸出列表中的 VIRTUAL 顯示器的位置。計數從零開始，也就是說，如果它給出了第三個顯示器，你會指定 `-x 2` 作為參數傳遞給 `screenclone`（註：這可能並不總是正確的。如果你看到內部的筆記本電腦顯示屏克隆在監視器上，只管嘗試 `-x 2`）。
- 克隆VIRTUAL顯示器的內容到由Bumblebee創建的，經由NVIDIA的晶片連接到所述的DisplayPort顯示器的X伺服器:

  `screenclone -d :8 -x 2`

這就行了，三個顯示器都應該配置好並正常工作。

## 如 Windows 一般在集顯和獨顯間切換

在 Windows 裡，Optimus 的工作方式是NVIDIA有一個請求 Optimus 的程序的白名單，並且你可以按需添加。當你啟動程序時，會自動選擇使用哪一張顯卡。

為了在Linux裡模仿這一行為，你可以使用 libgl-switcheroo-gitAUR[損壞的連結：package not found].安裝後，往 .xprofile 裡添加:

    ~/.xprofile

    mkdir -p /tmp/libgl-switcheroo-$USER/fs
    gtkglswitch &
    libgl-switcheroo /tmp/libgl-switcheroo-$USER/fs &

為此，你需要往你希望啟動程序的shell裡添加 (我一般就加到 .xprofile 裡)

    export LD_LIBRARY_PATH=/tmp/libgl-switcheroo-$USER/fs/\$LIB${LD_LIBRARY_PATH+:}$LD_LIBRARY_PATH

全部完成後，你從該shell運行的每一個程序都會彈出一個GTK+窗口詢問該使用哪一張卡(你也可以往配置文件的白名單裡添加程序)。配置文件位於 `$XDG_CONFIG_HOME/libgl-switcheroo.conf`, 通常是 `~/.config/libgl-switcheroo.conf`

注意：此工具通過創建FUSE文件系統，然後將其添加到動態庫搜索路徑來生效，啟動軟體時，可能導致速度慢甚至段錯誤。

## 疑難問題

注意：報告 Bug 的位置在 Bumblebee-Project，Bumblebee 的 Wiki 中描述。

### [VGL] ERROR: Could not open display :8

一個關於部分wine程序的已知問題是它會fork並殺死父進程而不是跟蹤它的動態(例如免費網路遊戲 "Runes of Magic")

這是一個關於 VirtualGL 的已知問題。自從bumblebee 3.1,只要你安裝了它就可以用 Primus 作為渲染橋接:

    $ optirun -b primus wine windows program.exe

如果沒用的話，一個替代方案如下:

    $ optirun bash
    $ optirun wine windows program.exe

如果使用NVIDIA驅動的話，一個該問題的解決方案是修改 `/etc/bumblebee/xorg.conf.nvidia` 把 Option `ConnectedMonitor` 改為 `CRT-0`.

### Xlib: extension "GLX" missing on display ":0.0"

從官網下載安裝的NVIDIA驅動不會工作。

1. 卸載驅動：

    # ./NVIDIA-Linux-*.run --uninstall

2. 刪除生成的配置文件：

    # rm /etc/X11/xorg.conf

3. 重新從源裡安裝： #安裝

### [ERROR]Cannot access secondary GPU: No devices detected

某些情況下，運行 `optirun` 會返回:

    [ERROR]Cannot access secondary GPU - error: [XORG] (EE) No devices detected.
    [ERROR]Aborting because fallback start is disabled.

這種情況下，你需要把 `/etc/X11/xorg.conf.d/20-intel.conf` 移動到別的地方， restart bumblebeed 守護進程，這樣應該有效。如果你要改變一些 Intel 模塊的特性，把 `/etc/X11/xorg.conf.d/20-intel.conf` 合併到 `/etc/X11/xorg.conf` 中。

也需要把 `/etc/X11/xorg.conf.d/10-monitor.conf` 裡的driver行注釋掉。

如果你正在用 `nouveau` 驅動你應該試著換成 `nvidia` 驅動。

你需要把 NVIDIA 顯卡定位到別的地方 (例如文件 `/etc/X11/xorg.conf.d`),使用根據 `lspci` 的輸出確定的 `BusID`:

    Section "Device"
        Identifier "nvidiagpu1"
        Driver "nvidia"
        BusID "PCI:0:1:0"
    EndSection

#### NVIDIA(0): Failed to assign any connected display devices to X screen 0

如果終端輸出如下:

    [ERROR]Cannot access secondary GPU - error: [XORG] (EE) NVIDIA(0): Failed to assign any connected display devices to X screen 0
    [ERROR]Aborting because fallback start is disabled.

你要修改 `/etc/bumblebee/xorg.conf.nvidia` 裡的這行:

    Option "ConnectedMonitor" "DFP"

為:

    Option "ConnectedMonitor" "CRT"

#### systemd-logind: failed to get session: PID XXX does not belong to any known session

如果終端輸出如下 (PID會有所不同):

    [ERROR]Cannot access secondary GPU - error: [XORG] (EE) systemd-logind: failed to get session: PID 753 does not belong to any known session
    [ERROR]Aborting because fallback start is disabled.

在 /etc/mkinitcpio.conf 裡改變 MODULES 為:

    MODULES="i915 bbswitch"

或:

    MODULES="i915 nouveau bbswitch"

然後運行:

    # mkinitcpio -p linux

每次內核更新之後你都要執行一次這個命令。

另外，如下內核參數需要加到 boot loader配置中。

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

把 `rcutree.rcu_idle_gp_delay=1` 加到boot loader 配置的內核參數中。 (參考設置另見BBS post )

#### Could not load GPU driver

如果終端輸出如下:

    [ERROR]Cannot access secondary GPU - error: Could not load GPU driver

並且嘗試加載 nvidia 模塊時得到:

    modprobe nvidia
    modprobe: ERROR: could not insert 'nvidia': Exec format error

你需要針對你的內核手動編譯 nvidia 包，例如 nvidia-dkms包 或從 ABS nvidia包 編譯。

#### NOUVEAU(0): [drm] failed to set drm interface version

考慮切換到 nvidia 官方驅動。在此的評論說 nouveau 驅動在某些顯卡和bumblebee上有問題。

### [ERROR]Cannot access secondary GPU - error: X did not start properly

在 `/etc/bumblebee/xorg.conf.nvidia` 把 `"AutoAddDevices"` 設置為 `"true"`（看這裡）：

    Section "ServerLayout"
        Identifier  "Layout0"
        Option      "AutoAddDevices" "true"
        Option      "AutoAddGPU" "false"
    EndSection

### /dev/dri/card0: failed to set DRM interface version 1.4: Permission denied

這可以通過在 `/etc/bumblebee/xorg.conf.nvidia` 裡添加幾行解決(見這裡):

    Section "Screen"
        Identifier "Default Screen"
        Device "DiscreteNvidia"
    EndSection

### ERROR: ld.so: object 'libdlfaker.so' from LD_PRELOAD cannot be preloaded: ignored

你也許是想在64位系統上用bumblebee運行32位程序。見 "Note" box Installation[損壞的連結：無效的章節].

### Fatal IO error 11 (Resource temporarily unavailable) on X server

把 `/etc/bumblebee/bumblebee.conf` 裡的 `KeepUnusedXServer` 從 `false` 改為 `true`.這是因為你的程序fork到了後台並且 bumblebee 對此一無所知。

### 視頻撕裂

視頻撕裂是 Bumblebee 上一個常見的問題，要修復這個問題，你需要啟用 vsync。默認情況下，Intel 顯卡已啟用此設置，但是還是檢查一下 Xorg 的日誌，要檢查 nvidia 是否啟用了此設置，運行:

    $ optirun nvidia-settings -c :8

`X Server XVideo Settings -> Sync to VBlank` 以及 `OpenGL Settings -> Sync to VBlank` 應該都是已經啟用狀態。 Intel 顯卡通常有比較少的撕裂，所以應該作為視頻回放設備。特別是使用 VA-API 編碼視頻的時候（比如：`mplayer-vaapi` 以及 `-vsync` 參數）。

參考Intel[損壞的連結：無效的章節]了解如何修復 Intel 顯卡的視頻撕裂。

如果仍然無效，嘗試從桌面環境禁用 compositing。同時可嘗試禁用 triple buffering.

### Bumblebee cannot connect to socket

你可能會得到這樣的輸出:

    $ optirun glxspheres64

或 (32位):

    $ optirun glxspheres32

    [ 1648.179533] [ERROR]You've no permission to communicate with the Bumblebee daemon. Try adding yourself to the 'bumblebee' group
    [ 1648.179628] [ERROR]Could not connect to bumblebee daemon - is it running?

如果你已在 `bumblebee` 群組中 (`$ groups | grep bumblebee`),嘗試 removing the socket `/var/run/bumblebeed.socket`.

### Running X.org from console after login (rootless X.org)

見 Xorg#Rootless Xorg (v1.16)[損壞的連結：無效的章節].

### Primusrun 滑鼠延遲/禁用 VSYNC

對於 `primusrun`, `VSYNC` 默認啟用，因此會導致滑鼠輸入延遲甚至輕微降低性能。不用 `VSYNC` 來測試 `primusrun`:

    $ vblank_mode=0 primusrun glxgears

如果你想使用它替代 `primusrun`,新建文件:

    /usr/bin/optiprime

    #!/bin/sh
    vblank_mode=0 primusrun "$@"

讓它可執行:

    # chmod +x /usr/bin/optiprime

用法:

    $ optiprime glxgears

總之它不會有重大性能提升，但會解決上述的滑鼠延遲。

Command | FPS | Score | Min FPS | Max FPS
--- | --- | --- | --- | ---
optiprime unigine-heaven | 31.5 | 793 | 22.3 | 54.8
primusrun unigine-heaven | 31.4 | 792 | 18.7 | 54.2

Tested with Asus N550JV laptop and benchmark app unigine-heavenAUR.

## 另見

- Bumblebee project repository[失效連結 2022-09-17 ⓘ]
- Bumblebee project wiki
- Bumblebee project bbswitch repository

分類：​

- 圖形
- X 伺服器
- 包含損壞的軟體包連結的頁面
- 包含失效連結的頁面

隱藏分類：​

- 包含損壞章節連結的頁面

Bumblebee
新增話題