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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(英語版と同期)
(英語版に追従)
52行目: 52行目:
   
 
例えば、Intel 内蔵グラフィックドライバーを利用し、KMS を早期に有効化させるには:
 
例えば、Intel 内蔵グラフィックドライバーを利用し、KMS を早期に有効化させるには:
{{hc|/etc/mkinitcpio.conf|2=MODULES="... i915 ..."}}
+
{{hc|/etc/mkinitcpio.conf|2=MODULES=(... i915 ...)}}
   
 
{{Note|Intel ユーザーは ACPI のエラーを出さないために {{ic|i915}} の前に {{ic|intel_agp}} を追加する必要があるかもしれません。ディスプレイ設定を変更してハイバネートから復帰する場合は必須になります。}}
 
{{Note|Intel ユーザーは ACPI のエラーを出さないために {{ic|i915}} の前に {{ic|intel_agp}} を追加する必要があるかもしれません。ディスプレイ設定を変更してハイバネートから復帰する場合は必須になります。}}
59行目: 59行目:
   
 
{{hc|/etc/mkinitcpio.conf|
 
{{hc|/etc/mkinitcpio.conf|
2=FILES="/usr/lib/firmware/edid/your_edid.bin"}}
+
2=FILES=(/usr/lib/firmware/edid/your_edid.bin)}}
   
 
その後カーネルイメージを再生成してください (詳しくは [[mkinitcpio]] を参照して下さい):
 
その後カーネルイメージを再生成してください (詳しくは [[mkinitcpio]] を参照して下さい):
82行目: 82行目:
 
あなたの使っているモニターや TV が正しい [[Wikipedia:EDID|EDID]] データを送信しない、またはそれに類似した問題が発生している場合、実効解像度が自動的に設定されなかったり全く画面が表示されなかったりすることがあります。カーネルには EDID のバイナリデータをロードする仕組みがあり、最も一般的な4つの解像度を設定するデータも提供しています。
 
あなたの使っているモニターや TV が正しい [[Wikipedia:EDID|EDID]] データを送信しない、またはそれに類似した問題が発生している場合、実効解像度が自動的に設定されなかったり全く画面が表示されなかったりすることがあります。カーネルには EDID のバイナリデータをロードする仕組みがあり、最も一般的な4つの解像度を設定するデータも提供しています。
   
もしあなたが EDID ファイルを持っているならば話は簡単です。持っていない場合、組み込まれている EDID バイナリ (もしくはカーネルコンパイルで生成するバイナリ、詳細は [https://www.kernel.org/doc/html/latest/admin-guide/edid.html 公式ドキュメント] を参照) のどれか一つを使うか自分で EDID を作って下さい。
+
もしあなたが 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}} 以下も探す方法もあります。
   
(例えばモニタの Windows ドライバから抽出したり {{Pkg|read-edid}} の {{ic|get-edid}} コマンドを使って取得した) EDID ファイルを持っている場合、{{ic|/usr/lib/firmware}} の下に {{ic|edid}} ディレクトリを作成して:
+
EDID ファイルを用意したのち、{{ic|/usr/lib/firmware}} の下に {{ic|edid}} ディレクトリを作成して:
   
 
# mkdir /usr/lib/firmware/edid
 
# mkdir /usr/lib/firmware/edid
90行目: 93行目:
 
それからバイナリを {{ic|/usr/lib/firmware/edid}} ディレクトリにコピーしてください。
 
それからバイナリを {{ic|/usr/lib/firmware/edid}} ディレクトリにコピーしてください。
   
起動時にロードするために、カーネルコマンドラインで次を指定してください:
+
起動時にロードするために、[[カーネルコマンドライン]]で次を指定してください:
   
 
drm_kms_helper.edid_firmware=edid/your_edid.bin
 
drm_kms_helper.edid_firmware=edid/your_edid.bin
  +
  +
Linux 4.15 以降では EDID 情報をヘルパーを使わずに直接設定できます:
  +
drm.edid_firmware=edid/your_edid.bin
   
 
特定の接続だけで使うように指定することも可能です:
 
