「カーネルモード設定」の版間の差分
(→背景: 同期) |
(→インストール: 同期) |
||
25行目: | 25行目: | ||
== インストール == |
== インストール == |
||
+ | |||
まず、''どの''方法を使うにせよ、以下を''常時''無効にする必要があります: |
まず、''どの''方法を使うにせよ、以下を''常時''無効にする必要があります: |
||
+ | |||
* ブートローダ内のあらゆる {{ic|<nowiki>vga=</nowiki>}} オプション。KMS によるネイティブ解像度と衝突します。 |
* ブートローダ内のあらゆる {{ic|<nowiki>vga=</nowiki>}} オプション。KMS によるネイティブ解像度と衝突します。 |
||
* フレームバッファを有効にするあらゆる {{ic|<nowiki>video=</nowiki>}} 行。ドライバと衝突します。 |
* フレームバッファを有効にするあらゆる {{ic|<nowiki>video=</nowiki>}} 行。ドライバと衝突します。 |
||
* 他のフレームバッファドライバ ([[uvesafb]] など)。 |
* 他のフレームバッファドライバ ([[uvesafb]] など)。 |
||
− | === Late KMS start=== |
+ | === Late KMS start === |
− | [[Intel Graphics|Intel]], [[Nouveau]], [[ATI]], [[AMDGPU]] ドライバでは既に全てのチップセットで KMS が自動的に有効になっています。そのため手動でインストールする必要はありません。 |
||
− | + | [[Intel]]、[[Nouveau]]、[[ATI]]、[[AMDGPU]] のドライバでは全てのチップセットで、KMS が自動的に有効になるように既になっています。そのため手動で KMS をインストールする必要はありません。 |
|
− | プロプライエタリ |
+ | プロプライエタリな [[NVIDIA]] ドライバは KMS をサポートしています (364.12 以降)。ただし、[[NVIDIA#DRM カーネルモードセッティング|手動で有効化する]]必要があります。 |
=== Early KMS start === |
=== Early KMS start === |
||
41行目: | 42行目: | ||
{{Tip|解像度の問題が発生する場合、[[#モードの強制と EDID|モードの強制]]で問題が解決しないか確認してください。}} |
{{Tip|解像度の問題が発生する場合、[[#モードの強制と EDID|モードの強制]]で問題が解決しないか確認してください。}} |
||
− | 通常 KMS は [[Arch ブートプロセス#initramfs|initramfs ステージ]]よりも後に初期化されます。 |
+ | 通常 KMS は [[Arch ブートプロセス#initramfs|initramfs ステージ]]よりも後に初期化されます。しかし、initramfs ステージで KMS を有効化することもできます。[[Xorg#ドライバーのインストール|ビデオドライバ]]が必要とするモジュールを initramfs の設定ファイルに追加してください: |
− | * {{ic|amdgpu}} [[ |
+ | * [[AMDGPU]] の場合は {{ic|amdgpu}}。レガシーな [[ATI]] ドライバを使用している場合は {{ic|radeon}}。 |
+ | * [[Intel Graphics]] の場合は {{ic|i915}}。 |
||
− | * {{ic|radeon}} [[ATI]] ドライバー (古いモデル向け) |
||
+ | * オープンソースな [[Nouveau]] ドライバの場合は {{ic|nouveau}}。 |
||
− | * {{ic|i915}} Intel 内蔵グラフィック向け |
||
+ | * {{Pkg|nvidia}} ドライバの場合は {{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}} を追加する必要があるかもしれません。ディスプレイ設定を変更してハイバネートから復帰する場合は必須になります。}} |
||
− | |||
− | (生来の解像度に当てはまらない) カスタム EDID ファイルを使っている場合、同じように [[initramfs]] に埋め込む必要があります: |
||
− | |||
− | {{hc|/etc/mkinitcpio.conf| |
||
− | 2=FILES=(/usr/lib/firmware/edid/your_edid.bin)}} |
||
− | |||
− | その後カーネルイメージを再生成してください (詳しくは [[mkinitcpio]] を参照して下さい): |
||
− | |||
− | # mkinitcpio -p <カーネルプリセットの名前; 例 ''linux''> |
||
==== mkinitcpio ==== |
==== mkinitcpio ==== |
||
− | 例えば、Intel のグラフィックドライバで Early KMS を有効にするには |
+ | 例えば、Intel のグラフィックドライバで Early KMS を有効にするには: |
− | {{hc|/etc/mkinitcpio.conf|2=MODULES=(... i915 ...)}} |
+ | {{hc|/etc/mkinitcpio.conf|2=MODULES=(... i915 ...)}} |
− | {{Note|1=Intel ユーザーは ACPI エラーを抑制するために {{ic|i915}} の前に {{ic|intel_agp}} を追加する必要があるかもしれません ({{ic|lsmod}} の出力をチェックして {{ic|intel_agp}} がロードされているか確認してください。 |
+ | {{Note|1=Intel ユーザーは ACPI エラーを抑制するために {{ic|i915}} の前に {{ic|intel_agp}} を追加する必要があるかもしれません ({{ic|lsmod}} の出力をチェックして {{ic|intel_agp}} がロードされているか確認してください)。これは、変更されたディスプレイ構成で動作するようにハイバネーションから再開するために必要な場合があります。Intel IGP をプライマリ GPU、AMD GPU をディスクリートとして PRIME GPU を使っている場合、{{ic|intel_agp}} を追加すると、休止状態から復帰するときに問題が起こるかもしれません (モニタが信号を受け取らない)。詳しくは [https://bbs.archlinux.org/viewtopic.php?id=262043] を参照してください。}} |
カスタム EDID ファイルを使用している場合 (内蔵解像度には適用されません) それを [[initramfs]] にも埋め込む必要があります。 |
カスタム EDID ファイルを使用している場合 (内蔵解像度には適用されません) それを [[initramfs]] にも埋め込む必要があります。 |
||
78行目: | 76行目: | ||
}} |
}} |
||
− | + | そして、[[mkinitcpio#イメージ作成とアクティベーション|initramfs を再生成]]してください。 |
|
==== Booster ==== |
==== Booster ==== |
||
− | [[Booster]] を使用している場合、以下の設定変更で必要なモジュールをロードすることができます |
+ | [[Booster]] を使用している場合、以下の設定変更で必要なモジュールをロードすることができます: |
{{hc|/etc/booster.yaml| |
{{hc|/etc/booster.yaml| |
||
88行目: | 86行目: | ||
}} |
}} |
||
− | イメージにファイルを追加する場合 |
+ | イメージにファイルを追加する場合: |
{{hc|/etc/booster.yaml| |
{{hc|/etc/booster.yaml| |
||
94行目: | 92行目: | ||
}} |
}} |
||
− | + | そして、ブースターイメージを [[Booster#ブースターイメージの再生成|再生成]] してください。 |
|
==トラブルシューティング== |
==トラブルシューティング== |
2022年9月15日 (木) 22:35時点における版
関連記事
Kernel Mode Setting (KMS) は、ユーザースペースではなくカーネル空間でディスプレイの解像度・色深度を設定する方法です。
Linux カーネルの KMS 実装により、フレームバッファでのネイティブ解像度や素早いコンソール (tty) 切り替えができるようになります。また、アーティファクトの軽減や 3D パフォーマンスの向上、カーネル空間での省電力機能を補助する新しい技術 (DRI2 など) も可能にします。
目次
背景
以前は、ビデオカードをセットアップするのは X サーバーの仕事でした。このため、仮想コンソールで派手なグラフィックを使うことは簡単ではありませんでした。また、X から 仮想コンソール へ切り替えると (Ctrl+Alt+F2
)、X サーバーはカーネルにビデオカードのコントロールを移さなくてはならず、動作が重くなりチラツキが生じていました。同じ"痛々しい"挙動はコントロールを X サーバーに戻す (X が VT7 で動作している場合 Alt+F7
ときも起こりました。
Kernel Mode Setting (KMS) によって、現在カーネルはビデオカードのモードを設定することができます。これによって、起動段階での派手なグラフィックや、仮想コンソールと X の早い切り替えなどが可能になりました。
インストール
まず、どの方法を使うにせよ、以下を常時無効にする必要があります:
- ブートローダ内のあらゆる
vga=
オプション。KMS によるネイティブ解像度と衝突します。 - フレームバッファを有効にするあらゆる
video=
行。ドライバと衝突します。 - 他のフレームバッファドライバ (uvesafb など)。
Late KMS start
Intel、Nouveau、ATI、AMDGPU のドライバでは全てのチップセットで、KMS が自動的に有効になるように既になっています。そのため手動で KMS をインストールする必要はありません。
プロプライエタリな NVIDIA ドライバは KMS をサポートしています (364.12 以降)。ただし、手動で有効化する必要があります。
Early KMS start
通常 KMS は initramfs ステージよりも後に初期化されます。しかし、initramfs ステージで KMS を有効化することもできます。ビデオドライバが必要とするモジュールを initramfs の設定ファイルに追加してください:
- AMDGPU の場合は
amdgpu
。レガシーな ATI ドライバを使用している場合はradeon
。 - Intel Graphics の場合は
i915
。 - オープンソースな Nouveau ドライバの場合は
nouveau
。 - nvidia ドライバの場合は
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
例えば、Intel のグラフィックドライバで Early KMS を有効にするには:
/etc/mkinitcpio.conf
MODULES=(... i915 ...)
カスタム 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
そして、ブースターイメージを 再生成 してください。
トラブルシューティング
フォントが小さすぎる
デフォルトフォントを変更する方法を見てコンソールフォントを大きなフォントに代えてください。Terminus フォント (terminus-font) には ter-132n
など様々なサイズが含まれています。
もしくはモードセッティングを無効化して解像度を下げることで相対的にフォントは大きくなります。
ブートロードの問題と dmesg
古いシステムでは接続されたディスプレイデバイスのポーリングが重荷になることがあります。ポーリングは定期的に実行されるため、ハードウェアによっては最悪の場合、数百ミリ秒近く時間を取られます。動画を再生するときなど、絵面が止まってしまいます。10秒毎にディスプレイの出力が固まってしまうようなときは、ポーリングを無効化することで解決するかもしれません。
起動中に 0x00000010 (2)
のエラーコードが表示される場合 (10行近く表示され、最後にエラーコードが含まれているでしょう)、/etc/modprobe.d/modprobe.conf
に次の行を加えて下さい:
options drm_kms_helper poll=0
モードの強制と EDID
ネイティブ解像度が自動的に設定されなかったり、ディスプレイが全く検出されなかったりした場合、モニタは何も送信しないか、単に歪んだ EDID ファイルを送信するかもしれません。カーネルはこのケースを捕らえようとし、最も一般的な解像度の一つを設定します。
もしあなたがモニタの EDID ファイルを持っているなら、単にそれを明示的に強制する必要があるだけです (下記参照) しかし、ほとんどの場合、正常なファイルに直接アクセスできないので、既存のものを取り出して修正するか、新しいものを生成する必要があります。
様々な解像度や設定に対応した新しい EDID バイナリを生成するには、upstream documentation に従ってカーネルのコンパイルを行います (簡単なガイドについては [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
内蔵の4つの解像度を使うには、下の表を見て名前を指定してください:
解像度 | 指定する名前 |
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
強制モード
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
: blanking を減らす-<bpp>
: 色深度@<refresh>
: リフレッシュレートi
: インターレース (非CVTモード)m
: 余白e
: 出力は強制的にオンにするd
: 出力は強制的にオフにされるD
: デジタル出力を強制的にオン (例:DVI-I コネクタ)
例えば、video=
を複数回使って、DVI
を1024x768、85Hzに、TV-out
をオフに強制する、といったように複数の出力モードをオーバーライドすることが可能です。
video=DVI-I-1:1024x768@85 video=TV-1:d
コネクタの名前と現在の状態を取得するには、以下のシェル oneliner を使用します。
$ 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"
)。