[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(視窗管理員)。時至今日,視窗管理元常可以提供許多其他功能:

  • 工作列 & 控制工具
  • 桌面背景
  • 視窗切換(最小化、最大化)& 移動
  • 多桌面(虛擬桌面)

常見的視窗管理員有:GNOMEKDEXFCEMarco 等。

移除 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 次之多才摸索出安裝方式,但目前為止,睡眠功能也都能正常運作,問題應該是不大。

感覺很久沒寫長文了,感覺有點開心,總之先祝大家新年快樂啦!

 

參考資料

發表迴響