カーネルモード設定

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

カーネルモード設定 (KMS) は、ユーザースペースではなくカーネル空間でディスプレイの解像度・色深度を設定する方法です。

Linux カーネルの KMS 実装により、フレームバッファでのネイティブ解像度や素早いコンソール (tty) 切り替えができるようになります。また、アーティファクトの軽減や 3D パフォーマンスの向上、カーネル空間での省電力機能を補助する新しい技術 (DRI2 など) も可能にします。

ノート: プロプライエタリの NVIDIA ドライバ (364.12 以上) も KMS を実装していますが、カーネルの組み込み実装を使用しないため、高解像度コンソールのための fbdev ドライバは、オプトインの実験的機能としてのみ存在します (545.29 以降)。

背景

以前は、ビデオカードをセットアップするのは X サーバーの仕事でした。このため、仮想コンソールで派手なグラフィックを使うことは簡単ではありませんでした。また、X から 仮想コンソール へ切り替えると (Ctrl+Alt+F2)、X サーバーはカーネルにビデオカードのコントロールを移さなくてはならず、動作が重くなりチラツキが生じていました。同じ"痛々しい"挙動はコントロールを X サーバーに戻す (X が VT7 で動作している場合 Alt+F7 ときも起こりました。

カーネルモード設定 (KMS) によって、現在カーネルはビデオカードのモードを設定することができます。これによって、起動段階での派手なグラフィックや、仮想コンソールと X の早い切り替えなどが可能になりました。

設定

まず、どの 方法を使うにせよ、以下を 常時 無効にする必要があります:

  • ブートローダ内のあらゆる vga= オプション。KMS によるネイティブ解像度と衝突します。
  • フレームバッファを有効にするあらゆる video= 行。ドライバと衝突します。
  • 他のフレームバッファドライバ (uvesafb など)。

KMS の遅延開始

IntelNouveauATIAMDGPU のドライバでは全てのチップセットで、KMS が自動的に有効になるように既になっています。そのため、何もする必要はありません。

プロプライエタリな NVIDIA ドライバは KMS をサポートしています (364.12 以降)。ただし、手動で有効化する必要があります。

KMS の早期開始

ヒント: 解像度の問題が発生する場合、モードの強制で問題が解決しないか確認してください。

通常 KMS は initramfs ステージよりも後に初期化されます。しかし、initramfs ステージで KMS を有効化することもできます。ビデオドライバが必要とするモジュールを initramfs の設定ファイルに追加してください:

  • Matrox グラフィックスの場合は mgag200
  • 使用している QEMU グラフィックスに依存します (qemu のオプション -vga type あるいは libvirt <video><model type='type'> [1]):
    • std (qemu) と vga/bochs (libvirt) の場合は bochs
    • virtio の場合は virtio-gpu
    • qxl の場合は qxl
    • vmware (qemu) と vmvga (libvirt) の場合は vmwgfx
    • cirrus の場合は cirrus
  • VirtualBox のグラフィックスコントローラに依存します:
    • VMSVGA の場合は vmwgfx
    • VBoxVGA と VBoxSVGA の場合は vboxvideo

Initramfs の設定手順は、使用する initramfs ジェネレータによって若干異なります。

mkinitcpio

In-tree なモジュールの場合、/etc/mkinitcpio.conf の HOOKS 配列に kms フックが含まれていることを確認してください (これは mkinitcpio v33 以降デフォルトです)。

out-of-tree なモジュールの場合、MODULES 配列にモジュール名を追加してください。例えば、NVIDIA グラフィックドライバの early KMS を有効化するには:

/etc/mkinitcpio.conf
MODULES=(... nvidia nvidia_modeset nvidia_uvm nvidia_drm ...)
ノート: Intel Integrated Graphics Processors (IGP) をプライマリ GPU、AMD GPU をディスクリートとして PRIME GPU を使っている場合、intel_agp を追加すると、休止状態から復帰するときに問題が起こるかもしれません (モニタが信号を受け取らない)。詳しくは [2] を参照してください。

#モードと EDID を強制する の方法をとっている場合、そのカスタムファイルを initramfs にも埋め込む必要があります:

/etc/mkinitcpio.conf
FILES=(/usr/lib/firmware/edid/your_edid.bin)

そして、initramfs を再生成してください。

Booster

Booster を使用している場合、以下の設定変更で必要なモジュールをロードすることができます:

/etc/booster.yaml
modules_force_load: i915

イメージにファイルを追加する場合:

/etc/booster.yaml
extra_files: /usr/lib/firmware/edid/your_edid.bin

そして、ブースターイメージを 再生成 してください。

トラブルシューティング

フォントが小さすぎる

コンソールフォントを大きくする方法については Linux コンソール#フォント を見てください。Terminus フォント (terminus-font) には ter-132b など様々なサイズが含まれています。

もしくはモード設定を無効化して解像度を下げることで相対的にフォントは大きくなります。

モードと EDID を強制する

ネイティブな解像度が自動的に設定されなかったり、ディスプレイが全く検出されなかったりする場合、モニタが EDID ファイルを送信していなかったり、間違った EDID を送信しているのかもしれません。カーネルはこのようなケースを検出し、最も典型的な解像度のどれかを設定します。

モニタの EDID ファイルを持っているならば、そのファイルを明示的に強制するだけで済みます (以下を参照)。しかし、大抵はまともな EDID ファイルへ直接アクセスできないので、既存の EDID ファイルを抽出するか、新しいものを生成する必要があります。

上流のドキュメントに従うことで (短いガイドはこのページを参照してください)、カーネルのコンパイル中に様々な解像度や構成の EDID バイナリを生成することができます。他の解決策はこの記事で詳細に説明されています。

既存の EDID ファイルを抽出することは、大抵のケースで簡単です。例えば、あなたのモニタが Windows でうまく動作するならば、対応するドライバから EDID を抽出することができます。また、まともな設定のある似たようなモニタが動作するのであれば、read-edid パッケージの get-edid(1) を使うことができます。また、/sys/class/drm/*/edid から探してみることもできます。

EDID の準備ができたら、何かしらのディレクトリ (例えば、/usr/lib/firmware 内の edid ディレクトリ) 内に置き、そこへバイナリをコピーしてください。

EDID をブート時にロードするには、以下のカーネルコマンドラインを指定してください:

drm.edid_firmware=edid/your_edid.bin

4.13 より前のカーネルでは、代わりに以下のカーネルパラメータを使用してください:

drm_kms_helper.edid_firmware=edid/your_edid.bin

特定のコネクタに対してのみ EDID を適用するには、以下を使用してください:

drm.edid_firmware=VGA-1:edid/your_edid.bin

複数の EDID ファイルを使用したい場合は、以下を使用してください:

drm.edid_firmware=VGA-1:edid/your_edid.bin,VGA-2:edid/your_other_edid.bin

組み込みの解像度の場合は、以下の表を参照してください。名前 列は、その解像度を構成するために使用する必要がある名前です。

解像度 名前
800x600 edid/800x600.bin
1024x768 edid/1024x768.bin
1280x1024 edid/1280x1024.bin
1600x1200 (カーネル 3.10 以上) edid/1600x1200.bin
1680x1050 edid/1680x1050.bin
1920x1080 edid/1920x1080.bin

早期 KMSを行っている場合は、カスタムの EDID ファイルを initramfs 内に含めなければなりません。さもないと、問題が発生します。

drm.edid_firmware パラメータの値は、/sys/module/drm/parameters/edid_firmware に書き込むことで、ブート後にも変更することができます:

# echo edid/your_edid.bin > /sys/module/drm/parameters/edid_firmware

これは、新しく接続されたディスプレイにしか影響せず、すでに接続されている画面は引き続き既存の EDID 設定を使用します。外部ディスプレイの場合は、ディスプレイのケーブルを抜き差しすることで、新しい EDID を使用させることができます。

カーネル 3.15 から、カーネルがロックダウンモードになっていない場合、カーネルコマンドラインパラメータではなく debugfs を使って ブート後に EDID をロードできます。これは、1つのコネクタに接続されているモニタを交換する場合や、単にテストをしたい場合に便利です。上記のとおりに EDID ファイルを手に入れたら、以下を実行してください:

# cat correct-edid.bin > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override

EDID を無効化するには:

# echo -n reset > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override

モニターがホットプラグに対応している場合、ホットプラグをトリガーすることで、(edid_override などに) ロードした新しい EDID をモニターに使用させることができます。この場合、モニターを物理的に再接続したり、再起動したりする必要がありません:

# echo 1 > /sys/kernel/debug/dri/0/HDMI-A-2/trigger_hotplug

モードを強制する

警告: 以下に説明する方法は、例えば Xorg が指定された解像度を考慮しないため、どこか不完全であり、ユーザは上記の方法を使用することが推奨されます。しかし、video= コマンドラインで解像度を指定することは、場合によっては有用かもしれません。

the nouveau wiki より:

カーネルコマンドラインでモードを強制することができます。残念ながら、コマンドラインオプションの video は DRM の場合、ドキュメントが不十分です。使い方の断片は、以下のサイトにあります。

フォーマットは

video=<conn>:<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
  • <conn>: コネクタ、例: DVI-I-1、使用可能なコネクタは /sys/class/drm/ を参照
  • <xres> x <yres>: 解像度
  • M: CVT モードを計算?
  • R: ブランキングを減らす?
  • -<bpp>: 色深度
  • @<refresh>: リフレッシュレート
  • i: インターレース (非CVTモード)
  • m: 余白?
  • e: 出力は強制的にオンにする
  • d: 出力は強制的にオフにされる
  • D: デジタル出力を強制的にオン (例:DVI-I コネクタ)

例えば、video= を複数回使って、DVI1024x76885 Hzに、TV-out をオフに強制する、といったように複数の出力モードをオーバーライドすることが可能です:

video=DVI-I-1:1024x768@85 video=TV-1:d

コネクタの名前と現在の状態を取得するには、以下のシェルワンライナーを使用できます:

$ for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n "${con#*/card?-}: "; cat $p; done
DVI-I-1: connected
HDMI-A-1: disconnected
VGA-1: disconnected

モード設定を無効にする

様々な理由で KMS を無効化したい場合があるでしょう。KMS を無効化するには、nomodeset をカーネルパラメータに追加してください。詳細は カーネルパラメータ を見てください。

nomodeset カーネルパラメータと共に、Intel グラフィックカードの場合は i915.modeset=0 も、Nvidia グラフィックカードの場合は nouveau.modeset=0 も追加する必要があります。Nvidia Optimus のデュアルグラフィック環境では、これら3つのカーネルパラメータをすべて追加する必要があります (つまり、"nomodeset i915.modeset=0 nouveau.modeset=0")。

ノート: 一部の Xorg ドライバは、KMS を無効化すると動作しなくなります。詳細は、あなたの使用しているドライバの wiki ページを見てください。
翻訳ステータス: このページは en:Kernel mode setting の翻訳バージョンです。最後の翻訳日は 2024-04-19 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。