次のページ 前のページ 目次へ

14. multi-headed フレームバッファを使う

この部分は Frederick A. Niles によって心よく提供されました。彼は HOWTO のこの章に添付した情報にすべての権利を有しています。

14.1 はじめに

この文書のおもな目的は、Linux で dual head configuration を動かすため のものです。この作業はとても道筋がはっきりしているのですが、落とし穴が たくさんあります。

私が対象にした例では、二番目のモニターで X サーバを動かしていま す。これがすばらしいのは、使えないので捨てられた古くて大きな 19インチ から 21インチ の固定周波数モニターはごく普通に見つかるからです。 こんな風にして小型マルチシンクを捨てて、素敵な大きなモニターで X を 使うようにできるのです。

dual head support は現在開発中ですから、この情報はすぐに変更になること を理解しておいてください。この文書中のあることは古くなるか、あなたがこ れを読む時期によっては正しくないこともあるでしょう。

** 注意 ** この文書は XFree86 4.0 のリリース以前に書かれました。この文 書を読んでいるなら、XFree86 4.0 はすでにリリースされており、多くの ことが変更されています。利用するならこの文書の最新版を入手してくだ さい。

14.2 フィードバック

この文書についてのフィードバックはもちろん歓迎です。みなさまの提案と協 力なしには、この文書は存在しなかったでしょう。追加すべきことやご意見、 評価を次のアドレス宛どうぞ投稿してください。 Frederick.A.Niles@gsfc.nasa.gov

14.3 貢献を頂いた方々

次の方々はこの mini-HOWTO に貢献してくださいました。

* Petr Vandrovec vandrove@vc.cvut.cz

* Andreas Ehliar ehliar@lysator.liu.se (x2x)

* Marco Bizzarri m.bizzarri@icube.it (multiple X servers)

14.4 一般的な声明

この文書に書かれた内容については責任の義務は何もありません。書かれた内 容や、その他の内容を利用するときはあなた自身の責任で行ってください。こ の文書は最新版ですから、間違いがあったり、お使いのシステムに損害を与え るような間違いがあるかもしれません。めったに起こらないことですが、注意 して行ってください。私はそれらのことについてどんな責任も負いません。

14.5 著作権について

文書のこの章は (c)1999 Frederick Niles に著作権があり、次の取り決めの もとに配付されます。

○ Linux の HOWTO 文書は、物理的あるいは電子的などんなメディアでも、こ の著作権に関する注意がすべてのコピー物に残される限りは、全文、あるいは 一部分を複写し、再配付してもかまいません。商用での再配付は許可されてお り、推奨されていますが、著者はどのようなディストリビューションかを知ら せて頂きたく思います。

○すべての翻訳、配付作業、あるいは Linux HOWTO 文書を収集する作業は、こ の権利に関する注意のもとで行わなければいけません。すなわち、HOWTO から 派生する仕事やそのディストリビューションで追加制限をしてはいけません。 このような規則の例外はある種の条件のもとで許可されます。下記のアドレス の Linux HOWTO のコーディネーターと連絡を取ってください。

○質問があれば、 Linux HOWTO のコーディネーターに連絡してください。 linux-howto@sunsite.unc.edu

14.6 どんなハードウェアがサポートされているか

ほとんどのビデオカードは、システムにはひとつのみで基本のディスプレイア ダプタ用のアドレスに永続的に設定されているのは当然だと考えています。例 外がいくつかあります。

○ Matrox カード類:これには Matrox Millennium、 Matrox Millennium II、 Matrox Mystique、 Matrox Mystique 220、 Matrox Productiva G100、 Matrox Mystique G200、 Matrox Millennium G200 と Matrox Marvel G200 のカードがあります。

○ MDA: これにはモノクロ Hercules グラフィックアダプターなどがあります。

注意:上記のどれかひとつでなければいけないのは、第二アダプターだけです。

14.7 商用サポート

基本的にこの mini-HOWTO はフリーソフトウェアに関わるものです。 しかし、multi-head をサポートする商用の X サーバがあります。 Metro Link (www.metrolink.com)の Metro-X や Xi Graphics (www.xig.com)の Accelerated-X などがそうです。

