「カーネルモード設定」の版間の差分
細 (修正) |
Kusanaginoturugi (トーク | 投稿記録) (カテゴリを修正) |
||
(3人の利用者による、間の31版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category:グラフィック]] |
+ | [[Category:グラフィックス]] |
[[Category:カーネル]] |
[[Category:カーネル]] |
||
[[de:KMS]] |
[[de:KMS]] |
||
+ | [[es:Kernel mode setting]] |
||
[[en:Kernel Mode Setting]] |
[[en:Kernel Mode Setting]] |
||
[[fr:Kernel mode setting]] |
[[fr:Kernel mode setting]] |
||
12行目: | 13行目: | ||
{{Related articles end}} |
{{Related articles end}} |
||
− | + | カーネル[[Wikipedia:Mode-setting|モード設定]] (KMS) は、ユーザースペースではなくカーネル空間でディスプレイの解像度・色深度を設定する方法です。 |
|
− | Linux カーネルの KMS 実装により、フレームバッファでのネイティブ解像度や素早いコンソール (tty) 切り替えができるようになります。また、アーティファクトの軽減や 3D パフォーマンスの向上、カーネル空間での省電力機能を補助する新しい技術 (DRI2 など) も可能にします。 |
+ | Linux カーネルの KMS 実装により、フレームバッファでのネイティブ解像度や素早いコンソール (tty) 切り替えができるようになります。また、アーティファクトの軽減や 3D パフォーマンスの向上、カーネル空間での省電力機能を補助する新しい技術 ([[wikipedia:Direct Rendering Infrastructure#DRI2|DRI2]] など) も可能にします。 |
− | {{Note|プロプライエタリの [[NVIDIA]] ドライバ (364.12 以上) も KMS を実装していますが、カーネルの組み込み実装を使用しないため、高解像度コンソールのための 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]] など)。 |
||
− | === |
+ | === KMS の遅延開始 === |
− | [[Intel Graphics|Intel]], [[Nouveau]], [[ATI]], [[AMDGPU]] ドライバでは既に全てのチップセットで KMS が自動的に有効になっています。そのため手動でインストールする必要はありません。 |
||
− | |||
− | プロプライエタリの [[NVIDIA]] ドライバー (364.12 以上) は KMS をサポートしていますが、[[NVIDIA#DRM カーネルモードセッティング|手動で有効化]]する必要があります。 |
||
+ | [[Intel]]、[[Nouveau]]、[[ATI]]、[[AMDGPU]] のドライバでは全てのチップセットで、KMS が自動的に有効になるように既になっています。そのため、何もする必要はありません。 |
||
− | プロプライエタリの [[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]] ドライバー向け |
||
− | * {{ic|radeon}} [[ATI]] ドライバー (古いモデル向け) |
||
− | * {{ic|i915}} Intel 内蔵グラフィック向け |
||
− | * {{ic|nouveau}} [[Nouveau]] オープンソースドライバー向け |
||
− | * {{ic|mgag200}} Matrox グラフィック向け |
||
− | * [[QEMU#グラフィック|QEMU のグラフィック出力]]を使う場合: {{ic|virtio-gpu}} VirtIO 用、{{ic|qxl}} QXL 用、{{ic|cirrus}} Cirrus 用 |
||
+ | * [[AMDGPU]] の場合は {{ic|amdgpu}}。レガシーな [[ATI]] ドライバを使用している場合は {{ic|radeon}} |
||
− | 例えば、Intel 内蔵グラフィックドライバーを利用し、KMS を早期に有効化させるには: |
||
+ | * [[Intel Graphics]] の場合は {{ic|i915}} |
||
− | {{hc|/etc/mkinitcpio.conf|2=MODULES=(... i915 ...)}} |
||
+ | * オープンソースな [[Nouveau]] ドライバの場合は {{ic|nouveau}} |
||
+ | * out-of-tree の {{Pkg|nvidia}} ドライバや {{Pkg|nvidia-open}} ドライバの場合は {{ic|nvidia nvidia_modeset nvidia_uvm nvidia_drm}} 詳細は [[NVIDIA#DRM カーネルモード設定]] を見てください。 |
||
+ | * Matrox グラフィックスの場合は {{ic|mgag200}} |
||
− | {{Note|Intel ユーザーは ACPI のエラーを出さないために {{ic|i915}} の前に {{ic|intel_agp}} を追加する必要があるかもしれません。ディスプレイ設定を変更してハイバネートから復帰する場合は必須になります。}} |
||
+ | * 使用している [[QEMU]] グラフィックスに依存します (''qemu'' のオプション {{ic|-vga ''type''}} あるいは [[libvirt]] {{ic|1=<video><model type='''type''<nowiki/>'>}} [https://libvirt.org/formatdomain.html#video-devices]): |
||
+ | ** {{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 ジェネレータによって若干異なります。 |
||
− | (生来の解像度に当てはまらない) カスタム EDID ファイルを使っている場合、同じように [[initramfs]] に埋め込む必要があります: |
||
− | |||
− | {{hc|/etc/mkinitcpio.conf| |
||
− | 2=FILES=(/usr/lib/firmware/edid/your_edid.bin)}} |
||
− | |||
− | その後カーネルイメージを再生成してください (詳しくは [[mkinitcpio]] を参照して下さい): |
||
− | |||
− | # mkinitcpio -p <カーネルプリセットの名前; 例 ''linux''> |
||
==== mkinitcpio ==== |
==== mkinitcpio ==== |
||
+ | 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] 以降デフォルトです)。 |
||
− | 例えば、Intel のグラフィックドライバで Early KMS を有効にするには |
||
+ | out-of-tree なモジュールの場合、MODULES 配列にモジュール名を追加してください。例えば、NVIDIA グラフィックドライバの early KMS を有効化するには: |
||
− | {{hc|/etc/mkinitcpio.conf|2=MODULES=(... i915 ...)}} となります。 |
||
+ | |||
+ | {{hc|/etc/mkinitcpio.conf|2= |
||
+ | MODULES=(... nvidia nvidia_modeset nvidia_uvm nvidia_drm ...) |
||
+ | }} |
||
− | {{Note|1=Intel |
+ | {{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]] にも埋め込む必要があります: |
|
{{hc|/etc/mkinitcpio.conf|2= |
{{hc|/etc/mkinitcpio.conf|2= |
||
77行目: | 81行目: | ||
}} |
}} |
||
− | + | そして、[[mkinitcpio#イメージ作成とアクティベーション|initramfs を再生成]]してください。 |
|
==== Booster ==== |
==== Booster ==== |
||
− | [[Booster]] を使用している場合、以下の設定変更で必要なモジュールをロードすることができます |
+ | [[Booster]] を使用している場合、以下の設定変更で必要なモジュールをロードすることができます: |
{{hc|/etc/booster.yaml| |
{{hc|/etc/booster.yaml| |
||
87行目: | 91行目: | ||
}} |
}} |
||
− | イメージにファイルを追加する場合 |
+ | イメージにファイルを追加する場合: |
{{hc|/etc/booster.yaml| |
{{hc|/etc/booster.yaml| |
||
93行目: | 97行目: | ||
}} |
}} |
||
− | + | そして、ブースターイメージを [[Booster#ブースターイメージの再生成|再生成]] してください。 |
|
− | ==トラブルシューティング== |
+ | == トラブルシューティング == |
− | ===フォントが小さすぎる=== |
+ | === フォントが小さすぎる === |
− | [[フォント#デフォルトフォントを変更|デフォルトフォントを変更する方法]]を見てコンソールフォントを大きなフォントに代えてください。Terminus フォント ({{Pkg|terminus-font}}) には {{ic|ter-132n}} など様々なサイズが含まれています。 |
||
+ | コンソールフォントを大きくする方法については [[Linux コンソール#フォント]] を見てください。Terminus フォント ({{Pkg|terminus-font}}) には {{ic|ter-132b}} など様々なサイズが含まれています。 |
||
− | もしくは[[#モードセッティングを無効にする|モードセッティングを無効化]]して解像度を下げることで相対的にフォントは大きくなります。 |
||
+ | もしくは[[#モード設定を無効にする|モード設定を無効化]]して解像度を下げることで相対的にフォントは大きくなります。 |
||
− | ===ブートロードの問題と dmesg=== |
||
− | 古いシステムでは接続されたディスプレイデバイスのポーリングが重荷になることがあります。ポーリングは定期的に実行されるため、ハードウェアによっては最悪の場合、数百ミリ秒近く時間を取られます。動画を再生するときなど、絵面が止まってしまいます。10秒毎にディスプレイの出力が固まってしまうようなときは、ポーリングを無効化することで解決するかもしれません。 |
||
+ | == モードと EDID を強制する == |
||
− | 起動中に {{ic|0x00000010 (2)}} のエラーコードが表示される場合 (10行近く表示され、最後にエラーコードが含まれているでしょう)、{{ic|/etc/modprobe.d/modprobe.conf}} に次の行を加えて下さい: |
||
− | options drm_kms_helper poll=0 |
||
+ | ネイティブな解像度が自動的に設定されなかったり、ディスプレイが全く検出されなかったりする場合、モニタが [[Wikipedia:EDID|EDID]] ファイルを送信していなかったり、間違った EDID を送信しているのかもしれません。カーネルはこのようなケースを検出し、最も典型的な解像度のどれかを設定します。 |
||
− | ==モードの強制と EDID== |
||
+ | モニタの EDID ファイルを持っているならば、そのファイルを明示的に強制するだけで済みます (以下を参照)。しかし、大抵はまともな EDID ファイルへ直接アクセスできないので、既存の EDID ファイルを抽出するか、新しいものを生成する必要があります。 |
||
− | ネイティブ解像度が自動的に設定されなかったり、ディスプレイが全く検出されなかったりした場合、モニタは何も送信しないか、単に歪んだ [[Wikipedia: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 ファイルを持っているなら、単にそれを明示的に強制する必要があるだけです (下記参照) しかし、ほとんどの場合、正常なファイルに直接アクセスできないので、既存のものを取り出して修正するか、新しいものを生成する必要があります。 |
||
+ | 既存の EDID ファイルを抽出することは、大抵のケースで簡単です。例えば、あなたのモニタが Windows でうまく動作するならば、対応するドライバから EDID を抽出することができます。また、まともな設定のある似たようなモニタが動作するのであれば、{{Pkg|read-edid}} パッケージの {{man|1|get-edid}} を使うことができます。また、{{ic|/sys/class/drm/*/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]で詳しく説明されています。 |
||
− | 例えば、あなたのモニタが Windows で正常に動作するなら、対応するドライバから EDID を抽出できますし、同じ設定で動作する同様のモニタなら {{Pkg|read-edid}} パッケージから {{ic|get-edid}} を使うことができます。また、{{ic|/sys/class/drm/*/edid}}で探すこともできます。 |
||
− | EDID |
+ | EDID の準備ができたら、何かしらのディレクトリ (例えば、{{ic|/usr/lib/firmware}} 内の {{ic|edid}} ディレクトリ) 内に置き、そこへバイナリをコピーしてください。 |
− | + | 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 |
||
+ | 特定のコネクタに対してのみ EDID を適用するには、以下を使用してください: |
||
− | 特定の接続だけで使うように指定することも可能です: |
||
drm.edid_firmware=VGA-1:edid/your_edid.bin |
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 |
||
− | {| border="1" |
||
+ | |||
+ | 組み込みの解像度の場合は、以下の表を参照してください。'''名前''' 列は、その解像度を構成するために使用する必要がある名前です。 |
||
+ | |||
+ | {| class="wikitable" |
||
|- |
|- |
||
− | + | ! 解像度 !! 名前 |
|
|- |
|- |
||
| 800x600 || edid/800x600.bin |
| 800x600 || edid/800x600.bin |
||
150行目: | 154行目: | ||
|} |
|} |
||
− | [[# |
+ | [[#KMS の早期開始|早期 KMS]]を行っている場合は、[[mkinitcpio#BINARIES と FILES|カスタムの EDID ファイルを initramfs 内に含め]]なければなりません。さもないと、問題が発生します。 |
− | + | {{ic|drm.edid_firmware}} パラメータの値は、{{ic|/sys/module/drm/parameters/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 |
+ | カーネル 3.15 から、カーネルが[[セキュリティ#カーネルロックダウンモード|ロックダウンモード]]になっていない場合、カーネルコマンドラインパラメータではなく debugfs を使って ブート後に EDID をロードできます。これは、1つのコネクタに接続されているモニタを交換する場合や、単にテストをしたい場合に便利です。上記のとおりに 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 |
||
− | + | EDID を無効化するには: |
|
# 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 |
||
+ | モニターがホットプラグに対応している場合、ホットプラグをトリガーすることで、({{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] より。 |
||
+ | |||
+ | {{Warning|以下に説明する方法は、例えば [[Xorg]] が指定された解像度を考慮しないため、どこか不完全であり、ユーザは上記の方法を使用することが推奨されます。しかし、{{ic|1=video=}} コマンドラインで解像度を指定することは、場合によっては有用かもしれません。}} |
||
+ | |||
+ | [https://nouveau.freedesktop.org/wiki/KernelModeSetting the nouveau wiki] より: |
||
:カーネルコマンドラインでモードを強制することができます。残念ながら、コマンドラインオプションの video は DRM の場合、ドキュメントが不十分です。使い方の断片は、以下のサイトにあります。 |
:カーネルコマンドラインでモードを強制することができます。残念ながら、コマンドラインオプションの video は DRM の場合、ドキュメントが不十分です。使い方の断片は、以下のサイトにあります。 |
||
− | :* https:// |
+ | :* 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}}: |
+ | * {{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''、'' |
+ | 例えば、{{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 |
||
− | コネクタの名前と現在の状態を取得するには、以下のシェル |
+ | コネクタの名前と現在の状態を取得するには、以下のシェルワンライナーを使用できます: |
{{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>| |
||
203行目: | 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年9月3日 (火) 22:42時点における最新版
関連記事
カーネルモード設定 (KMS) は、ユーザースペースではなくカーネル空間でディスプレイの解像度・色深度を設定する方法です。
Linux カーネルの KMS 実装により、フレームバッファでのネイティブ解像度や素早いコンソール (tty) 切り替えができるようになります。また、アーティファクトの軽減や 3D パフォーマンスの向上、カーネル空間での省電力機能を補助する新しい技術 (DRI2 など) も可能にします。
目次
背景
以前は、ビデオカードをセットアップするのは X サーバーの仕事でした。このため、仮想コンソールで派手なグラフィックを使うことは簡単ではありませんでした。また、X から 仮想コンソール へ切り替えると (Ctrl+Alt+F2
)、X サーバーはカーネルにビデオカードのコントロールを移さなくてはならず、動作が重くなりチラツキが生じていました。同じ"痛々しい"挙動はコントロールを X サーバーに戻す (X が VT7 で動作している場合 Alt+F7
ときも起こりました。
カーネルモード設定 (KMS) によって、現在カーネルはビデオカードのモードを設定することができます。これによって、起動段階での派手なグラフィックや、仮想コンソールと X の早い切り替えなどが可能になりました。
設定
まず、どの 方法を使うにせよ、以下を 常時 無効にする必要があります:
- ブートローダ内のあらゆる
vga=
オプション。KMS によるネイティブ解像度と衝突します。 - フレームバッファを有効にするあらゆる
video=
行。ドライバと衝突します。 - 他のフレームバッファドライバ (uvesafb など)。
KMS の遅延開始
Intel、Nouveau、ATI、AMDGPU のドライバでは全てのチップセットで、KMS が自動的に有効になるように既になっています。そのため、何もする必要はありません。
プロプライエタリな NVIDIA ドライバは KMS をサポートしています (364.12 以降)。ただし、手動で有効化する必要があります。
KMS の早期開始
通常 KMS は initramfs ステージよりも後に初期化されます。しかし、initramfs ステージで KMS を有効化することもできます。ビデオドライバが必要とするモジュールを initramfs の設定ファイルに追加してください:
- AMDGPU の場合は
amdgpu
。レガシーな ATI ドライバを使用している場合はradeon
- Intel Graphics の場合は
i915
- オープンソースな Nouveau ドライバの場合は
nouveau
- out-of-tree の nvidia ドライバや nvidia-open ドライバの場合は
nvidia nvidia_modeset nvidia_uvm nvidia_drm
詳細は NVIDIA#DRM カーネルモード設定 を見てください。
- 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
- VMSVGA の場合は
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 ...)
#モードと 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
モードを強制する
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=
を複数回使って、DVI
を1024x768、85 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"
)。