NVIDIA Optimus
NVIDIA Optimus は Intel の内蔵 GPU とディスクリートの NVIDIA GPU をノートパソコンに組み込んで利用できるようにする技術です。Arch Linux で Optimus グラフィックを動作させるには、以下で示すような複雑な手順が必要となります。複数の方法が存在います:
- BIOS でどちらかのデバイスを無効化する。NVIDIA デバイスを無効化した場合、バッテリーの持ちがよくなりますが、BIOS によっては無効化できない場合もあり GPU 切り替えができなくなります。
- プロプライエタリの NVIDIA ドライバーに含まれている公式の Optimus サポートを使う。NVIDIA のパフォーマンスを最大限発揮できますが、GPU 切り替えは不可能で、さらにオープンソースドライバーよりもバグが多く存在します。
- オープンソースの nouveau ドライバーの PRIME 機能を使う。GPU 切り替えが可能ですがプロプライエタリの NVIDIA ドライバーと比べるとパフォーマンスで劣ります。さらに省電力機能は実装されていません。
- サードパーティの Bumblebee プログラムを使って Optimus のような機能を実現する。GPU 切り替えが可能で省電力機能も使えますが別個に設定が必要です。
以下では上記の方法を説明します。
スイッチャブルグラフィックスの無効化
特定の GPU だけを使用して切り替えをしない場合、システムの BIOS で切り替えを無効にできないか確認してください。カードのどちらか片方を無効化するオプションがあるはずです。ノートパソコンによってはディスクリートカードしか無効化できない場合や逆の場合もありますが、片方のカードしか使わないときは確認する価値があるでしょう。両方のカードを使う場合、または使うつもりのないカードを無効化できないときは、以下の方法を見て下さい。
nvidia を使う
プロプライエタリの NVIDIA ドライバーは nouveau ドライバーのような動的な切り替えはサポートしていません (つまり NVIDIA デバイスしか使用できません)。また、NVIDIA は画面にティアリングが発生する問題を認識していますが未だに修正がなされていません。そのかわり、ディスクリート GPU を利用して nouveau ドライバーよりも高い性能を発揮することができます (2013年10月現在)。
まず公式リポジトリから nvidia, nvidia-libgl, xorg-xrandr をインストールしてください。
そして、xorg.conf
を設定します。NVIDIA カードの PCI アドレスを知る必要があるので、次のコマンドを実行してください:
$ lspci | grep -E "VGA|3D"
NVIDIA と書かれた行の最初の7文字が PCI アドレスです。例えば 01:00.0
などと表記されます。xorg.conf
では #:#:#
という形式で表記する必要があります。例えば 01:00.0
の場合 1:0:0
となります。
バージョン 1.17.2 以降の X.Org サーバーがインストールされているなら ([1]):
/etc/X11/xorg.conf
Section "Module" Load "modesetting" EndSection Section "Device" Identifier "nvidia" Driver "nvidia" BusID "<BusID for NVIDIA device here>" Option "AllowEmptyInitialConfiguration" EndSection
古いバージョンの X サーバーでは:
/etc/X11/xorg.conf
Section "ServerLayout" Identifier "layout" Screen 0 "nvidia" Inactive "intel" EndSection Section "Device" Identifier "nvidia" Driver "nvidia" # Change BusID if necessary. Tips: (lspci | grep 3D) (Change 01:00.0 to 1:0:0) BusID "PCI:1:0:0" EndSection Section "Screen" Identifier "nvidia" Device "nvidia" Option "AllowEmptyInitialConfiguration" "Yes" EndSection Section "Device" Identifier "intel" Driver "modesetting" # Change BusID if necessary. Tips: (lspci | grep VGA) (Change 00:02.0 to 0:2:0) BusID "PCI:0:2:0" Option "AccelMethod" "none" EndSection Section "Screen" Identifier "intel" Device "intel" EndSection
次に、~/.xinitrc
の最初に以下の2行を追加してください:
~/.xinitrc
xrandr --setprovideroutputsource modesetting NVIDIA-0 xrandr --auto
そしてドライバーをロードするために再起動し、X を起動させます。
ディスプレイの dpi が正しくない場合は以下の行を追加してください:
xrandr --dpi 96
X の起動時に黒画面が表示される場合、~/.xinitrc
に記述した xrandr
コマンドの後にアンパサンドがないことを確認してください。アンパサンドがある場合、xrandr
コマンドが実行し終える前にウィンドウマネージャが起動してしまうことがあり、そうなると黒画面になってしまいます。
アンパサンドがないのに黒画面になる場合、下の #別の設定 を見て下さい。
別の設定
リリース 1.17.1 から、上記の設定を使っていて Xorg-server がクラッシュするようになった場合、/etc/X11/xorg.conf
の Intel デバイスのセクションを以下のように修正してください:
# nano /etc/X11/xorg.conf
Section "Device" Identifier "intel" Driver "modesetting" BusID "PCI:0:2:0" Option "AccelMethod" "sna" #Option "TearFree" "True" #Option "Tiling" "True" #Option "SwapbuffersWait" "True" EndSection
上の設定と同じように、BusID
は lspci コマンドの出力にあわせて置き換えてください。Intel という文字列が含まれた "VGA compatible controller" の行を検索してください。例:
$ lspci | grep VGA 00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 0b)
ディスプレイマネージャ
ディスプレイマネージャを使用する場合、~/.xinitrc
の代わりにディスプレイマネージャのディスプレイ設定スクリプトを作成・編集する必要があります。
LightDM
LightDM ディスプレイマネージャの場合:
/etc/lightdm/display_setup.sh
xrandr --setprovideroutputsource modesetting NVIDIA-0 xrandr --auto
スクリプトに実行可能属性を付与:
# chmod +x /etc/lightdm/display_setup.sh
/etc/lightdm/lightdm.conf
の [SeatDefaults]
セクションを編集してスクリプトを実行するように lightdm を設定:
/etc/lightdm/lightdm.conf
[SeatDefaults] display-setup-script=/etc/lightdm/display_setup.sh
再起動して、ディスプレイマネージャが起動するのを確認してください。
SDDM
SDDM ディスプレイマネージャの場合:
/usr/share/sddm/scripts/Xsetup
xrandr --setprovideroutputsource modesetting NVIDIA-0 xrandr --auto
GDM
GDM ディスプレイマネージャの場合 .desktop
ファイルを作成します:
/usr/share/gdm/greeter/autostart/display_setup.desktop
[Desktop Entry] Type=Application Name=Display setup Exec=sh -c "xrandr --setprovideroutputsource modesetting NVIDIA-0; xrandr --auto" NoDisplay=true X-GNOME-AutoRestart=true
動作しない場合、以下のように /etc/X11/xinit/xinitrc.d
ディレクトリにスクリプトを追加してください:
/etc/X11/xinit/xinitrc.d/nvidia-optimus.sh
#!/bin/sh xrandr --setprovideroutputsource modesetting NVIDIA-0 xrandr --auto
そして次を実行:
# chmod +x /etc/X11/xinit/xinitrc.d/nvidia-optimus.sh
また、GDM が Xorg バックエンドを使うようになっているか確認してください。
KDM
KDE の KDM の場合、/usr/share/config/kdm/Xsetup
に xrandr の行を追加してください。
3D の確認
NVIDIA グラフィックが使われているかどうかは mesa-demos をインストールして次のコマンドを実行することで確認できます:
$ glxinfo | grep NVIDIA
詳細情報
詳しい情報は、NVIDIA の公式ページ [3] を見て下さい。
トラブルシューティング
垂直同期が機能せずティアリングが発生する
残念ながら、この問題に解決方法はありません。また、NVIDIA はこのことを認識しています 。
Failed to initialize the NVIDIA GPU at PCI:1:0:0 (GPU fallen off the bus / RmInitAdapter failed!)
カーネルパラメータに rcutree.rcu_idle_gp_delay=1
を追加してください。詳しくは こちら を参照。
解像度や画面スキャンが正しく認識されず Xorg.log に EDID のエラーが表示される
nVidia ドライバーがディスプレイの EDID を検出できないのが原因です。手動で EDID ファイルのパスを指定するか、同じような方法で同一の情報を提供する必要があります。
EDID ファイルのパスを指定するには Xorg.conf
の nvidia カードの Device セクションを編集して、以下の行を追加して適当にパスを置き換えてください:
/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 は intel カードの識別子でディスプレイは LVDS で接続されています。edid バイナリはこのディレクトリに存在します。ハードウェアの構成が異なっている場合、CustomEDID の値も変わってくるので確認するようにしてください。パスの先頭の /sys/class/drm
は変わらないはずです。
または、read-edid などのツールを使って edid を自分で作成して、作成したファイルを使うようにドライバーを設定することもできます。modeline も使えますが、"UseEDID" と "IgnoreEDID" は変更するようにしてください。
nouveau を使う
オープンソースの nouveau ドライバー (xf86-video-nouveau) は PRIME という技術を使って Intel のドライバー (xf86-video-intel) との動的な切り替えが可能です。詳しくは、PRIME の記事を見て下さい。
Bumblebee を使う
省電力機能などの便利な機能を実装している Bumblebee を使いたい場合、Bumblebee の記事を見て下さい。