14.8 必要なものを入手する

次のようなパッチやプログラムが必要です。

○ ''fbset''プログラム アクセスしてみてください: http://www.cs.kuleuven.ac.be/~geert/bin/ (注意:このプログラムは RedHat 6.0 に付属しています)

○ Linux カーネルに対する "fbaddon" Matrox dual head パッチ アクセスしてみてください: ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/

○ ''con2fb'' プログラム アクセスしてみてください: ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/

○ X11 のフレームバッファサーバ XF86_FBDev。 これは XFree86 3.3.1 の標準部品です。

14.9 始めよう

まずやらなければいけないことは''fbaddon''パッチで Linux のソース にパッチを当てることです。それから、カーネルのコンフィグレーションで frame buffer サポートを有効にしなければいけません。Matrox のカードを使っ ているなら、お使いのカードの特定の型はもちろん Matrox unified accelerated driver サポートを有効にします。VESA フレームバッファサポー トを有効にしてはいけません。それは衝突を起こします。multi-head サポー トを有効にします(当然ですよね)。カーネルを構築し再起動します。

''fbset'' プログラムをインストールし、設定を調整する方法について文書全体 を注意深く読まなくてはいけません。 fbset で行こうと決めたのなら、 "/etc/fb.modes" ファイルを使うことを強くおすすめします。 fbset プログラムは XF86Config ファイルを fb.modes に変換する Perl スクリプトを持っています。補足 A と B にお使いの XF86Config ファイル を変換するための私のoctave/Bourne シェルスクリプトがあります。

multi-head サポートをするしかないというあなたの設定が原因で起こるどん な問題も理解できるよう、ひとつのモニターでフレームバッファデバイスを 使う事 (設定) を十分理解しておかなければいけません。これで頭を掻きむ しる回数をずいぶん減らすことができます。

この文書では、二台目のモニターで X を動かすことについての説明に集中する つもりです。これは、多くの他のコンフィグレーションは単にこの手順の一部を 取り出すことに過ぎないからです。

コンソール上に移動

''con2fb'' プログラムをコンパイルします。何の問題もなく動くなら、次に示 すような使用方法についてのメッセージが出るでしょう。

''使い方: con2fb fbdev console''

例示されたコマンドは ''con2fb /dev/fb1 /dev/tty6'' のように使い、 二台目のモニターを仮想コンソール 6 にしてやります。 Ctrl-Alt-F6 というキーを使ってコンソールを操作すると、 第二モニター上に実際に画面が出てきます。

二台目のモニターでの設定を調節するため ''fbset'' を使う

モニターに ''fbset '' を設定する設定にだけ ''fbset''コマンドを使います。 つまり、二台目のモニターに ''-fb''フラッグ を使うのに注意しなければい けません。とりわけ、少なくとも実際の垂直像度に仮想垂直解像度を設定した いだけで、他のことはいじりたくないなら注意しなければいけません。

e.g. "fbset -fb /dev/fb1 -vyres 600"

これでテキストモードは劇的に遅くなりますが、 X はテキストモードのこと は気にしません。

フレームバッファサポートに対して X を設定する

framebuffer.txt ファイルは私がするよりももっとうまく説明していますが、 ここでは二つの重要なことを書いておきます。

''X'' に対して ''XF86_FBDev'' をリンクしているかを確認します。

次にフレームバッファデバイスについてお使いの XF86Config ファイルの モニターセクションを追加しなければいけません。 次に例を示します。

# The Frame Buffer server

Section "Screen"
    Driver      "fbdev"
    Device      "Millennium"
    Monitor     "NEC MultiSync 5FGp"
    Subsection "Display"
        Depth       8
        Modes       "default"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       16
        Modes       "default"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       24
        Modes       "default"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       32
        Modes       "default"
        ViewPort    0 0
    EndSubsection
EndSection

その他別のものについてはよくわからないので、''デフォルト''モードを使っ て、Matrox フレームバッファで動くでしょう。

二台目のモニターの X サーバを始動してみる

