NVIDIA
関連記事
この記事は公式の NVIDIA グラフィックカードドライバをカバーしています。コミュニティによるオープンソースのドライバに関しては、Nouveau を見てください。Intel/NVIDIA のハイブリッドグラフックスを搭載しているノートパソコンを使っている場合は、代わりに NVIDIA Optimus を見て下さい。
インストール
まず、nouveau wiki のコードネームに関するページで、以下のコマンドで入手した GPU カードのモデル名/公式名に対応するファミリ名を探してください:
$ lspci -k | grep -A 2 -E "(VGA|3D)"
次に、使用しているカードに適したドライバをインストールしてください:
GPU ファミリ | ドライバ | 状態 |
---|---|---|
Turing (NV160/TUXXX) 及びそれ以降 | linux には nvidia-open その他のカーネルには nvidia-open-dkms |
現行。サポートあり。1 |
Ada Lovelace (NV190/ADXXX) から Maxwell (NV110/GMXXX) |
linux には nvidia linux-lts には nvidia-lts その他のカーネルには nvidia-dkms | |
Kepler (NVE0/GKXXX) | nvidia-470xx-dkmsAUR | レガシー。サポートあり。2 |
Fermi (NVC0/GF1XX) | nvidia-390xx-dkmsAUR | レガシー。サポートなし。2,3 |
Tesla (NV50/G80-90-GT2XX) | nvidia-340xx-dkmsAUR | |
Curie (NV40/G70) 及びそれ以前 | パッケージはもはや存在しません。 |
- これらのパッケージが動作しない場合 (たいていはハードウェアが新しいことが原因です)、nvidia-open-betaAUR が、新しいハードウェアをサポートしている新しいドライバのバージョンを提供しているかもしれません。
- Indirect Branch Tracking との互換性が無いため、第11世代及びそれ以降の Intel CPU を搭載しているシステムで Linux 5.18 (及びそれ以降) においてこれらのドライバは動作しない場合があります。Indirect Branch Tracking は、ブートローダーから
ibt=off
カーネルパラメータを設定することにより、無効化することができます。ただし、このセキュリティ機能はエクスプロイト手法の一種を緩和する役割があるので注意してください。 - NVIDIA はもはやこれらのカードをアクティブにサポートしておらず、これらのドライバは現在の Xorg バージョンを公式にはサポートしていません。nouveau ドライバを使うほうが簡単かもしれません。しかし、NVIDIA のレガシーなドライバは依然として利用可能であり、3D パフォーマンスまたは安定性に関して優れているかもしれません。
32ビットアプリケーションのサポートに関しては、対応する lib32 パッケージも multilib リポジトリからインストールしてください (例: lib32-nvidia-utils)。
/etc/mkinitcpio.conf
内の HOOKS
配列から kms
を削除し、その後 initramfs を再生成してください。こうすることで、initramfs に nouveau
モジュールが含まれないようにして、カーネルがこのモジュールを初期ブート中に読み込めないようにします。nvidia-utils パッケージには、再起動後に nouveau
モジュールをブラックリスト化するファイルが含まれています。
ドライバーをインストールしたら、#Xorg 設定 または #Wayland へと進んでください。
カスタムカーネル
使用中のカーネルで CONFIG_DRM_SIMPLEDRM=y
となっていることを確認してください。そして、CONFIG_DEBUG_INFO_BTF
を使用している場合、PKGBUILD で以下が必要です (カーネル 5.16 以降):
install -Dt "$builddir/tools/bpf/resolve_btfids" tools/bpf/resolve_btfids/resolve_btfids
DRM カーネルモード設定
NVIDIA は KMS の自動遅延読み込みをサポートしていないため、Wayland コンポジタを正しく動作させたり、Rootless Xorg を利用できるようにするには DRM (Direct Rendering Manager) カーネルモード設定を有効化する必要があります。
DRM カーネルモード設定を有効化するには、nvidia_drm
モジュールに対して modeset=1
カーネルモジュールパラメータを設定してください。
nvidia_drm.modeset=1
が適切に設定されていることをブート後に確認するには、以下のコマンドを実行してください:
# cat /sys/module/nvidia_drm/parameters/modeset
正しく設定されていれば、このコマンドは N
ではなく Y
と出力するはずです。
加えて、ドライバのバージョン 545 及びそれ以降においては、実験的な nvidia_drm.fbdev=1
パラメータを使用することもできます。このパラメータにより、simpledrm
においては動作しない efifb
や vesafb
を使用せずに、NVIDIA ドライバ自身のフレームバッファデバイスを使用するようになります。
バージョン 545 より前の NVIDIA ドライバを使用している場合や、nvidia_drm.fbdev=1
パラメータを使用しない場合、simpledrm
を無効化するために nvidia_drm.modeset=1
オプションをカーネルパラメータによって設定する必要があります [1] (詳細は FS#73720 を参照)。
早期ロード
基本的な機能については先のカーネルパラメータを追加するだけで十分でしょう。可能な限り早い時にロードさせたい場合や、スタートアップ時に問題 (nvidia
カーネルモジュールがディスプレイマネージャのあとにロードされてしまうなど) が発生する場合には、nvidia
、nvidia_modeset
、nvidia_uvm
そして nvidia_drm
を initramfs に追加することができます。
mkinitcpio
mkinitcpio initramfs を使う場合、mkinitcpio#MODULES に従ってモジュールを追加してください。
モジュールを initramfs に追加した場合、nvidia ドライバーがアップデートされるたびに mkinitcpio を実行することを忘れないようにしてください。この手順を自動化する方法については #Pacman フックをご覧ください。
Booster
Booster を使う場合、Booster#モジュールの早期ロードをご覧ください。
dracut
dracut を使用する場合は、dracut#カーネルモジュールの早期ロード に従ってください。
Pacman フック
NVIDIA ドライバをアップグレードした後に initramfs をアップデートすることを忘れないように、以下のような pacman フックを利用することができます:
/etc/pacman.d/hooks/nvidia.hook
[Trigger] Operation=Install Operation=Upgrade Operation=Remove Type=Package # インストールした NVIDIA のパッケージをアンコメントしてください Target=nvidia #Target=nvidia-open #Target=nvidia-lts # 他のカーネルを使う場合は以下を適宜変更してください Target=linux [Action] Description=Updating NVIDIA module in initcpio Depends=mkinitcpio When=PostTransaction NeedsTargets Exec=/bin/sh -c 'while read -r trg; do case $trg in linux*) exit 0; esac; done; /usr/bin/mkinitcpio -P'
ビデオデコードのハードウェアアクセラレーション
VDPAU によるビデオデコードのアクセラレーションは GeForce 8 シリーズ及びそれ以降のカードでサポートされています。NVDEC によるビデオデコードのアクセラレーションは Fermi (~400 シリーズ) 及びそれ以降のカードでサポートされています。詳しくは ハードウェアビデオアクセラレーション をご覧ください。
NVENC によるビデオエンコードのハードウェアアクセラレーション
NVENC は nvidia_uvm
モジュールと、関連するデバイスノードが /dev
下に作成されることを要求します。
最新のドライバーパッケージは、自動的にデバイスノードを作成する udev ルールを提供するので、追加の操作は必要ありません。
古いドライバ (例えば、nvidia-340xx-dkmsAUR) を使用している場合、デバイスノードを作成する必要があります。nvidia-modprobe
ユーティリティを実行するとデバイスノードが自動的に作成されます。/etc/udev/rules.d/70-nvidia.rules
を作成して nvidia-modprobe
を自動的に実行させることができます:
/etc/udev/rules.d/70-nvidia.rules
ACTION=="add", DEVPATH=="/bus/pci/drivers/nvidia", RUN+="/usr/bin/nvidia-modprobe -c 0 -u"
Xorg 設定
プロプライエタリな NVIDIA グラフィックドライバは Xorg サーバの設定ファイルを必要としません。X を起動してみて、Xorg サーバが設定ファイル無しで正しく機能するかを確認することができます。しか、様々な設定を調整するために設定ファイル (/etc/X11/xorg.conf
よりも /etc/X11/xorg.conf.d/20-nvidia.conf
を優先して使用してください) を作成する必要があるかもしれません。この設定は、NVIDIA Xorg 設定ツールによって生成することができますし、手動で作成することもできます。手動で作成した場合、(Xorg サーバに基本的なオプションのみを与えると言う意味で) 最小の設定にすることができますし、あるいは、Xorg の自動検出されたオプションや事前設定されたオプションをバイパスできる設定を含めることもできます。
自動設定
NVIDIA のパッケージには、Xorg サーバの設定ファイル (xorg.conf
) を作成するための自動設定ツールが含まれています。次のコマンドで実行できます:
# nvidia-xconfig
このコマンドは /etc/X11/xorg.conf
を自動検出し、現在のハードウェアに応じてそのファイルを作成 (すでに存在する場合は編集) します。
DRI のインスタンスがある場合は、コメントアウトされているか確認してください:
# Load "dri"
デフォルトの深度、水平同期、垂直リフレッシュ、そして解像度が問題ないか /etc/X11/xorg.conf
を二重にチェックしてください。
nvidia-settings
nvidia-settings は CLI または GUI を使って様々なオプションを設定することができるツールです。何もオプションをつけずに nvidia-settings
を実行すると GUI が起動します。CLI のオプションについては nvidia-settings(1) を見てください。
nvidia-settings の CLI/GUI は非 root なユーザとして実行でき、nvidia-settings Configuration タブにある Save Current Configuration オプションで設定を ~/.nvidia-settings-rc
に保存できます。
現在のユーザで ~/.nvidia-settings-rc
をロードするには:
$ nvidia-settings --load-config-only
起動時に毎回このコマンドを実行させるには自動起動を見てください。
手動設定
設定ファイルを編集することで、(自動的に、または nvidia-settingsによって有効化できない) いくつかの微調整をすることができます。変更を適用する前に Xorg サーバーを再起動する必要があります。
その他の詳細やオプションについては NVIDIA Accelerated Linux Graphics Driver README and Installation Guide をご覧ください。
最小設定
20-nvidia.conf
(もしくは非推奨の xorg.conf
) の基本的な設定ブロックは以下のようになります:
/etc/X11/xorg.conf.d/20-nvidia.conf
Section "Device" Identifier "NVIDIA Card" Driver "nvidia" VendorName "NVIDIA Corporation" BoardName "GeForce GTX 1050 Ti" EndSection
起動時のロゴを無効化
古いドライバ (nvidia-340xx-dkmsAUR) を使用している場合、X の起動時に表示される NVIDIA ロゴスプラッシュスクリーンを無効化しておいたほうがいいかもしれません。Device
セクション内に "NoLogo"
オプションを追加してください:
Option "NoLogo" "1"
モニター検出をオーバーライド
Device
セクション内の "ConnectedMonitor"
オプションにより、 X サーバーが起動した時にモニター検出をオーバーライドできます。これにより、起動時間を大幅に減らせるかもしれません。利用可能なオプション: アナログ接続用の "CRT"
、デジタルモニター用の "DFP"
、テレビ用の "TV"
。
以下の行は起動時のチェックをバイパスし、モニターを DFP として認識することを NVIDIA ドライバーに強制します:
Option "ConnectedMonitor" "DFP"
輝度調整を有効化
以下をカーネルパラメータに追加してください:
nvidia.NVreg_RegistryDwords=EnableBrightnessControl=1
あるいは、以下を Device
セクション内に追加してください:
Option "RegistryDwords" "EnableBrightnessControl=1"
もし、この設定で輝度調整がまだ機能しない場合は、nvidia-bl-dkmsAUR をインストールしてみてください。
SLI を有効化
NVIDIA ドライバーの README 付録 B によると: このオプションは、サポートされている構成で SLI レンダリングの設定を制御します。 "サポートされている構成"とは SLI 認定マザーボードと、2基または3基の SLI 認定 GeForce GPU を搭載しているコンピュータのことです。
lspci
を使って1つ目の GPU の PCI Bus ID を調べてください:
# lspci | grep -E "VGA|3D controller"
00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor Graphics Controller (rev 09) 03:00.0 VGA compatible controller: NVIDIA Corporation GK107 [GeForce GTX 650] (rev a1) 04:00.0 VGA compatible controller: NVIDIA Corporation GK107 [GeForce GTX 650] (rev a1) 08:00.0 3D controller: NVIDIA Corporation GM108GLM [Quadro K620M / Quadro M500M] (rev a2)
調べた BusID (前述の例では 3) を Device
セクション内に追加してください:
BusID "PCI:3:0:0"
希望する SLI レンダリングモードの値を Screen
セクション内に追加してください:
Option "SLI" "AA"
以下の表は利用可能なレンダリングモードです。
値 | 挙動 |
---|---|
0, no, off, false, Single | レンダリング時にただ1つの GPU を使う。 |
1, yes, on, true, Auto | SLI を有効化し、ドライバーが自動的に適切なレンダリングモードを選択することを許可する。 |
AFR | SLI を有効化し、Alternate Frame Rendering モードを使う。 |
SFR | SLI を有効化し、Split Frame Rendering モードを使う。 |
AA | SLI を有効化し、SLI アンチエイリアシングを使う。この値を Full-Scene アンチエイリアシングと一緒に使うと視覚品質が向上します。 |
あるいは、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.
以上の設定で機能しない場合は、nvidia-settings
で得られる PCI Bus ID を使用する必要があるかもしれません。
$ nvidia-settings -q all | grep -i pcibus
Attribute 'PCIBus' (host:0[gpu:0]): 101. 'PCIBus' is an integer attribute. 'PCIBus' is a read-only attribute. 'PCIBus' can use the following target types: GPU, SDI Input Device. Attribute 'PCIBus' (host:0[gpu:1]): 23. 'PCIBus' is an integer attribute. 'PCIBus' is a read-only attribute. 'PCIBus' can use the following target types: GPU, SDI Input Device.
そして、xorg.d 内の PrimaryGPU オプションをコメントアウトしてください:
/usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
... Section "OutputClass" ... # Option "PrimaryGPU" "yes" ...
この設定でグラフィカルブートの問題も解決できるかもしれません。
マルチモニター
一般的な情報は マルチディスプレイ を見て下さい。
NVIDIA Settings を使う
nvidia-settings ツールを使ってマルチモニターを設定できます。
CLI で設定する場合、まずは以下を実行して CurrentMetaMode
を確認してください:
$ nvidia-settings -q CurrentMetaMode
Attribute 'CurrentMetaMode' (hostnmae:0.0): id=50, switchable=no, source=nv-control :: DPY-1: 2880x1620 @2880x1620 +0+0 {ViewPortIn=2880x1620, ViewPortOut=2880x1620+0+0}
::
以降の全て (上記の場合: DPY-1: 2880x1620 @2880x1620 +0+0 {ViewPortIn=2880x1620, ViewPortOut=2880x1620+0+0}
) を使って nvidia-settings --assign "CurrentMetaMode=your_meta_mode"
でディスプレイを再設定できます。
ConnectedMonitor
ドライバーがセカンドモニタを正しく認識しない場合は、ConnectedMonitor を使って認識するように強制できます。
/etc/X11/xorg.conf
Section "Monitor" Identifier "Monitor1" VendorName "Panasonic" ModelName "Panasonic MICRON 2100Ex" HorizSync 30.0 - 121.0 # this monitor has incorrect EDID, hence Option "UseEDIDFreqs" "false" VertRefresh 50.0 - 160.0 Option "DPMS" EndSection Section "Monitor" Identifier "Monitor2" VendorName "Gateway" ModelName "GatewayVX1120" HorizSync 30.0 - 121.0 VertRefresh 50.0 - 160.0 Option "DPMS" EndSection Section "Device" Identifier "Device1" Driver "nvidia" Option "NoLogo" Option "UseEDIDFreqs" "false" Option "ConnectedMonitor" "CRT,CRT" VendorName "NVIDIA Corporation" BoardName "GeForce 6200 LE" BusID "PCI:3:0:0" Screen 0 EndSection Section "Device" Identifier "Device2" Driver "nvidia" Option "NoLogo" Option "UseEDIDFreqs" "false" Option "ConnectedMonitor" "CRT,CRT" VendorName "NVIDIA Corporation" BoardName "GeForce 6200 LE" BusID "PCI:3:0:0" Screen 1 EndSection
TwinView
を使わずに1つのカードで2つのモニターを X で使うために Screen
でデバイスを複製しています。nvidia-settings
は追加した ConnectedMonitor
オプションを全て消してしまうので注意してください。
TwinView
画面を2つ表示するのではなく1つの大きな画面を表示したい場合、TwinView
引数を 1
に設定してください。コンポジットを使いたい場合、このオプションを使用する必要があります。TwinView は全てのモニターが同一のカードに接続されている場合にのみ機能します。
Option "TwinView" "1"
設定例:
/etc/X11/xorg.conf.d/10-monitor.conf
Section "ServerLayout" Identifier "TwinLayout" Screen 0 "metaScreen" 0 0 EndSection Section "Monitor" Identifier "Monitor0" Option "Enable" "true" EndSection Section "Monitor" Identifier "Monitor1" Option "Enable" "true" EndSection Section "Device" Identifier "Card0" Driver "nvidia" VendorName "NVIDIA Corporation" #refer to the link below for more information on each of the following options. Option "HorizSync" "DFP-0: 28-33; DFP-1 28-33" Option "VertRefresh" "DFP-0: 43-73; DFP-1 43-73" Option "MetaModes" "1920x1080, 1920x1080" Option "ConnectedMonitor" "DFP-0, DFP-1" Option "MetaModeOrientation" "DFP-1 LeftOf DFP-0" EndSection Section "Screen" Identifier "metaScreen" Device "Card0" Monitor "Monitor0" DefaultDepth 24 Option "TwinView" "True" SubSection "Display" Modes "1920x1080" EndSubSection EndSection
SLI に対応しているカードが複数枚存在する場合、別々のカードに接続された複数のモニターを使うことができます (例: 2枚のカードが SLI で、各々のカードにモニターが1台ずつ接続)。SLI モザイクモードと "MetaModes" オプションで有効になります。以下は上記と同じように設定する例で、GNOME が完璧に動作します:
/etc/X11/xorg.conf.d/10-monitor.conf
Section "Device" Identifier "Card A" Driver "nvidia" BusID "PCI:1:00:0" EndSection Section "Device" Identifier "Card B" Driver "nvidia" BusID "PCI:2:00:0" EndSection Section "Monitor" Identifier "Right Monitor" EndSection Section "Monitor" Identifier "Left Monitor" EndSection Section "Screen" Identifier "Right Screen" Device "Card A" Monitor "Right Monitor" DefaultDepth 24 Option "SLI" "Mosaic" Option "Stereo" "0" Option "BaseMosaic" "True" Option "MetaModes" "GPU-0.DFP-0: 1920x1200+4480+0, GPU-1.DFP-0:1920x1200+0+0" SubSection "Display" Depth 24 EndSubSection EndSection Section "Screen" Identifier "Left Screen" Device "Card B" Monitor "Left Monitor" DefaultDepth 24 Option "SLI" "Mosaic" Option "Stereo" "0" Option "BaseMosaic" "True" Option "MetaModes" "GPU-0.DFP-0: 1920x1200+4480+0, GPU-1.DFP-0:1920x1200+0+0" SubSection "Display" Depth 24 EndSubSection EndSection Section "ServerLayout" Identifier "Default" Screen 0 "Right Screen" 0 0 Option "Xinerama" "0" EndSection
TwinView を使って垂直同期
TwinView と垂直同期 (nvidia-settings の "Sync to VBlank" オプション) を使っている場合、モニターの大きさが異なっていると片方の画面だけが同期されます。nvidia-settings にはどちらの画面を同期させるか設定するオプション ("Sync to this display device" オプション) が存在しますが、必ずしも機能するとはいいがたいです。起動時に以下の環境変数を追加することで解決します (例: /etc/profile
に追加):
export __GL_SYNC_TO_VBLANK=1 export __GL_SYNC_DISPLAY_DEVICE=DFP-0 export VDPAU_NVIDIA_SYNC_DISPLAY_DEVICE=DFP-0
DFP-0
は適切な画面に置き換えてください (DFP-0
は DVI 端子で CRT-0
は VGA 端子です)。ディスプレイの識別名は nvidia-settings の "X Server XVideoSettings" セクションで確認できます。
Twinview を使ってゲームを遊ぶ
TwinView を使ってフルスクリーンのゲームを遊ぶ場合、2つの画面が1つの大きな画面としてゲームから認識されることがあります。技術的にこれは正しいのですが (仮想的な X スクリーンの横幅は両方の画面を合わせたサイズになります)、ゲームを遊ぶときは両方の画面を使わないようにしたいときもあるでしょう。
SDL のこの挙動を修正するには、次を試して下さい:
export SDL_VIDEO_FULLSCREEN_HEAD=1
OpenGL の場合、xorg.conf
の Device
セクションに適切な Metamodes を追加して X を再起動してください:
Option "Metamodes" "1680x1050,1680x1050; 1280x1024,1280x1024; 1680x1050,NULL; 1280x1024,NULL;"
別の X サーバーでゲームを起動する方法もあります。上記の方法と一緒に使うことも可能です。
モザイクモード
モザイクモードは、複数のグラフィクカードでコンポジット有りで3つ以上のモニタを使用する唯一の方法です。ウィンドウマネージャは各モニタの違いを認識するかもしれませんし、しないかもしれません。モザイクモードには、有効な SLI 設定が必要です。SLI を使わずにベースモードを使用する場合でも、GPU は依然として SLI 対応/互換でなければなりません。
ベースモザイク
ベースモザイクモードは Geforce 8000 シリーズ以上の GPU で動作します。nvidia-setting の GUI から有効にすることはできません。nvidia-xconfig コマンドラインプログラムを使用するか xorg.conf
を手動で編集する必要があります。Metamodes を指定してください。以下は4台の DFP を 2x2 の構成で使用する例です。各々の解像度は 1920x1024 で、2枚のカードにそれぞれ2台の DFP が接続されている場合:
$ nvidia-xconfig --base-mosaic --metamodes="GPU-0.DFP-0: 1920x1024+0+0, GPU-0.DFP-1: 1920x1024+1920+0, GPU-1.DFP-0: 1920x1024+0+1024, GPU-1.DFP-1: 1920x1024+1920+1024"
SLI モザイク
SLI 構成を使っていて、使用する GPU が Quadro FX 5800 や Quadro Fermi 以降の場合、SLI モザイクモードが利用できます。nvidia-settings の GUI の中から有効化するか、コマンドラインで設定してください:
$ nvidia-xconfig --sli=Mosaic --metamodes="GPU-0.DFP-0: 1920x1024+0+0, GPU-0.DFP-1: 1920x1024+1920+0, GPU-1.DFP-0: 1920x1024+0+1024, GPU-1.DFP-1: 1920x1024+1920+1024"
Wayland
カーネルモード設定を有効化し、Wayland#要件 で詳細を確認してください。
さらなる設定オプションについては、それぞれのコンポジタの wiki ページやドキュメントをご覧ください。
Xwayland に関しては Wayland#Xwayland をご覧ください。
GDM を使用している場合は、GDM#Wayland とプロプライエタリな NVIDIA ドライバ をご覧ください。
NVswitch
NVswitch のあるシステム (AWS の H100x8 など) では、以下が必要です。
- nvidia-fabricmanager をインストールする。
- Fabric manager が必要とする、対応するカーネルモジュールをインストールする。
Fabric manager を使うと、pytorch が GPU が見つからないと報告してきます。
Fabric マネージャをインストールするには:
- Nvidia から tarball をダウンロードする。こちら
- バージョン 555.42.02 は正しく動作します。
- インストールスクリプト sbin/fm_run_package_installer.sh を変更してしてインストール先のパスを修正してください。
対応するカーネルドライバを入手するには:
- nvidia-beta-dkms と nvidia-utils-beta の AUR リポジトリを git clone してください。
- PKGBUILD を変更してバージョン 555.42.02 を使用するようにしてください。
- ビルドし、インストールしてください。
- 再起動してください。
最後に、systemctl enable nvidia-fabricmanager
と systemctl start nvidia-fabricmanager
を実行すれば、pytorch が動くはずです。
ヒントとテクニック
NVIDIA/ヒントとテクニック を参照。
トラブルシューティング
NVIDIA/トラブルシューティング を参照。