「カーネルモード設定」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
112行目: 112行目:
 
}}
 
}}
   
==モードの強制と EDID==
+
== モードの強制と EDID ==
   
 
ネイティブ解像度が自動的に設定されなかったり、ディスプレイが全く検出されなかったりした場合、モニタは何も送信しないか、単に歪んだ [[Wikipedia:EDID|EDID]] ファイルを送信するかもしれません。カーネルはこのケースを捕らえようとし、最も一般的な解像度の一つを設定します。
 
ネイティブ解像度が自動的に設定されなかったり、ディスプレイが全く検出されなかったりした場合、モニタは何も送信しないか、単に歪んだ [[Wikipedia:EDID|EDID]] ファイルを送信するかもしれません。カーネルはこのケースを捕らえようとし、最も一般的な解像度の一つを設定します。
   
もしあなたがモニタの EDID ファイルを持っているなら、単にそれを明示的に強制する必要があるだけです (下記参照) しかし、ほとんどの場合、正常なファイルに直接アクセスできないので、既存のものを取り出して修正するか、新しいものを生成する必要があります。
+
もしあなたがモニタの EDID ファイルを持っているなら、単にそれを明示的に強制する必要があるだけです (下記参照)しかし、ほとんどの場合、正常なファイルに直接アクセスできないので、既存のものを取り出して修正するか、新しいものを生成する必要があります。
   