第二フレームバッファにさまざまなFRAMEBUFFER を設定する

''export FRAMEBUFFER=/dev/fb1'' または、 ''setenv FRAMEBUFFER /dev/fb1''

e.g. "startx -- :0 -bpp 16 vt06"

X サーバを起動すると、両方が選択したカラー depth に適合し、X サーバを 始動する同じモニター上に現れます。

この例は 18 ビットカラーで仮想コンソールの 6 上に''zeroth''X サーバー を始動します。その他のフレームバッファに対してもうひとつの X サーバを 出したときに'':1'' を使うと、二つの X サーバを動かすことができるように なります。

14.10 要約

第二モニターで X サーバを動かす方法は、次のように要約できます。

○ カーネルパッチ、fbset、con2fb を入手する。

○ カーネルにパッチを当て、コンフィギュア、再構築、再起動をする。

○ XF86Config ファイルに XF86_FBDev section を追加し、 X とリンクする。

それからいつものように再起動します。

○ コンソール上で動 たとえば、'' con2fb /dev/fb1 /dev/tty6 ''

○ 設定を調整する。 たとえば、'' fbset -fb /dev/fb1 1280x1024 ''

○ FRAMEBUFFER を設定 たとえば、'' export FRAMEBUFFER=/dev/fb1 ''

○ X サーバを起動する。たとえば、''startx -- -bpp 16 vt06''

別名シェルを通して再起動するたびにこれを自動化できます。現在のコンソー ル番号を決める必要があるのでシェルスクリプトではなく、 alias でなけれ ばいけません。これは二つ目の固定された周波数のモニターで X を始動させる C-シェルエイリアスです。

alias startxfb = "
setenv FRAMEBUFFER /dev/fb\!*;    # Set the env var to the cmd arg.
con2fb $FRAMEBUFFER /dev/$tty;    # Move the fb to the current tty.
fbset -fb $FRAMEBUFFER 1280x1024@62;  # Favorite from /etc/fb.modes
startx -- :\!* -bpp 16 vt0`echo $tty | cut -dy f 2`' # X on this tty.
"

私の .cshrc ファイルにはコメントをつけないで同じ行にすべてを書いていま すが、ここでは改行し、コメントをつけて読みやすくしています。私はフレー ムバッファの番号を変数として与えており、そうすると正しく始動します。

bash で同じエイリアスが動くかどうかはわかりません。bash で現在の tty を決定する方法、あるいはエイリアスに変数を得る方法はわかりません。もし どなたかが教えてくださればここに加えましょう。 しかし、現在の VT の名 称を得、それぞれの X サーバに二つに分離したエイリアスを作るために ''tty'' コマンドを使えます。

14.11 その他の注意と問題点

○ ''fbset''と''startx''の両方は、操作を行おうとしている同じ一つの フレームバッファから動かさなければいけません。 これが、これらのコマンドがスクリプトを通してどれくらい自動化できるか について重大な制約を課します。

○ XFree86 4.0 は正規の multi-head support を持っていますが、 3.3.1 ではサポートしていません。3.3.1 で二つのサーバを動かすことができ、 x2x を使ってそれらの間を切替えることができます。しかし、(次を見てください)

○ アクティブになっていないフレームバッファは、最後にアクティブになった ときのイメージを保持したままで、画面の更新は行われません。

○ 選択されなかったモニターは、非アクティブの時には状態を常に保持する わけではありません (通常は保持されますが)。

○ Geert Uytterhoeven(フレームバッファの維持者)と Linus Torvalds は、 現在の''frame buffer per VT''multi-head console support の変更(たとえ ばfbaddon)に同意していませんから、カーネルツリーの本流にはならないでしょ う。(これは第三者から聞いたことで本当ではないかもしれません。)

○ ''ルールを破って''違ったモニターから X サーバを始動するなら( ''startx'' を動かす)、結局のところマシンはキーボードやマウス入力もうまくいかなく なって壊れることでしょう。

