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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎背景: 用語の統一(仮想コンソール))
(同期)
 
(3人の利用者による、間の36版が非表示)
1行目: 1行目:
 
[[Category:グラフィック]]
 
[[Category:グラフィック]]
 
[[Category:カーネル]]
 
[[Category:カーネル]]
  +
[[de:KMS]]
[[en:Kernel mode setting]]
 
 
[[es:Kernel mode setting]]
 
[[es:Kernel mode setting]]
  +
[[en:Kernel Mode Setting]]
[[fr:KMS]]
 
[[hu:Kernel mode setting]]
+
[[fr:Kernel mode setting]]
 
[[ru:Kernel mode setting]]
 
[[ru:Kernel mode setting]]
 
[[zh-hans:Kernel mode setting]]
 
[[zh-hans:Kernel mode setting]]
[[zh-hant:Kernel mode setting]]
 
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|ATI}}
 
{{Related|ATI}}
{{Related|AMDGPU}}
 
 
{{Related|Intel Graphics}}
 
{{Related|Intel Graphics}}
 
{{Related|Nouveau}}
 
{{Related|Nouveau}}
 
{{Related articles end}}
 
{{Related articles end}}
   
Kernel [[Wikipedia:Mode-setting|Mode Setting]] (KMS) は、ユーザースペースではなくカーネル空間でディスプレイの解像度・色深度を設定する方法です。
+
カーネル[[Wikipedia:Mode-setting|モード設定]] (KMS) は、ユーザースペースではなくカーネル空間でディスプレイの解像度・色深度を設定する方法です。
   