様々な解像度や設定に対応した新しい EDID バイナリを生成するには、[https://www.kernel.org/doc/html/latest/admin-guide/edid.html upstream documentation] に従ってカーネルのコンパイルを行います (簡単なガイドについては [https://www.osadl.org/Single-View.111+M5315d29dd12.0.html] も参照してください)。その他の解決策については、この[https://kodi.wiki/view/Archive:Creating_and_using_edid.bin_via_xorg.conf article]で詳しく説明されています。
+
様々な解像度や設定に対応した新しい EDID バイナリを生成するには、[https://docs.kernel.org/admin-guide/edid.html 上流のドキュメント]に従ってカーネルのコンパイルを行います (簡単なガイドについては [https://www.osadl.org/Single-View.111+M5315d29dd12.0.html] も参照してください)。その他の解決策については、この[https://kodi.wiki/view/Archive:Creating_and_using_edid.bin_via_xorg.conf article]で詳しく説明されています。
 
例えば、あなたのモニタが Windows で正常に動作するなら、対応するドライバから EDID を抽出できますし、同じ設定で動作する同様のモニタなら {{Pkg|read-edid}} パッケージから {{ic|get-edid}} を使うことができます。また、{{ic|/sys/class/drm/*/edid}}で探すこともできます。
 
例えば、あなたのモニタが Windows で正常に動作するなら、対応するドライバから EDID を抽出できますし、同じ設定で動作する同様のモニタなら {{Pkg|read-edid}} パッケージから {{ic|get-edid}} を使うことができます。また、{{ic|/sys/class/drm/*/edid}}で探すこともできます。
   
 
EDID を用意したら、{{ic|/usr/lib/firmware}} の下の {{ic|edid}} というディレクトリに置き、そこにバイナリをコピーしてください。
 
EDID を用意したら、{{ic|/usr/lib/firmware}} の下の {{ic|edid}} というディレクトリに置き、そこにバイナリをコピーしてください。
   
起動時に読み込むには、[[カーネルコマンドライン]]で以下を指定します
+
起動時に読み込むには、[[カーネルコマンドライン]]で以下を指定します:
   
 
drm.edid_firmware=edid/your_edid.bin
 
drm.edid_firmware=edid/your_edid.bin
   
4.13 より古いカーネルでは、代わりにこの行を使用します
+
4.13 より古いカーネルでは、代わりにこの行を使用します:
   
 
drm_kms_helper.edid_firmware=edid/your_edid.bin
 
drm_kms_helper.edid_firmware=edid/your_edid.bin
135行目: 135行目:
 
drm.edid_firmware=VGA-1:edid/your_edid.bin
 
drm.edid_firmware=VGA-1:edid/your_edid.bin
   
蔵の4つの解像度を使うには、下の表を見て名前を指定してください:
+
の解像度の場合下の表を参照してください。'''名前''' の列には、その解像度を強制するために使用する名前が記載されています:
   
{| border="1"
+
{| class="wikitable"
 
|-
 
|-
| '''解像度''' || '''指定する名前'''
+
! 解像度 !! 名前
 
|-
 
|-
 
| 800x600 || edid/800x600.bin
 
| 800x600 || edid/800x600.bin
154行目: 154行目:
 
|}
 
|}
   
[[#Early KMS start|KMS を初期に実行]] するようにしている場合は、カスタム EDID ファイルを initramfs に含めないと起動時に問題が発生します。
+
[[#Early KMS start|KMS を初期に実行]]するようにしている場合は、カスタム EDID ファイルを initramfs に含めないと起動時に問題が発生します。
   
また、起動後に {{ic|sys/module/drm/parameters/edid_firmware}} に書き込むことで、{{ic|drm.edid_firmware}} パラメータの値を変更することができます
+
また、起動後に {{ic|/sys/module/drm/parameters/edid_firmware}} に書き込むことで、{{ic|drm.edid_firmware}} パラメータの値を変更することができます:
   
 
# echo edid/your_edid.bin > /sys/module/drm/parameters/edid_firmware
 
# echo edid/your_edid.bin > /sys/module/drm/parameters/edid_firmware
   
これは、新しく接続されたディスプレイにのみ有効であり、すでに接続されている画面は引き続き既存のEDID設定を使用します。ただし、外部ディスプレイの場合は、プラグを差し直すだけで効果を確認できます。
+
これは、新しく接続されたディスプレイにのみ有効であり、すでに接続されている画面は引き続き既存の EDID 設定を使用します。ただし、外部ディスプレイの場合は、プラグを差し直すだけで効果を確認できます。
   
カーネル3.15 以降、起動後に EDID をロードするために、カーネルが [[セキュリティ#カーネルロックダウンモード|ロックダウンモード]] でない場合は、カーネルコマンドラインパラメーターの代わりに debugfs を使用できます。これは、コネクタのモニターを交換する場合、または単にテストする場合に非常に便利です。上記のように EDID ファイルを取得したら、次を実行します
+
カーネル3.15 以降、起動後に EDID をロードするために、カーネルが [[セキュリティ#カーネルロックダウンモード|ロックダウンモード]] でない場合は、カーネルコマンドラインパラメーターの代わりに debugfs を使用できます。これは、コネクタのモニターを交換する場合、または単にテストする場合に非常に便利です。上記のように EDID ファイルを取得したら、次を実行します:
   
 
# cat correct-edid.bin > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override
 
# cat correct-edid.bin > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override
   
そして、無効化しま
+
無効化するには:
   
 
# echo -n reset > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override
 
# echo -n reset > /sys/kernel/debug/dri/0/HDMI-A-2/edid_override
172行目: 172行目:
 
=== 強制モード ===
 
=== 強制モード ===
   
{{Warning|以下に説明する方法は、例えば [[Xorg]] が指定された解像度を考慮しないため、どこか不完全であり、ユーザは上記の方法を使用することが推奨されます。しかし、{{ic|1=video=}} コマンドラインで解像度を指定することは、あるシナリオでは有用かもしれません。}}
+
{{Warning|以下に説明する方法は、例えば [[Xorg]] が指定された解像度を考慮しないため、どこか不完全であり、ユーザは上記の方法を使用することが推奨されます。しかし、{{ic|1=video=}} コマンドラインで解像度を指定することは、場合によっては有用かもしれません。}}
   
[https://nouveau.freedesktop.org/wiki/KernelModeSetting the nouveau wiki] より
+
[https://nouveau.freedesktop.org/wiki/KernelModeSetting the nouveau wiki] より:
 
:カーネルコマンドラインでモードを強制することができます。残念ながら、コマンドラインオプションの video は DRM の場合、ドキュメントが不十分です。使い方の断片は、以下のサイトにあります。
 
:カーネルコマンドラインでモードを強制することができます。残念ながら、コマンドラインオプションの video は DRM の場合、ドキュメントが不十分です。使い方の断片は、以下のサイトにあります。
:* https://www.kernel.org/doc/html/latest/fb/modedb.html
+
:* https://docs.kernel.org/fb/modedb.html
 
:* https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/gpu/drm/drm_fb_helper.c
 
:* https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/gpu/drm/drm_fb_helper.c
   
 
フォーマットは
 
フォーマットは
   
video=<conn>:<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd] となります。
+
video=<conn>:<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
   
* {{ic|<conn>}}:コネクタ、例:DVI-I-1、使用可能なコネクタは {{ic|/sys/class/drm/}} を参照
+
* {{ic|<conn>}}: コネクタ、例: DVI-I-1、使用可能なコネクタは {{ic|/sys/class/drm/}} を参照
 
* {{ic|<xres> x <yres>}}: 解像度
 
* {{ic|<xres> x <yres>}}: 解像度
* {{ic|M}}: CVT モードを計算
+
* {{ic|M}}: CVT モードを計算?
* {{ic|R}}: blanking を減らす
+
* {{ic|R}}: ブランキングを減らす?
 
* {{ic|-<bpp>}}: 色深度
 
* {{ic|-<bpp>}}: 色深度
 
* {{ic|@<refresh>}}: リフレッシュレート
 
* {{ic|@<refresh>}}: リフレッシュレート
 
* {{ic|i}}: インターレース (非CVTモード)
 
* {{ic|i}}: インターレース (非CVTモード)
* {{ic|m}}: 余白
+
* {{ic|m}}: 余白?
 
* {{ic|e}}: 出力は強制的にオンにする
 
* {{ic|e}}: 出力は強制的にオンにする
 
* {{ic|d}}: 出力は強制的にオフにされる
 
* {{ic|d}}: 出力は強制的にオフにされる
* {{ic|D}}: デジタル出力を強制的にオン (例:DVI-I コネクタ)
+
* {{ic|D}}: デジタル出力を強制的にオン (例:DVI-I コネクタ)
   
例えば、{{ic|<nowiki>video=</nowiki>}} を複数回使って、{{ic|DVI}} を''1024x768''、''85Hz''に、{{ic|TV-out}} をオフに強制する、といったように複数の出力モードをオーバーライドすることが可能です
+
例えば、{{ic|<nowiki>video=</nowiki>}} を複数回使って、{{ic|DVI}} を''1024x768''、''85 Hz''に、{{ic|TV-out}} をオフに強制する、といったように複数の出力モードをオーバーライドすることが可能です:
   
 
video=DVI-I-1:1024x768@85 video=TV-1:d
 
video=DVI-I-1:1024x768@85 video=TV-1:d
   
コネクタの名前と現在の状態を取得するには、以下のシェル oneliner を使用ます
+
コネクタの名前と現在の状態を取得するには、以下のシェルワンライナーを使用できます:
   
 
{{hc|<nowiki>$ for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n "${con#*/card?-}: "; cat $p; done</nowiki>|
 
{{hc|<nowiki>$ for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n "${con#*/card?-}: "; cat $p; done</nowiki>|

2022年9月15日 (木) 22:37時点における版

関連記事

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

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

ノート: プロプライエタリの NVIDIA ドライバ (364.12 以上) も KMS を実装していますが、カーネルの組み込み実装を使用しないため、高解像度コンソールのための fbdev ドライバがありません。

背景

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

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

インストール

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

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

Late KMS start

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

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

Early KMS start

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

通常 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

例えば、Intel のグラフィックドライバで Early KMS を有効にするには:

/etc/mkinitcpio.conf
MODULES=(... i915 ...)
ノート: Intel ユーザーは ACPI エラーを抑制するために i915 の前に intel_agp を追加する必要があるかもしれません (lsmod の出力をチェックして intel_agp がロードされているか確認してください)。これは、変更されたディスプレイ構成で動作するようにハイバネーションから再開するために必要な場合があります。Intel 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-132n など様々なサイズが含まれています。

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

ブートロードの問題と dmesg

古いシステムでは接続されたディスプレイデバイスのポーリングが重荷になることがあります。ポーリングは定期的に実行されるため、ハードウェアによっては最悪の場合、数百ミリ秒近く時間を取られます。動画を再生するときなど、絵面が止まってしまいます。ビデオは HDP 出力で流れているが、ハードウェア構成に HDP ではない出力もある場合も、この問題が発生するかもしれません。10秒毎にディスプレイの出力が固まってしまうようなときは、ポーリングを無効化することで解決するかもしれません。

起動中に 0x00000010 (2) のエラーコードが表示される場合 (10行近くテキストが表示され、最後にエラーコードが含まれているでしょう)、以下の設定を使用してください:

/etc/modprobe.d/modprobe.conf
options drm_kms_helper poll=0

モードの強制と EDID

ネイティブ解像度が自動的に設定されなかったり、ディスプレイが全く検出されなかったりした場合、モニタは何も送信しないか、単に歪んだ EDID ファイルを送信するかもしれません。カーネルはこのケースを捕らえようとし、最も一般的な解像度の一つを設定します。

もしあなたがモニタの EDID ファイルを持っているなら、単にそれを明示的に強制する必要があるだけです (下記参照)。しかし、ほとんどの場合、正常なファイルに直接アクセスできないので、既存のものを取り出して修正するか、新しいものを生成する必要があります。

様々な解像度や設定に対応した新しい EDID バイナリを生成するには、上流のドキュメントに従ってカーネルのコンパイルを行います (簡単なガイドについては [3] も参照してください)。その他の解決策については、このarticleで詳しく説明されています。 例えば、あなたのモニタが Windows で正常に動作するなら、対応するドライバから EDID を抽出できますし、同じ設定で動作する同様のモニタなら read-edid パッケージから get-edid を使うことができます。また、/sys/class/drm/*/edidで探すこともできます。

EDID を用意したら、/usr/lib/firmware の下の edid というディレクトリに置き、そこにバイナリをコピーしてください。

起動時に読み込むには、カーネルコマンドラインで以下を指定します:

drm.edid_firmware=edid/your_edid.bin

4.13 より古いカーネルでは、代わりにこの行を使用します:

drm_kms_helper.edid_firmware=edid/your_edid.bin

特定の接続だけで使うように指定することも可能です:

drm.edid_firmware=VGA-1:edid/your_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 に含めないと起動時に問題が発生します。

また、起動後に /sys/module/drm/parameters/edid_firmware に書き込むことで、drm.edid_firmware パラメータの値を変更することができます:

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

これは、新しく接続されたディスプレイにのみ有効であり、すでに接続されている画面は引き続き既存の EDID 設定を使用します。ただし、外部ディスプレイの場合は、プラグを差し直すだけで効果を確認できます。

カーネル3.15 以降、起動後に EDID をロードするために、カーネルが ロックダウンモード でない場合は、カーネルコマンドラインパラメーターの代わりに debugfs を使用できます。これは、コネクタのモニターを交換する場合、または単にテストする場合に非常に便利です。上記のように EDID ファイルを取得したら、次を実行します:

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

無効化するには:

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

強制モード

警告: 以下に説明する方法は、例えば 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

モードセッティングを無効にする

Catalyst ドライバを使っているときなど、ブランクスクリーンになったりディスプレイに "no signal" エラーがでたりするなどの理由で KMS を無効にしたい時があるかもしれません。KMS を無効にするには、カーネルパラメータに nomodeset を追加します。詳しくはカーネルパラメータを見て下さい。

nomodeset カーネルパラメータと共に、Intel のグラフィックカードでは i915.modeset=0 を Nvidia のグラフィックカードでは nouveau.modeset=0 をそれぞれ追加する必要があります。Nvidia の Optimus デュアルグラフィック環境では、3つのカーネルパラメータ全てを追加してください (つまり "nomodeset i915.modeset=0 nouveau.modeset=0")。

ノート: KMS を無効にすると動作しない Xorg ドライバがあります。詳しくはあなたの使っているドライバの wiki ページを見て下さい。