○ カーネルソースに付属する framebuffer.txt 文書では、X を起動する時に 直接的に XF86Config ファイルで Modeline を設定できると説明しています。 Matrox フレームバッファを使うと、 X サーバを落してしまうように見えます。 そこで、同時にひとつだけ(''デフォルト'')を設定できます(もうひとつテキスト モードを持てます)。

○ XF86_FBDev は高速ではありませんが、 http://www.in-berlin.de/User/kraxel/xfree86/で高速の Matrox support に対するパッチがあります。

''init level 5 ''(たとえば xdm/gdm) を動かすようにする

私はまだ複数のモニター設定(そして、実際に二番目のモニターか、あるいは 両方のモニターにサーバがある)で、init level 5 で始動する方法で設定をし たことがありません。gdm/xdm Xservers ファイルに 1 行加えるだけで十分だと 思えますが、同じフレームバッファから X サーバを始動しなければならない とい制約のため、この簡単な解決法では動作しません。うまくいった 方がおられるなら、どうぞ私にお知らせください。ここに追加しましょう。

x2x プログラムを使う

スクリーンの接線を得るとき、X サーバを切り替える x2x という良くできた 小さなプログラムがあります。このプログラムの最新版は次のところにありま す: http://ftp.digital.com/pub/DEC/SRC/x2x/Debian パッケー ジの付属でもあります。私はまだ試していませんが、うまくいっているユーザ もあります。

その他役立つコマンド

multi-head configuration (とりわけスクリプトを書くときに)を扱うときに 覚えておく価値のある linux コマンドがあります。

○ ''chvt''は仮想ターミナル間で切り替えできるようにします。 ○ ''openvt''は新しい仮想ターミナル(VT)上でプログラムを始動させます。 ○ ''tty''は現在のターミナルの名前を表示します。

補足 A.

( bpp 設定の注意)

#!/usr/bin/octave -q
bpp = 16;
DCF = sscanf(argv(1,:), "%f");
HR  = sscanf(argv(2,:), "%f");
SH1 = sscanf(argv(3,:), "%f");
SH2 = sscanf(argv(4,:), "%f");
HFL = sscanf(argv(5,:), "%f");
VR  = sscanf(argv(6,:), "%f");
SV1 = sscanf(argv(7,:), "%f");
SV2 = sscanf(argv(8,:), "%f"); 
VFL = sscanf(argv(9,:), "%f");
pixclock = 1000000 / DCF;
left_margin = HFL - SH2;
right_margin = SH1 - HR;
hsync_len = SH2 - SH1;

# 3) vertical timings:
upper_margin = VFL - SV2;
lower_margin = SV1 - VR;
vsync_len = SV2 - SV1;

RR = DCF / (HFL * VFL) *1e6;
HSF = DCF / HFL * 1e3;

printf("mode \"%dx%d\"\n",HR,VR);
printf("   # D: %3.2f MHz, H: %3.2f kHz, V: %2.2f Hz\n", DCF, HSF, RR);
printf("   geometry %d %d %d %d %d\n", HR, VR, HR, VR, bpp);
printf("   timings %d %d %d %d %d %d %d\n", ...
                                 pixclock, left_margin, right_margin, ...
                                 upper_margin, lower_margin, ...
                                 hsync_len, vsync_len);
printf("endmode\n");

補足 B. Borne シェルスクリプト "cvtfile"

(これは octave スクリプト''cvtmode''を呼び出します。

[訳注:octave スクリプトとは、数値計算の処理系の GNU Octave 言語のことです。 詳細は次の URL 等でご確認ください。]

Octave Home Page

Octave History

#!/bin/sh
# Shell script to convert XF86Config file to fb.modes file.
# Uses octave script cvtmode.m

if [ -z $1 ]; then

  FILE=/etc/X11/XF86Config
else
  FILE=$1
fi

i=1
LEN=`grep Modeline $FILE | wc -l`
while expr $i \< $LEN > /dev/null ;
do
  CURLINE=`grep Modeline $FILE | cut -d'"' -f 3-20 | head -$i | tail -1 `
  ./cvtmode.m $CURLINE
  echo " "
  i=`expr $i + 1`
done


次のページ 前のページ 目次へ