特定の接続だけで使うように指定することも可能です:
117行目: 123行目:
 
|}
 
|}
   
KMS を初期に実行するようにしている場合は、カスタム EDID ファイルを initramfs に含めないと起動時に問題が発生します。
+
[[#Early KMS start|KMS を初期に実行]]するようにしている場合は、カスタム EDID ファイルを initramfs に含めないと起動時に問題が発生します。
 
また、カーネルの {{ic|Documentation/EDID}} ソースに含まれている makefile を使って自分で EDID を組み立てることもできます。完全な情報は [https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/EDID/HOWTO.txt ここ] や [https://www.osadl.org/Single-View.111+M5315d29dd12.0.html そこ] で読めます。
 
   
 
{{Warning|以下の方法は不完全です。Xorg は指定された解像度を使用しなかったりします。上の方法を使うことを推奨します。ただし {{ic|1=video=}} コマンドラインで解像度を指定するのは場合によっては役立ちます。}}
 
{{Warning|以下の方法は不完全です。Xorg は指定された解像度を使用しなかったりします。上の方法を使うことを推奨します。ただし {{ic|1=video=}} コマンドラインで解像度を指定するのは場合によっては役立ちます。}}
133行目: 137行目:
 
video=<conn>:<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
 
video=<conn>:<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
   
*<conn>: コネクタ、例: DVI-I-1。利用できる接続は {{ic|/sys/class/drm/}} を見て下さい。
+
*{{ic|<conn>}}: コネクタ、例: DVI-I-1。利用できる接続は {{ic|/sys/class/drm/}} を見て下さい。
*<xres> x <yres>: 解像度
+
*{{ic|<xres> x <yres>}}: 解像度
*M: compute a CVT mode?
+
*{{ic|M}}: compute a CVT mode?
*R: reduced blanking?
+
*{{ic|R}}: reduced blanking?
*-<bpp>: 色深度
+
*{{ic|-<bpp>}}: 色深度
*@<refresh>: リフレッシュレート
+
*{{ic|@<refresh>}}: リフレッシュレート
*i: インターレース化 (non-CVT mode)
+
*{{ic|i}}: インターレース化 (non-CVT mode)
*m: 余白
+
*{{ic|m}}: 余白
*e: 出力強制 ON
+
*{{ic|e}}: 出力強制 ON
*d: 出力強制 OFF
+
*{{ic|d}}: 出力強制 OFF
*D: デジタル出力強制 ON (e.g. DVI-I connector)
+
*{{ic|D}}: デジタル出力強制 ON (e.g. DVI-I connector)
   
"video" を使うことでアウトプットのモードを上書きすることができます、例えば、DVI 出力、1024x768、85 Hz、TV 出力オフに強制するには:
+
{{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
   

2020年10月2日 (金) 14:40時点における版

関連記事

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

Linux カーネルの KMS 機能ではフレームバッファでのネイティブ解像度や素早いコンソール (tty) 切り替えができるようになります。KMS を使うと、歪みを消去したり 3D パフォーマンスの上昇、カーネル空間の電力節約などをもたらす新しい技術 (DRI2 など) が有効になります。

ノート: プロプライエタリの NVIDIA ドライバ (364.12 以上) にもカーネルモードセッティング機能はありますが、カーネル固有の機能は使っていないため、高解像度コンソールのための fbdev ドライバがありません。

背景

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

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

インストール

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

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

Late KMS start

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

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

プロプライエタリの AMD Catalyst ドライバはオープンドライバスタックを使いません。KMS を使うにはオープンソースの AMDGPU ドライバ (古いビデオカードなら ATI ドライバ) に変えてください。

Early KMS start

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

通常 KMS は initramfs ステージよりも後に初期化されます。起動中にできるだけ早く KMS をロードするには、依存するモジュールを /etc/mkinitcpio.confMODULES 行に追加します。

  • amdgpu AMDGPU ドライバー向け
  • radeon ATI ドライバー (古いモデル向け)
  • i915 Intel 内蔵グラフィック向け
  • nouveau Nouveau オープンソースドライバー向け
  • mgag200 Matrox グラフィック向け
  • QEMU のグラフィック出力を使う場合: virtio-gpu VirtIO 用、qxl QXL 用、cirrus Cirrus 用

例えば、Intel 内蔵グラフィックドライバーを利用し、KMS を早期に有効化させるには:

/etc/mkinitcpio.conf
MODULES=(... i915 ...)
ノート: Intel ユーザーは ACPI のエラーを出さないために i915 の前に intel_agp を追加する必要があるかもしれません。ディスプレイ設定を変更してハイバネートから復帰する場合は必須になります。

(生来の解像度に当てはまらない) カスタム EDID ファイルを使っている場合、同じように initramfs に埋め込む必要があります:

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

その後カーネルイメージを再生成してください (詳しくは mkinitcpio を参照して下さい):

# mkinitcpio -p <カーネルプリセットの名前; 例 linux>

トラブルシューティング

フォントが小さすぎる

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

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

ブートロードの問題と dmesg

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

起動中に 0x00000010 (2) のエラーコードが表示される場合 (10行近く表示され、最後にエラーコードが含まれているでしょう)、/etc/modprobe.d/modprobe.conf に次の行を加えて下さい:

options drm_kms_helper poll=0

モードの強制と EDID

あなたの使っているモニターや TV が正しい EDID データを送信しない、またはそれに類似した問題が発生している場合、実効解像度が自動的に設定されなかったり全く画面が表示されなかったりすることがあります。カーネルには EDID のバイナリデータをロードする仕組みがあり、最も一般的な4つの解像度を設定するデータも提供しています。

もしあなたが EDID ファイルを持っているならば話は簡単です。持っていない場合、組み込まれている EDID バイナリのどれか一つを使うか自分で EDID を作って下さい。 モニタが Windows で正常に動作しているなら そのドライバから抽出したり read-edidget-edid コマンドを使って EDID ファイルを取得するほうが簡単です。 あるいは、カーネルのコンパイル時に様々な解像度・設定の EDID ファイルを作成できます。方法については カーネルのドキュメント簡易なガイドを参照してください。 さらに、/sys/class/drm/*/edid 以下も探す方法もあります。

EDID ファイルを用意したのち、/usr/lib/firmware の下に edid ディレクトリを作成して:

# mkdir /usr/lib/firmware/edid

それからバイナリを /usr/lib/firmware/edid ディレクトリにコピーしてください。

起動時にロードするために、カーネルコマンドラインで次を指定してください:

drm_kms_helper.edid_firmware=edid/your_edid.bin

Linux 4.15 以降では EDID 情報をヘルパーを使わずに直接設定できます:

drm.edid_firmware=edid/your_edid.bin

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

drm_kms_helper.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 に含めないと起動時に問題が発生します。

警告: 以下の方法は不完全です。Xorg は指定された解像度を使用しなかったりします。上の方法を使うことを推奨します。ただし video= コマンドラインで解像度を指定するのは場合によっては役立ちます。

the nouveau wiki より:

カーネルコマンドラインから強制的にモードを選ぶこともできます。残念ながら、DRM に関するコマンドラインオプションはあまりドキュメント化されていません。使い方の簡単な説明はここにあります:

フォーマットは:

video=<conn>:<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
  • <conn>: コネクタ、例: DVI-I-1。利用できる接続は /sys/class/drm/ を見て下さい。
  • <xres> x <yres>: 解像度
  • M: compute a CVT mode?
  • R: reduced blanking?
  • -<bpp>: 色深度
  • @<refresh>: リフレッシュレート
  • i: インターレース化 (non-CVT mode)
  • m: 余白
  • e: 出力強制 ON
  • d: 出力強制 OFF
  • D: デジタル出力強制 ON (e.g. DVI-I connector)

video= を使うことでアウトプットのモードを上書きすることができます、例えば、DVI 出力、1024x768、85 Hz、TV 出力オフに強制するには:

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 ページを見て下さい。