[Linux] 如何使用 Bumblebee 讓你的 Nvidia 筆電也有自動切換
近期台灣出廠的筆電多半搭載 Nvidia 的獨立顯示晶片,對有遊戲需求的人是一大福音,但對需要使用 Linux 進行工作的人來說,可就是一個很大的困擾,雖然驅動程式的部份已經相當完善,但一直開著獨顯就是不夠省電,於是今天要來教大家如何設定切換功能喔!
淺談 Linux 顯示
嘛~ 雖然有點俗套,但我認為要處理這個問題之前,先對背後的運作有基本的了解,會是比較正確的做法。
X 是一套 X.org 使用 MIT 授權方式散佈的自由軟體,大部分的 Linux 發行版皆使用 X 來提供圖形界面的處理能力,稱之為 X11。
X11 使用 伺服器 – 客戶端 的架構來提供服務,主要可以分成幾個主要的部份:
X Server:硬體管理、螢幕繪製與提供字型功能:
為了提供圖形界面,X Server 管理電腦上與使用者互動的輸出入裝置,包含 鍵盤、滑鼠、顯示器(螢幕解析度 與 色彩深度)、顯示卡 (包含驅動程式)與 顯示的字型 等。
咦!顯示卡、螢幕以及鍵盤滑鼠的設定,不是在開機的時候 Linux 系統以 systemd 的相關設定處理好了嗎? 為何 X Server 還要重新設定啊?這是因為 X Window 在 Linux 裡面僅能算是『一套很棒的軟體』, 所以 X Window 有自己的設定檔,你必須要針對他的設定檔設定妥當才行。也就是說, Linux 的設定與 X Server 的設定不一定要相同的!因此,你在 CentOS 7 的 multi-user.target 想要玩圖形介面時,就得要載入 X Window 需要的驅動程式才行~總之, X Server 的主要功能就是在管理『主機』上面的顯示硬體與驅動程式。
《鳥哥的 Linux 私房菜》
雖然 Client – Server 的架構讓人看起來覺得很像是終端機時代的玩法,但請回想一下,我們的個人電腦是怎麼做的,我們使用電腦的時候有需要先連線到伺服器才能打開應用程式嗎?再看一次架構圖,我們就可以了解,X Server 和 X Client 其實可以是同一台電腦上的 2 套程式,網路架構提供的是清楚的實作架構,和權責區分,透過降低元件之間的耦合性,讓重複利用和開發都更加方便。
X Client:負責 X Server 要求的『事件』之處理:
而 X Client 則是負責使用 X Server 提供的資源。X Client 告訴 X Server 有哪些東西需要繪製,應該怎麼繪製,而 X Server 則會在特定 “事件” 發生時,告知 X Client,並運算 X Client 回傳的結果。
舉個例子來說,當我們在 X Window 的畫面中,將滑鼠向右移動,那他是怎麼告知 X Server 與 X Client 的呢? 首先, X server 會偵測到滑鼠的移動,但是他不知道應該怎麼繪圖啊!此時,他將滑鼠的這個動作告知 X Client, X Client 就會去運算,結果得到,嘿嘿!其實要將滑鼠指標向右移動幾個像素,然後將這個結果告知 X server , 接下來,您就會看到 X Server 將滑鼠指標向右移動囉~
《鳥哥的 Linux 私房菜》
X Window Manager:特殊的 X Client ,負責管理所有的 X Client 軟體
有了 Client 也有了 Server ,感覺好像一切都 OK 了!是嗎?
實際上,各個 Client(App)之間並不知道彼此的存在,也不應該知道,而 Server 端負責畫,但不負責決定怎麼畫阿!那這樣就糟糕了!因為同時顯示來自多個 Client(App)的畫面將會變得不可能,視窗的概念也就不存在了。
所以我們需要一個特別的 Client,作為 Supervisor 的角色,協調各個 Client 在螢幕上的位置、前後關係,這就是 X Window Manager(視窗管理員)。時至今日,視窗管理元常可以提供許多其他功能:
- 工作列 & 控制工具
- 桌面背景
- 視窗切換(最小化、最大化)& 移動
- 多桌面(虛擬桌面)
常見的視窗管理員有:GNOME、KDE、XFCE、Marco 等。
移除 Nvidia 專有驅動程式
首先請先將驅動程式改回 X.org (Nouveau)
▲ 系統設定值…
▲ 軟體和更新
▲選擇 X.Org X server,重新啟動
接著執行以下指令,移除 Nvidia 的驅動程式:
sudo apt-get remove --purge nvidia-*
由於 nvidia-common 套件的相依性關係,移除時可能會連帶移除 ubuntu-desktop,請執行以下指令確保安裝:
sudo apt-get install ubuntu-desktop
然後再次重新開機!
安裝 Bumblebee
當你確定一切正常之後,你就可以開始安裝 Bumblebee!首先請確認自己的 Nvidia 驅動程式建議訊息,除了先前提到的圖形化界面以外,
也可以使用以下指令:
ubuntu-drivers devices
為了穩定性和效能的平衡,通常使用 recommand(建議)的選項。
※※ 此時先不要安裝 ※※
接下來我們要一起安裝 Bumblebee 和 Nvidia 的驅動程式:
sudo apt-get install bumblebee bumblebee-nvidia primus linux-headers-generic nvidia-{版本} nvidia-opencl-icd-{版本}
請在此時輸入你先前查到的版本,以小獅這時候的系統舉例:
sudo apt-get install bumblebee bumblebee-nvidia primus linux-headers-generic nvidia-352-updates nvidia-opencl-icd-352-updates
安裝完成後,請重新啟動你的電腦!
為了確認是否正確運作,我們通常使用 glxinfo 這個工具來驗證顯示晶片,並配合 glxgears 來驗證效能。因為 Ubuntu 並未預載此工具,請先安裝 mesa-utils 套件。
Mesa 是一組開放原始函式庫的集合,實作了許多算繪(render)和多媒體加速 API。包含 3D 硬體加速,3D 繪圖 和 GPGPU,其中最廣為人知的就是 OpenGL。
sudo apt-get install mesa-utils
▲ 首先執行一次 glxinfo 看看,嗯… 好像太多了…
篩選一下結果好了,先看個晶片廠商(vendor)好了:
glxinfo | grep -i vendor
▲ 嗯?Intel 顯示晶片
所以我們失敗了?當然不是,因為我們要的可是自由切換的能力阿!若是一直使用獨顯的話還有什麼意義?
原來,Bumblebee 提供了一個指令可以用來切換:
optifine {程式名稱}
以 Firefox 為例,會變成:
optirun firefox
那我們再用 glxinfo 試試:
optirun glxinfo | grep -i vendor
▲ 鏘 鏘 ! 變成 Nvidia 了!
▲3D 繪圖也正常運作(使用 glxgears 示範)
關於 glxgears 直接按 Ctrl – C 會出現以下錯誤訊息的原因,小獅尚不清楚,若有熟悉該工具的人,請務必留言告知!
primus: warning: dropping a frame to avoid deadlock XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0" after 31 requests (31 known processed) with 0 events remaining. primus: warning: dropping a frame to avoid deadlock primus: warning: timeout waiting for display worker
錯誤排除
小師到目前為止,遇過的錯誤訊息包括:
Drm:intel_pipe_config_compare [i915]] *error* mismatch in ips_enabled[ERROR]Cannot access secondary GPU - error: [XORG] (EE) No devices detected.大家還有遇到什麼樣的問題,也請盡管發問喔!
若你遇到 Bumblebee 無法正確運作的狀況,請檢查以下幾個設定:
顯示卡的 BusID 是否正確?
首先是 BusID 的部份,請使用以下 2 個指令檢查:
# 顯示名稱中包含 nvidia(不分大小寫)的 PCI(E) 裝置 sudo lspci | grep -i nvidia # 顯示 Bumblebee 的 Nvidia 設定檔中,bus 資訊的那一行 cat /etc/bumblebee/xorg.conf.nvidia | grep -i bus
若有不同,請自行以 root 權限(sudo)修改設定檔
Kernel Module 是否正確載入
▲ Intel 驅動程式(即 i915)應該被載入,而這時 Nvidia 的應該試看不到的
Bumblebee 主設定檔是否正確
請使用你熟悉的文字編輯器打開設定檔,以下使用 vim 進行示範:
sudo vim /etc/bumblebee/bumblebee.conf
▲Driver=nvidia
若你按照先前的教學操作,安裝了 Nvidia 專利驅動程式,請選擇 nvidia,反之則選擇 nouveau
檢查核心模組的名稱,和函式庫的路徑是否正確。
若不確定核心名稱是什麼,可以使用 modinfo 配合 Tab 自動完成來確認:
先輸入 sudo modinfo nvidia_ 然後按下 Tab 補完,最後按下 Enter,以小獅的系統為例:
sudo modinfo nvidia_352_updates filename: /lib/modules/4.2.0-27-generic/updates/dkms/nvidia_352_updates.ko alias: char-major-195-* version: 352.63 supported: external license: NVIDIA # 以下略...
GL Libraries 是否正確
請先執行以下指令確認目前的 32bit GL 函式庫 預設值:
sudo update-alternatives --config i386-linux-gnu_gl_conf
請選擇 /usr/lib/i386-linux-gnu/mesa/ld.so.conf 選項,以上圖為例,輸入數字 1 後按下 Enter 確認
64bit GL 函式庫 也是同理,選擇 Mesa:
sudo update-alternatives --config x86_64-linux-gnu_gl_conf
修改完成後請使用 sudo ldconfig 重新載入設定,或重新啟動
X11 設定檔是否正確
先用 grep 找出設定檔再開啟,關於這點小獅也不是很清楚,總之小獅我的設定檔如下:
後記
其實 Nvidia 的驅動程式中也有切換顯示晶片的選項,但是它是以每次的 session 為區分的,雖然比較穩定,但是每次要切換就得先重新登入,實在有夠麻煩;而 Bumblebee 採用 per-application 的方式,就顯得相當方便,好上手!而穩定性的方面,雖然小獅我花了3 天的時間,重灌了5 次之多才摸索出安裝方式,但目前為止,睡眠功能也都能正常運作,問題應該是不大。
感覺很久沒寫長文了,感覺有點開心,總之先祝大家新年快樂啦!
參考資料
- Bumblebee – Ubuntu Wiki
- How can I uninstall a nvidia driver completely ?
- Cannot get rid of nvidia drivers, restore nouveau driver and get desktop working
- How to list all installed packages?
- Drm:intel_pipe_config_compare [i915]] *error* mismatch in ips_enabled
- Ubuntu 如何設定語系 (locale) ?
- 鳥哥的 Linux 私房菜 — 第二十三章、X Window 設定介紹
- X Window系統 | 維基百科
- X Window System | Wikipedia
- Mesa (computer graphics) | Wikipedia
- 還有一些我想不起來,總之先這樣
感謝大大的分享
最近也在處理這個
非常謝謝您
啊!這篇已經有點舊了,建議可以直接使用 Pop_OS!
它是基於 Ubuntu 的客製化發行版,對 NVidia GPU 的支援性有特別下工夫,切換起來比較不容易出問題
https://support.system76.com/articles/graphics-switch-pop/