Linux カーネルの KMS 機能ではフレームバッファでのネイティブ解像度や素早いコンソール (tty) 切り替えができるようになります。KMS を使うと、歪みを消去し 3D パフォーマンスの上、カーネル空間の電力節約などもたらす新しい技術 (DRI2 など) が有効なります。
+
Linux カーネルの KMS 実装により、フレームバッファでのネイティブ解像度や素早いコンソール (tty) 切り替えができるようになります。、アーティファクトの軽減や 3D パフォーマンスの上、カーネル空間電力機能補助新しい技術 ([[wikipedia:Direct Rendering Infrastructure#DRI2|DRI2]] など) も可能ます。
   
{{Note|プロプライエタリの [[NVIDIA]] ドライバ (364.12 以上) カーネルモードセッティング機能はありますが、カーネル固有機能は使っていないため、高解像度コンソールのための fbdev ドライバがありせん。}}
+
{{Note|プロプライエタリの [[NVIDIA]] ドライバ (364.12 以上) も KMS を実装していますが、カーネルの組み込み実装を使用しないため、高解像度コンソールのための fbdev ドライバは、オプトインの実験的機能としてのみ存在しす (545.29 以降)。}}
   
 
== 背景 ==
 
== 背景 ==
昔、ビデオカードをセットアップするのは X サーバーの仕事でした。このため、仮想コンソールで派手なグラフィックを使うことは簡単ではありませんでした。また、X から 仮想コンソール へ切り替えると ({{ic|Ctrl+Alt+F1}})、X サーバーはカーネルにビデオカードのコントロールを移さなくてはならず、動作が重くなりチラツキが生じていました。同じ"痛々しい"挙動はコントロールを X サーバーに戻すときも起こりました ({{ic|Ctrl+Alt+F7}})。
 
   
  +
以前は、ビデオカードをセットアップするのは X サーバーの仕事でした。このため、[[仮想コンソール]]で派手なグラフィックを使うことは簡単ではありませんでした。また、X から 仮想コンソール へ切り替えると ({{ic|Ctrl+Alt+F2}})、X サーバーはカーネルにビデオカードのコントロールを移さなくてはならず、動作が重くなりチラツキが生じていました。同じ"痛々しい"挙動はコントロールを X サーバーに戻す (X が VT7 で動作している場合 {{ic|Alt+F7}} ときも起こりました。
Kernel Mode Setting (KMS) によって、現在カーネルはビデオカードのモードを設定することができます。これによって、起動時からの派手なグラフィックや、仮想コンソールと X の早い切り替えなどが可能になりました。
 
  +
  +
カーネルモード設定 (KMS) によって、現在カーネルはビデオカードのモードを設定することができます。これによって、起動段階での派手なグラフィックや、仮想コンソールと X の早い切り替えなどが可能になりました。
  +
  +
== 設定 ==
  +
  +
まず、''どの'' 方法を使うにせよ、以下を ''常時'' 無効にする必要があります:
   
== インストール ==
 
まず、''どの''方法を使うにせよ、以下を''常時''無効にする必要があります:
 
 
* ブートローダ内のあらゆる {{ic|<nowiki>vga=</nowiki>}} オプション。KMS によるネイティブ解像度と衝突します。
 
* ブートローダ内のあらゆる {{ic|<nowiki>vga=</nowiki>}} オプション。KMS によるネイティブ解像度と衝突します。
 
* フレームバッファを有効にするあらゆる {{ic|<nowiki>video=</nowiki>}} 行。ドライバと衝突します。
 
* フレームバッファを有効にするあらゆる {{ic|<nowiki>video=</nowiki>}} 行。ドライバと衝突します。
 
* 他のフレームバッファドライバ ([[uvesafb]] など)。
 
* 他のフレームバッファドライバ ([[uvesafb]] など)。
   
=== Late KMS start===
+
=== KMS の遅延開始 ===
[[Intel Graphics|Intel]], [[Nouveau]], [[ATI]], [[AMDGPU]] ドライバでは既に全てのチップセットで KMS が自動的に有効になっています。そのため手動でインストールする必要はありません。
 
   
  +
[[Intel]]、[[Nouveau]]、[[ATI]]、[[AMDGPU]] のドライバでは全てのチップセットで、KMS が自動的に有効になるように既になっています。そのため、何もする必要はありません。
プロプライエタリの [[NVIDIA]] ドライバー (364.12 以上) は KMS をサポートしていますが、[[NVIDIA#DRM カーネルモードセッティング|手動で有効化]]する必要があります。
 
   
プロプライエタリ [[AMD Catalyst]] ドライバはオープンドライバスタックを使いません。KMS を使うにはオプンソースの [[AMDGPU]] ドライバ (古いビデオカードなら [[ATI]] ドライバ) に変えてください
+
プロプライエタリ [[NVIDIA]] ドライバは KMS をサポトしています (364.12 以降)。ただし、[[NVIDIA#DRMーネルモード設定|手動で有効化する]]必要があります
   
=== Early KMS start ===
+
=== KMS の早期開始 ===
   
{{Tip|解像度の問題が発生する場合、[[#モードの強制と EDID|モードの強制]]で問題が解決しないか確認してください。}}
+
{{Tip|解像度の問題が発生する場合、[[#モードと EDID を強制する|モードの強制]]で問題が解決しないか確認してください。}}
   
通常 KMS は [[Arch ブートプロセス#initramfs|initramfs ステージ]]よりも後に初期化されます。起動中にきるだけ早く KMS をードするには、依存するモジュールを {{ic|/etc/mkinitcpio.conf}} {{ic|MODULES}} 行に追加します。
+
通常 KMS は [[Arch ブートプロセス#initramfs|initramfs ステージ]]よりも後に初期化されます。しかし、initramfs ステージで KMS を有効化することもできます。[[Xorg#ドライバのインストール|ビデオライバ]]が必要とするモジュールを initramfs設定ファイルに追加してください:
   
* {{ic|amdgpu}} [[AMDGPU]] ドライバー向け
+
* [[AMDGPU]] の場合は {{ic|amdgpu}}。レガシーな [[ATI]] ドライバを使用している場合は {{ic|radeon}}
  +
* [[Intel Graphics]] の場合は {{ic|i915}}
* {{ic|radeon}} [[ATI]] ドライバー (古いモデル向け)
 
  +
* オープンソースな [[Nouveau]] ドライバの場合は {{ic|nouveau}}
* {{ic|i915}} Intel 内蔵グラフィック向け
 
  +
* out-of-tree の {{Pkg|nvidia}} ドライバや {{Pkg|nvidia-open}} ドライバの場合は {{ic|nvidia nvidia_modeset nvidia_uvm nvidia_drm}} 詳細は [[NVIDIA#DRM カーネルモード設定]] を見てください。
* {{ic|nouveau}} [[Nouveau]] オープンソースドライバー向け
 
* {{ic|mgag200}} Matrox グラフィック向け
 
* [[QEMU#グラフィック|QEMU のグラフィック出力]]を使う場合: {{ic|virtio-gpu}} VirtIO 用、{{ic|qxl}} QXL 用、{{ic|cirrus}} Cirrus 用
 
   
  +
* Matrox グラフィックスの場合は {{ic|mgag200}}
例えば、Intel 内蔵グラフィックドライバーを利用し、KMS を早期に有効化させるには:
 
  +
* 使用している [[QEMU]] グラフィックスに依存します (''qemu'' のオプション {{ic|-vga ''type''}} あるいは [[libvirt]] {{ic|1=<video><model type='''type''<nowiki/>'>}} [https://libvirt.org/formatdomain.html#video-devices]):
{{hc|/etc/mkinitcpio.conf|2=MODULES=(... i915 ...)}}
 
  +
** {{ic|std}} (''qemu'') と {{ic|vga}}/{{ic|bochs}} (''libvirt'') の場合は {{ic|bochs}}
  +
** {{ic|virtio}} の場合は {{ic|virtio-gpu}}
  +
** {{ic|qxl}} の場合は {{ic|qxl}}
  +
** {{ic|vmware}} (''qemu'') と {{ic|vmvga}} (''libvirt'') の場合は {{ic|vmwgfx}}
  +
** {{ic|cirrus}} の場合は {{ic|cirrus}}
  +
* [[VirtualBox]] のグラフィックスコントローラに依存します:
  +
** VMSVGA の場合は {{ic|vmwgfx}}
  +
** VBoxVGA と VBoxSVGA の場合は {{ic|vboxvideo}}
   
  +
Initramfs の設定手順は、使用する initramfs ジェネレータによって若干異なります。
{{Note|Intel ユーザーは ACPI のエラーを出さないために {{ic|i915}} の前に {{ic|intel_agp}} を追加する必要があるかもしれません。ディスプレイ設定を変更してハイバネートから復帰する場合は必須になります。}}
 
   
  +
==== mkinitcpio ====
(生来の解像度に当てはまらない) カスタム EDID ファイルを使っている場合、同じように [[initramfs]] に埋め込む必要があります:
 
   
  +
In-tree なモジュールの場合、{{ic|/etc/mkinitcpio.conf}} の HOOKS 配列に {{ic|kms}} フックが含まれていることを確認してください (これは [https://gitlab.archlinux.org/archlinux/mkinitcpio/mkinitcpio/-/merge_requests/126/diffs#57ac3bb5162944ca1d6c5fa29ff4d7cc886e04bb_53_52 mkinitcpio v33] 以降デフォルトです)。
{{hc|/etc/mkinitcpio.conf|
 
2=FILES=(/usr/lib/firmware/edid/your_edid.bin)}}
 
   
  +
out-of-tree なモジュールの場合、MODULES 配列にモジュール名を追加してください。例えば、NVIDIA グラフィックドライバの early KMS を有効化するには:
その後カーネルイメージを再生成してください (詳しくは [[mkinitcpio]] を参照して下さい):
 
   
  +
{{hc|/etc/mkinitcpio.conf|2=
# mkinitcpio -p <カーネルプリセットの名前; 例 ''linux''>
 
  +
MODULES=(... nvidia nvidia_modeset nvidia_uvm nvidia_drm ...)
  +
}}
   
  +
{{Note|1=Intel Integrated Graphics Processors (IGP) をプライマリ GPU、AMD GPU をディスクリートとして [[PRIME]] GPU を使っている場合、{{ic|intel_agp}} を追加すると、休止状態から復帰するときに問題が起こるかもしれません (モニタが信号を受け取らない)。詳しくは [https://bbs.archlinux.org/viewtopic.php?id=262043] を参照してください。}}
==トラブルシューティング==
 
   
  +
[[#モードと EDID を強制する]] の方法をとっている場合、そのカスタムファイルを [[initramfs]] にも埋め込む必要があります:
===フォントが小さすぎる===
 
[[フォント#デフォルトフォントを変更|デフォルトフォントを変更する方法]]を見てコンソールフォントを大きなフォントに代えてください。Terminus フォント ({{Pkg|terminus-font}}) には {{ic|ter-132n}} など様々なサイズが含まれています。
 
   
  +
{{hc|/etc/mkinitcpio.conf|2=
もしくは[[#モードセッティングを無効にする|モードセッティングを無効化]]して解像度を下げることで相対的にフォントは大きくなります。
 
  +
FILES=(/usr/lib/firmware/edid/''your_edid''.bin)
  +
}}
   
  +
そして、[[mkinitcpio#イメージ作成とアクティベーション|initramfs を再生成]]してください。
===ブートロードの問題と dmesg===
 
古いシステムでは接続されたディスプレイデバイスのポーリングが重荷になることがあります。ポーリングは定期的に実行されるため、ハードウェアによっては最悪の場合、数百ミリ秒近く時間を取られます。動画を再生するときなど、絵面が止まってしまいます。10秒毎にディスプレイの出力が固まってしまうようなときは、ポーリングを無効化することで解決するかもしれません。
 
   
  +
==== Booster ====
起動中に {{ic|0x00000010 (2)}} のエラーコードが表示される場合 (10行近く表示され、最後にエラーコードが含まれているでしょう)、{{ic|/etc/modprobe.d/modprobe.conf}} に次の行を加えて下さい:
 
options drm_kms_helper poll=0
 
   
  +
[[Booster]] を使用している場合、以下の設定変更で必要なモジュールをロードすることができます:
==モードの強制と EDID==
 
   
  +
{{hc|/etc/booster.yaml|
あなたの使っているモニターや TV が正しい [[Wikipedia:EDID|EDID]] データを送信しない、またはそれに類似した問題が発生している場合、実効解像度が自動的に設定されなかったり全く画面が表示されなかったりすることがあります。カーネルには EDID のバイナリデータをロードする仕組みがあり、最も一般的な4つの解像度を設定するデータも提供しています。
 
  +
modules_force_load: i915
  +
}}
   
  +
イメージにファイルを追加する場合:
もしあなたが EDID ファイルを持っているならば話は簡単です。持っていない場合、組み込まれている EDID バイナリのどれか一つを使うか自分で EDID を作って下さい。
 
モニタが Windows で正常に動作しているなら そのドライバから抽出したり {{Pkg|read-edid}} の {{ic|get-edid}} コマンドを使って EDID ファイルを取得するほうが簡単です。
 
あるいは、カーネルのコンパイル時に様々な解像度・設定の EDID ファイルを作成できます。方法については [https://www.kernel.org/doc/html/latest/admin-guide/edid.html カーネルのドキュメント]や[https://www.osadl.org/Single-View.111+M5315d29dd12.0.html 簡易なガイド]を参照してください。
 
さらに、{{ic|/sys/class/drm/*/edid}} 以下も探す方法もあります。
 
   
  +
{{hc|/etc/booster.yaml|
EDID ファイルを用意したのち、{{ic|/usr/lib/firmware}} の下に {{ic|edid}} ディレクトリを作成して:
 
  +
extra_files: /usr/lib/firmware/edid/''your_edid''.bin
  +
}}
   
  +
そして、ブースターイメージを [[Booster#ブースターイメージの再生成|再生成]] してください。
# mkdir /usr/lib/firmware/edid
 
   
  +
== トラブルシューティング ==
それからバイナリを {{ic|/usr/lib/firmware/edid}} ディレクトリにコピーしてください。
 
   
  +
=== フォントが小さすぎる ===
起動時にロードするために、[[カーネルコマンドライン]]で次を指定してください:
 
   
  +
コンソールフォントを大きくする方法については [[Linux コンソール#フォント]] を見てください。Terminus フォント ({{Pkg|terminus-font}}) には {{ic|ter-132b}} など様々なサイズが含まれています。
drm_kms_helper.edid_firmware=edid/your_edid.bin
 
  +
  +
もしくは[[#モード設定を無効にする|モード設定を無効化]]して解像度を下げることで相対的にフォントは大きくなります。
  +
  +
== モードと EDID を強制する ==
  +
  +
ネイティブな解像度が自動的に設定されなかったり、ディスプレイが全く検出されなかったりする場合、モニタが [[Wikipedia:EDID|EDID]] ファイルを送信していなかったり、間違った EDID を送信しているのかもしれません。カーネルはこのようなケースを検出し、最も典型的な解像度のどれかを設定します。
  +
  +
モニタの EDID ファイルを持っているならば、そのファイルを明示的に強制するだけで済みます (以下を参照)。しかし、大抵はまともな EDID ファイルへ直接アクセスできないので、既存の EDID ファイルを抽出するか、新しいものを生成する必要があります。
  +
  +
[https://docs.kernel.org/admin-guide/edid.html 上流のドキュメント]に従うことで (短いガイドは[https://www.osadl.org/Single-View.111+M5315d29dd12.0.html このページ]を参照してください)、カーネルのコンパイル中に様々な解像度や構成の EDID バイナリを生成することができます。他の解決策はこの[https://kodi.wiki/view/Archive:Creating_and_using_edid.bin_via_xorg.conf 記事]で詳細に説明されています。
  +
  +
既存の EDID ファイルを抽出することは、大抵のケースで簡単です。例えば、あなたのモニタが Windows でうまく動作するならば、対応するドライバから EDID を抽出することができます。また、まともな設定のある似たようなモニタが動作するのであれば、{{Pkg|read-edid}} パッケージの {{man|1|get-edid}} を使うことができます。また、{{ic|/sys/class/drm/*/edid}} から探してみることもできます。
  +
  +
EDID の準備ができたら、何かしらのディレクトリ (例えば、{{ic|/usr/lib/firmware}} 内の {{ic|edid}} ディレクトリ) 内に置き、そこへバイナリをコピーしてください。
  +
  +
EDID をブート時にロードするには、以下の[[カーネルコマンドライン]]を指定してください:
   
Linux 4.15 以降では EDID 情報をヘルパーを使わずに直接設定できます:
 
 
drm.edid_firmware=edid/your_edid.bin
 
drm.edid_firmware=edid/your_edid.bin
   
  +
4.13 より前のカーネルでは、代わりに以下のカーネルパラメータを使用してください:
特定の接続だけで使うように指定することも可能です:
 
   
drm_kms_helper.edid_firmware=VGA-1:edid/your_edid.bin
+
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
   
内蔵の4つの解像度を使うには、下の表を見て名前を指定してください:
+
組み込みの解像度の場合は、下の表を参照してください。'''名前''' 列は、その解像度を構成するために使用する必要がある名前です。
   
{| border="1"
+
{| class="wikitable"
 
|-
 
|-
| '''解像度''' || '''指定する名前'''
+
! 解像度 !! 名前
 
|-
 
|-
 
| 800x600 || edid/800x600.bin
 
| 800x600 || edid/800x600.bin
124行目: 154行目:
 
|}
 
|}
   
[[#Early KMS start|KMS を初に実行]]するようにしている場合は、カスタム EDID ファイルを initramfs に含めないと起動時に問題が発生します。
+
[[#KMS の早期開始| KMS]]を行っている場合は、[[mkinitcpio#BINARIES と FILES|カスタム EDID ファイルを initramfs に含め]]なければなりません。さもないと問題が発生します。
   
  +
{{ic|drm.edid_firmware}} パラメータの値は、{{ic|/sys/module/drm/parameters/edid_firmware}} に書き込むことで、ブート後にも変更することができます:
{{Warning|以下の方法は不完全です。Xorg は指定された解像度を使用しなかったりします。上の方法を使うことを推奨します。ただし {{ic|1=video=}} コマンドラインで解像度を指定するのは場合によっては役立ちます。}}
 
   
  +
# echo edid/your_edid.bin > /sys/module/drm/parameters/edid_firmware
[https://nouveau.freedesktop.org/wiki/KernelModeSetting the nouveau wiki] より:
 
   
  +
これは、新しく接続されたディスプレイにしか影響せず、すでに接続されている画面は引き続き既存の EDID 設定を使用します。外部ディスプレイの場合は、ディスプレイのケーブルを抜き差しすることで、新しい EDID を使用させることができます。
カーネルコマンドラインから強制的にモードを選ぶこともできます。残念ながら、DRM に関するコマンドラインオプションはあまりドキュメント化されていません。使い方の簡単な説明はここにあります:
 
  +
  +
カーネル 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
  +
  +
モニターがホットプラグに対応している場合、ホットプラグをトリガーすることで、({{ic|edid_override}} などに) ロードした新しい EDID をモニターに使用させることができます。この場合、モニターを物理的に再接続したり、再起動したりする必要がありません:
  +
  +
# echo 1 > /sys/kernel/debug/dri/0/HDMI-A-2/trigger_hotplug
  +
  +
=== モードを強制する ===
  +
  +
{{Warning|以下に説明する方法は、例えば [[Xorg]] が指定された解像度を考慮しないため、どこか不完全であり、ユーザは上記の方法を使用することが推奨されます。しかし、{{ic|1=video=}} コマンドラインで解像度を指定することは、場合によっては有用かもしれません。}}
  +
  +
[https://nouveau.freedesktop.org/wiki/KernelModeSetting the nouveau wiki] より:
  +
:カーネルコマンドラインでモードを強制することができます。残念ながら、コマンドラインオプションの video は DRM の場合、ドキュメントが不十分です。使い方の断片は、以下のサイトにあります。
  +
:* 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://cgit.freedesktop.org/nouveau/linux-2.6/tree/Documentation/fb/modedb.txt
 
*https://cgit.freedesktop.org/nouveau/linux-2.6/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}}: compute a CVT mode?
+
* {{ic|M}}: CVT モードを計算?
*{{ic|R}}: reduced blanking?
+
* {{ic|R}}: ブランキングを減らす?
*{{ic|-<bpp>}}: 色深度
+
* {{ic|-<bpp>}}: 色深度
*{{ic|@<refresh>}}: リフレッシュレート
+
* {{ic|@<refresh>}}: リフレッシュレート
*{{ic|i}}: インターレース (non-CVT mode)
+
* {{ic|i}}: インターレース (CVTモード)
*{{ic|m}}: 余白
+
* {{ic|m}}: 余白?
*{{ic|e}}: 出力強制 ON
+
* {{ic|e}}: 出力強制的にオンにする
*{{ic|d}}: 出力強制 OFF
+
* {{ic|d}}: 出力強制的にオフにされる
*{{ic|D}}: デジタル出力強制 ON (e.g. DVI-I connector)
+
* {{ic|D}}: デジタル出力強制的にオン (例:DVI-I コネクタ)
  +
  +
例えば、{{ic|<nowiki>video=</nowiki>}} を複数回使って、{{ic|DVI}} を''1024x768''、''85 Hz''に、{{ic|TV-out}} をオフに強制する、といったように複数の出力モードをオーバーライドすることが可能です:
   
{{ic|1=video=}} を使うことでアウトプットのモードを上書きすることができます、例えば、DVI 出力、1024x768、85 Hz、TV 出力オフに強制するには:
 
 
video=DVI-I-1:1024x768@85 video=TV-1:d
 
video=DVI-I-1:1024x768@85 video=TV-1:d
   
コネクタの名前状態を取得するために、のワンライナーを使うことができます:
+
コネクタの名前と現在の状態を取得するに以下シェルワンライナーを使できます:
   
{{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>|
 
DVI-I-1: connected
 
DVI-I-1: connected
 
HDMI-A-1: disconnected
 
HDMI-A-1: disconnected
161行目: 211行目:
 
}}
 
}}
   
==モードセッティングを無効にする==
+
== モード設定を無効にする ==
  +
  +
様々な理由で KMS を無効化したい場合があるでしょう。KMS を無効化するには、{{ic|nomodeset}} をカーネルパラメータに追加してください。詳細は [[カーネルパラメータ]] を見てください。
   
  +
{{ic|nomodeset}} カーネルパラメータと共に、Intel グラフィックカードの場合は {{ic|1=i915.modeset=0}} も、Nvidia グラフィックカードの場合は {{ic|1=nouveau.modeset=0}} も追加する必要があります。Nvidia Optimus のデュアルグラフィック環境では、これら3つのカーネルパラメータをすべて追加する必要があります (つまり、{{ic|1="nomodeset i915.modeset=0 nouveau.modeset=0"}})。
Catalyst ドライバを使っているときなど、ブランクスクリーンになったりディスプレイに "no signal" エラーがでたりするなどの理由で KMS を無効にしたい時があるかもしれません。KMS を無効にするには、カーネルパラメータに {{ic|nomodeset}} を追加します。詳しくは[[カーネルパラメータ]]を見て下さい。
 
   
  +
{{Note|一部の [[Xorg]] ドライバは、KMS を無効化すると動作しなくなります。詳細は、あなたの使用しているドライバの wiki ページを見てください。}}
{{ic|nomodeset}} カーネルパラメータと共に、Intel のグラフィックカードでは {{ic|1=i915.modeset=0}} を Nvidia のグラフィックカードでは {{ic|1=nouveau.modeset=0}} をそれぞれ追加する必要があります。Nvidia の Optimus デュアルグラフィック環境では、3つのカーネルパラメータ全てを追加してください (つまり {{ic|1="nomodeset i915.modeset=0 nouveau.modeset=0"}})。
 
   
  +
{{TranslationStatus|Kernel mode setting|2024-04-19|804286}}
{{Note|KMS を無効にすると動作しない [[Xorg]] ドライバがあります。詳しくはあなたの使っているドライバの wiki ページを見て下さい。}}
 

2024年4月19日 (金) 18:21時点における最新版

関連記事

カーネルモード設定 (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 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。