Uvesafb
他のフレームバッファドライバーと違って、uvesafb は v86d と呼ばれるユーザースペースの仮想化デーモンを必要とします。x86 の上で x86 のコードをエミュレートするのは馬鹿げているようにも見えますが、他のアーキテクチャでフレームバッファコードを使用したいという場合に大事になります (特に x86 以外のアーキテクチャ)。カーネル 2.6.24 では新しいフレームバッファドライバーが追加されました。標準の vesafb よりも多くの機能が存在します:
- 遅延時間後の正しいブランクとハードウェアの復帰
- システム BIOS のようにカスタム解像度をサポート。
vesafb と同じ数だけのハードウェアをサポートします。
目次
インストール
システムの準備
フレームバッファ関連のカーネルブートパラメータは全てブートローダーの設定から削除して vesafb フレームバッファがロードされないようにしてください。
$ grep vga /proc/cmdline $ grep -ir vga /etc/modprobe.d/
上記のコマンドで何も返ってこないようにする必要があります。vga=
オプションを記述している場合は、削除してください。
GRUB
まず /etc/default/grub
を編集して GRUB_GFXPAYLOAD_LINUX=keep
行をコメントアウトしてください。
そして標準のスクリプトを使って grub.cfg
を再生成します:
# grub-mkconfig -o /boot/grub/grub.cfg
GRUB legacy
uvesafb が正しく動作するように /boot/grub/menu.lst
の kernel 行から vga=xxx
という記述を全て削除してください。
Systemd
systemd を使っている場合、v86d フックを /etc/mkinitcpio.conf
の HOOKS に追加します。これで uvesafb が起動時に動くようになります。
HOOKS="base udev v86d ..."
uvesafb の設定
解像度の定義
uvesafb の設定は /usr/lib/modprobe.d/uvesafb.conf
で定義します:
# This file sets the parameters for uvesafb module. # The following format should be used: # options uvesafb mode_option=<xres>x<yres>[-<bpp>][@<refresh>] scroll=<ywrap|ypan|redraw> ... # # For more details see: # https://www.kernel.org/doc/Documentation/fb/uvesafb.txt # options uvesafb mode_option=1280x800-32 scroll=ywrap
mode_option
のドキュメントは linux.git/tree/Documentation/fb/modedb.txt にあります。
パッケージが更新されたときにカスタマイズした設定が上書きされないように、ファイルを /etc/modprobe.d/uvesafb.conf
にコピーしてください:
# cp /usr/lib/modprobe.d/uvesafb.conf /etc/modprobe.d/uvesafb.conf
そして /etc/mkinitcpio.conf
の FILES セクションのエントリに設定ファイルを追加します:
FILES="/etc/modprobe.d/uvesafb.conf"
変更を適用するにはカーネルの initramfs イメージを再生成する必要があります。
# mkinitcpio -p linux
システムを再起動して変更が適用されたか確認してください。
解像度の最適化
次のコマンドを使うことで使用できる解像度を全てリストアップできます:
$ cat /sys/bus/platform/drivers/uvesafb/uvesafb.0/vbe_modes
返ってきたエントリを使って /usr/lib/modprobe.d/uvesafb.conf
を修正しましょう。
現在の解像度のチェック
以下のコマンドを使うことで現在のフレームバッファの解像度を表示できます。設定が反映されているかどうか確認するのに使ってください:
$ cat /sys/devices/virtual/graphics/fbcon/subsystem/fb0/virtual_size
$ cat /sys/class/graphics/fb0/virtual_size
Uvesafb をカーネルに組み込む
自分でカーネルをコンパイルする場合、カーネルに uvesafb を組み込んで /etc/rc.local
などから v86d を実行することができます。この場合、オプションは video=uvesafb:<options>
という形式でカーネルパラメータとして指定します。下で書かれているように uvesafb と 915resolution を組み合わせるときはこの方法を使うことはできないので注意してください。
Uvesafb と 915resolution
以下では、より複雑なシナリオについて説明します。ワイドスクリーンラップトップ用の多くのインテルビデオチップセットには、バグのあるBIOSが搭載されていることが知られています。これは、ワイドスクリーンのメインのネイティブ解像度をサポートしていません。このため、ブート時にBIOSにパッチを適用し、Xサーバーがワイドスクリーンの解像度を使用できるようにするために、915resolutionが作成されました。今日、Xサーバーは915resolutionの助けなしでこれを行うことができます。ただし、915resolutionをuvesafbと組み合わせると、Xを起動することなく、ワイドスクリーンフレームバッファーを取得できます。この場合、915resolutionを実行した後でuvesafbをロードして、uvesafbが適切な解像度に頼れるようにする必要があります。
915resolution-static
このシナリオでは、915解像度を静的にコンパイルする必要があります(initramfsに置かれるので、外部ライブラリにリンクすることはできません。)。したがって、 [community] リポジトリで915 resolutionパッケージを使用することはできません。代わりに、AURで915resolution-staticAUR アーカイブ: 915resolution-static aur-mirror}}を探してください。 これは915解像度を静的にコンパイルし、915解像度フックを提供しますので、uvesafbをロードする前に915解像度を実行して、パッチされた解像度を得ることができます。makepkgとpacmanを使って915 resolution-staticをインストールしてください。
解像度
交換するBIOSモードと取得する解像度を定義するには、915resolutionフックを編集する必要があります。あなたは915resolutionのすべてのオプションについての情報を得ることができます。
$ 915resolution -h
/lib/initcpio/hooks/915resolution
を編集して915resolutionのオプションを変更します。
run_hook () { msg -n ":: Patching the VBIOS..." /usr/sbin/915resolution 5c 1280 800 msg "done." }
デフォルトとして、5cは、置き換えるBIOSモードのコードです。次のコマンドを使用して、使用可能なBIOSビデオモードのリストを取得できます 915resolution -l
HOOKS
915resolutionフックを追加し、その後、 /etc/mkinitcpio.conf
のHOOKSにv86dフックを追加します。keymap、resume from suspension、をfilesystemのフックの前に置きます。
HOOKS="base udev 915resolution v86d ..."
次に、mkinitcpioを使用してinitramfsを再生成する必要があります(次のコマンドを設定に合わせて調整してください)
mkinitcpio -p linux
トラブルシューティング
Uvesafb cannot reserve memory
vga=xxx
カーネルパラメータを削除するのを忘れてないか確認してください -- この設定が残っていると UVESA フレームバッファが標準の VESA フレームバッファで上書きされてしまいます。
もしくは video=vesa:off vga=normal
をカーネルコマンドラインに追加してください。
Error: "pci_root PNP0A08:00 address space collision + Uvesafb cannot reserve memory"
これは2.6.34-ARCHカーネルを搭載したAcer Aspire One 751hで発生します。他のシステムでも発生するかどうかは不明です。別のフレームバッファーがuvesafbのセットアップに干渉しない場合でも、uvesafbは必要なメモリー領域を予約できません。
この問題は、ブートローダーの設定でカーネルパラメータに以下を追加することで修正できます。
pci=nocrs