NVIDIA/ヒントとテクニック
目次
ターミナルの解像度を修正する
nouveau からドライバーを変えた場合、起動時のターミナルが低解像度で表示されるようになることがあります。
GRUB を使用している場合、GRUB/ヒントとテクニック#フレームバッファの解像度を設定するを見てください。
systemd-boot を使用している場合、esp/EFI/loader/loader.conf
内で console-mode
を設定してください。詳しくは systemd-boot#ローダー設定 をご覧ください。
rEFInd を使用している場合、esp/EFI/refind/refind.conf
と /etc/refind.d/refind.conf
に以下を追加してください(後者のファイルは任意ですが、両方に追加することを推奨します):
use_graphics_for linux
ちょっとした注意事項としては、これによりブート中にカーネルパラメータが表示されなくなります。
TV 出力を使う
TV 出力については こちら に良い記事があります。
X で TV (DFP) を唯一のディスプレイとして使う
モニターが検出されないと X サーバーは自動的に CRT-0 にフォールバックします。これは DVI で接続した TV をメインディスプレイとして使っている際、TV の電源がオフになっていたり切断されているのに X を起動したときに問題になります。
NVIDIA に強制的に DFP を使わせるには、EDID のコピーをファイルシステムのどこかに保存して TV/DFP の EDID のかわりに X が保存したファイルを読み込むようにしてください。
EDID を取得するには、nvidia-settings を起動します。ツリー形式で情報が表示されますが、今は設定は無視して GPU を選択し ("GPU-0" などという名前が付いているエントリを選択してください)、DFP
セクションをクリックして (例: DFP-0
)、Acquire Edid
ボタンをクリックしてファイルをどこかに保存してください (例: /etc/X11/dfp0.edid
)。
フロントエンドにマウスやキーボードが接続されていない場合、コマンドラインを使って EDID を取得することもできます。EDID ブロックも出力するように引数を指定して X サーバーを起動します:
$ startx -- -logverbose 6
X サーバーの初期化が完了したら、サーバーを閉じて /var/log/Xorg.0.log
にログファイルがあるか確認してください。nvidia-xconfig を使って EDID ブロックを抽出できます:
$ nvidia-xconfig --extract-edids-from-file=/var/log/Xorg.0.log --extract-edids-output-file=/etc/X11/dfp0.bin
xorg.conf
を編集して Device
セクションに以下を追加:
Option "ConnectedMonitor" "DFP" Option "CustomEDID" "DFP-0:/etc/X11/dfp0.edid"
ConnectedMonitor
オプションはドライバーに強制的に DFP を認識させます。CustomEDID
にはデバイスの EDID データを指定してください。TV/DFP が接続されているかのように X が起動するようになります。
ブート時に自動的にディスプレイマネージャを起動して適切な X ディスプレイが設定されてから TV の電源を入れることができます。
上記の変更でうまくいかない場合、xorg.conf
の中の Device
セクションで Option "ConnectedMonitor" "DFP"
を削除して以下の行を追加してみてください:
Option "ModeValidation" "NoDFPNativeResolutionCheck" Option "ConnectedMonitor" "DFP-0"
NoDFPNativeResolutionCheck
を設定することで NVIDIA はネイティブ解像度に適合しないモードも無効化しなくなります。
ヘッドレス (モニターなし) 解像度
ヘッドレスモードでは解像度は VNC や Steam Link で利用される 640x480 に落ちます。より高い解像度(例えば、1920x1080)で開始するには、xorg.conf
内の Screen
サブセクションの下にある Virtual
エントリ で指定します:
Section "Screen" [...] SubSection "Display" Depth 24 Virtual 1920 1080 EndSubSection EndSection
電源を確認
NVIDIA の X.org ドライバーを使って GPU の現在の電源を検出することもできます。現在の電源を表示するには、読み取り専用パラメータの 'GPUPowerSource' をチェックしてください (0 - AC, 1 - バッテリー):
$ nvidia-settings -q GPUPowerSource -t
1
ACPI イベントを Listen する
NVIDIA ドライバーは自動的に acpid デーモンに接続して、バッテリー電源やドッキング、ホットキーなどの ACPI イベントを listen します。接続が失敗した場合、X.org は以下のような警告を出力します:
~/.local/share/xorg/Xorg.0.log
NVIDIA(0): ACPI: failed to connect to the ACPI event daemon; the daemon NVIDIA(0): may not be running or the "AcpidSocketPath" X NVIDIA(0): configuration option may not be set correctly. When the NVIDIA(0): ACPI event daemon is available, the NVIDIA X driver will NVIDIA(0): try to use it to receive ACPI event notifications. For NVIDIA(0): details, please see the "ConnectToAcpid" and NVIDIA(0): "AcpidSocketPath" X configuration options in Appendix B: X NVIDIA(0): Config Options in the README.
上記の警告は完全に無害ですが、/etc/X11/xorg.conf.d/20-nvidia.conf
で ConnectToAcpid
オプションを無効にすることでメッセージを消すことができます:
Section "Device" ... Driver "nvidia" Option "ConnectToAcpid" "0" ... EndSection
ノートパソコンを使っている場合、acpid デーモンをインストールして有効化することを推奨します。
GPU の温度をシェルに表示する
GPU の温度を確認する方法は3つあります。nvidia-settings は X を使用する必要があります。X を使っていない場合は nvidia-smi や nvclock による方法を使って下さい。また、nvclock は GeForce 200 シリーズのカードや Zotac IONITX の 8800GS などの内蔵 GPU など新しい NVIDIA カードでは機能しません。
nvidia-settings
GPU の温度をシェルに表示するには、以下のように nvidia-settings
を使って下さい:
$ nvidia-settings -q gpucoretemp
このコマンドを使うと以下のように出力されます:
Attribute 'GPUCoreTemp' (hostname:0.0): 41. 'GPUCoreTemp' is an integer attribute. 'GPUCoreTemp' is a read-only attribute. 'GPUCoreTemp' can use the following target types: X Screen, GPU.
上記の場合、ボードの GPU 温度は 41 C になります。
rrdtool
や conky
などのユーティリティで使うために温度だけを表示したいときは:
$ nvidia-settings -q gpucoretemp -t
41
nvidia-smi
X を全く使わず GPU から直接温度を読み込むことができる nvidia-smi を使います。サーバーマシンの場合や Wayland を使っている場合はこちらの方法を推奨します。GPU の温度をシェルに表示するには、以下のように nvidia-smi を使って下さい:
$ nvidia-smi
このコマンドを使うと以下のように出力されます:
$ nvidia-smi
Fri Jan 6 18:53:54 2012 +------------------------------------------------------+ | NVIDIA-SMI 2.290.10 Driver Version: 290.10 | |-------------------------------+----------------------+----------------------+ | Nb. Name | Bus Id Disp. | Volatile ECC SB / DB | | Fan Temp Power Usage /Cap | Memory Usage | GPU Util. Compute M. | |===============================+======================+======================| | 0. GeForce 8500 GT | 0000:01:00.0 N/A | N/A N/A | | 30% 62 C N/A N/A / N/A | 17% 42MB / 255MB | N/A Default | |-------------------------------+----------------------+----------------------| | Compute processes: GPU Memory | | GPU PID Process name Usage | |=============================================================================| | 0. ERROR: Not Supported | +-----------------------------------------------------------------------------+
温度だけ見るには:
$ nvidia-smi -q -d TEMPERATURE
====NVSMI LOG==== Timestamp : Sun Apr 12 08:49:10 2015 Driver Version : 346.59 Attached GPUs : 1 GPU 0000:01:00.0 Temperature GPU Current Temp : 52 C GPU Shutdown Temp : N/A GPU Slowdown Temp : N/A
rrdtool
や conky
などのユーティリティで使うために温度だけを取得したいときは:
$ nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits
52
nvclock
たまに nvclock と nvidia-settings/nv-control が報告する温度が食い違うことがあります。nvclock の作者 (thunderbird) による この投稿 によると、nvclock の値のほうが正確なようです。
ログイン時にファンの速度を設定する
nvidia-settings' のコンソールインターフェイスを使ってグラフィックカードのファンの速度を調整することができます。まずは Xorg 設定の Device
セクションで Coolbits オプションを 4
か 5
、または 12
(fermi 以上) に設定してファンコントロールを有効にしてください:
Option "Coolbits" "4"
Xorg が起動した時にファンを調整するには以下の行を xinitrc ファイルに記述します。n
は設定したいファンの速度のパーセンテージに置き換えて下さい。
nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUCurrentFanSpeed=n"
GPU とファンの番号を増やすことで二番目の GPU を設定することもできます。
nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUCurrentFanSpeed=n" \ -a "[gpu:1]/GPUFanControlState=1" -a [fan:1]/GPUCurrentFanSpeed=n" &
GDM や KDM などのログインマネージャを使用している場合、デスクトップエントリファイルを作成して設定をさせることもできます。~/.config/autostart/nvidia-fan-speed.desktop
を作成してその中に以下のテキストを入力してください。n
は速度のパーセンテージに置き換えて下さい。
[Desktop Entry] Type=Application Exec=nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUCurrentFanSpeed=n" X-GNOME-Autostart-enabled=true Name=nvidia-fan-speed
複数のグラフィックカードのファン速度を調整できるようにしたい場合、以下のコマンドを実行:
$ nvidia-xconfig --enable-all-gpus $ nvidia-xconfig --cool-bits=4
手動設定
設定ファイルを編集することで (自動設定や GUI では有効にできない) 設定を変更することができます。変更を反映するには Xorg サーバーを再起動させる必要があります。
オプションの詳しい説明は NVIDIA Accelerated Linux Graphics Driver README and Installation Guide を見てください。
起動時のロゴを無効にする
Device
セクションの下に "NoLogo"
オプションを追加してください:
Option "NoLogo" "1"
モニターの検出を上書きする
Device
セクションの下に "ConnectedMonitor"
オプションを追加することで X サーバーの起動時のモニター検出を上書きすることができます。それによって起動時間を大幅に早くすることが可能です。利用可能なオプション: "CRT"
(アナログ接続), "DFP"
(デジタルモニター), "TV"
(テレビ)。
以下の設定をすることで NVIDIA ドライバーは起動時のチェックを迂回しモニターを DFP と認識します:
Option "ConnectedMonitor" "DFP"
輝度調整を有効にする
Device
セクションの下に追加してください:
Option "RegistryDwords" "EnableBrightnessControl=1"
上記のオプションで輝度のコントロールが機能しない場合、nvidia-bl-dkmsAUR をインストールしてください。
SLI を有効にする
NVIDIA ドライバーの README の Appendix B より: このオプションはサポートされている環境で SLI レンダリングの設定をコントロールします。「サポートされている環境」とは SLI 対応のマザーボードを搭載し SLI 対応の GeForce GPU が2枚か3枚刺さっているコンピューターのことです。詳しくは NVIDIA の SLI Zone を見て下さい。
まず lspci
を使って一番目の GPU の PCI Bus ID を確認してください:
$ lspci | grep VGA
03:00.0 VGA compatible controller: nVidia Corporation G92 [GeForce 8800 GTS 512] (rev a2) 05:00.0 VGA compatible controller: nVidia Corporation G92 [GeForce 8800 GTS 512] (rev a2)
Device
セクションの下に BusID を追加してください (上記の例では3):
BusID "PCI:3:0:0"
使用したい SLI レンダリングモードの値を Screen
セクションの下に追加してください:
Option "SLI" "AA"
以下の表は利用できるレンダリングモードを示しています。
値 | 挙動 |
---|---|
0, no, off, false, Single | レンダリングの際には単一の GPU だけを使用。 |
1, yes, on, true, Auto | SLI を有効にしてドライバーに適切なレンダリングモードを自動で選択させる。 |
AFR | SLI を有効にして alternate フレームレンダリングモードを使用する。 |
SFR | SLI を有効にして split フレームレンダリングモードを使用する。 |
AA | SLI を有効にして SLI アンチエイリアスを使用する。これをフルシーンアンチエイリアスと一緒に使うことで見栄えが良くなります。 |
もしくは、nvidia-xconfig
ユーティリティを使って、コマンドによって xorg.conf
に変更を挿入することもできます:
# nvidia-xconfig --busid=PCI:3:0:0 --sli=AA
シェルから SLI モードが有効になっているか確認するには:
$ nvidia-settings -q all | grep SLIMode
Attribute 'SLIMode' (arch:0.0): AA 'SLIMode' is a string attribute. 'SLIMode' is a read-only attribute. 'SLIMode' can use the following target types: X Screen.
オーバークロックを有効にする
GPU やメモリのオーバークロックは Device
セクションの Coolbits オプションによって制御され、サポートされない機能が使えるようになります:
Option "Coolbits" "value"
Coolbits の値は2進法でビットを立てた合計になります。それぞれのビットの意味は:
1
(ビット 0) - (Fermi 以前の) 古いコアで nvidia-settings の Clock Frequencies ページからオーバークロックできるようになります。2
(ビット 1) - このビットが設定されると、ドライバーは GPU を使う際に様々な量のビデオメモリで SLI を初期化しようとします。4
(ビット 2) - GPU のファンの速度の手動設定が nvidia-settings の Thermal Monitor ページで可能になります。8
(ビット 3) - Fermi 以降の新しいコアで nvidia-settings の PowerMizer ページからオーバークロックできるようになります。バージョン 337.12 から使えるようになりました [2]。16
(ビット 4) - Fermi 以降の新しいコアで nvidia-settings の CLI オプションを使って電圧アップができるようになります。バージョン 346.16 から使えるようになりました [3]。
複数の機能を有効にするには、合計した Coolbits の値を追加します。例えば、オーバークロックと Fermi コアの電圧アップを有効にするには、Option "Coolbits" "24"
と設定します。
Coolbits のドキュメントは /usr/share/doc/nvidia/html/xconfigoptions.html
にあります。Coolbits に関するドライバーバージョン 355.11 のドキュメントはオンラインで こちら から見ることができます。
静的な 2D/3D クロックを設定する
以下の文字列を Device
セクションに設定すると PowerMizer がパフォーマンス最高レベルで有効になります (この行がないと VSync が動作しません):
Option "RegistryDwords" "PerfLevelSrc=0x2222"
Preserve video memory after suspend
By default the NVIDIA Linux drivers save and restore only essential video memory allocations on system suspend and resume. Quoting NVIDIA ([4], also available with the nvidia-utils package in /usr/share/doc/nvidia/html/powermanagement.html): The resulting loss of video memory contents is partially compensated for by the user-space NVIDIA drivers, and by some applications, but can lead to failures such as rendering corruption and application crashes upon exit from power management cycles.
The still experimental system enables saving all video memory (given enough space on disk or main RAM). The interface is through the /proc/driver/nvidia/suspend file as follows: write "suspend" (or "hibernate") to /proc/driver/nvidia/suspend immediately before writing to the usual Linux /sys/power/state file, write "resume" to /proc/driver/nvidia/suspend immediately after waking up, or after an unsuccessful attempt to suspend or hibernate.
The NVIDIA drivers rely on a user defined file system for storage. The chosen file system needs to support unnamed temporary files (ext4 works) and have sufficient capacity for storing the video memory allocations (e.g., at least (sum of the memory capacities of all NVIDIA GPUs) * 1.02
). Use the command nvidia-smi -q -d MEMORY
to list the memory capacities of all GPUs in the system.
To choose the file system used for storing video memory during system sleep (and change the default video memory save/restore strategy to save and restore all video memory allocations), it is necessary to pass two options to the "nvidia" kernel module. For example, write the following line to /etc/modprobe.d/nvidia-power-management.conf and reboot:
options nvidia NVreg_PreserveVideoMemoryAllocations=1 NVreg_TemporaryFilePath=/tmp-nvidia
Feel free to replace "/tmp-nvidia" in the previous line with a path within your desired file system.
The interaction with /proc/driver/nvidia/suspend is handled by the simple Unix shell script at /usr/bin/nvidia-sleep.sh, which will itself be called by a tool like Systemd. The Arch Linux nvidia-utils package ships with the following relevant Systemd services (which essentially just call nvidia-sleep.sh): nvidia-suspend
, nvidia-hibernate
, nvidia-resume
. Contrary to NVIDIA's instructions, it is currently not necessary to enable nvidia-resume
(and it is in fact probably not a good idea to enable it), because the /usr/lib/systemd/system-sleep/nvidia script does the same thing as the service (but slightly earlier), and it is enabled by default (Systemd calls it after waking up from a suspend). Do enable nvidia-suspend
and/or nvidia-hibernate
.