HOWTO:Linux で複数の XFree ローカルユーザー
著者: Linux HOWTO オリジナル版を読む プリンター用 記事を転送
▼2001年8月25日 00:00 付の記事
■海外internet.com発の記事
Linux で複数の XFree ローカルユーザー
Miguel Freitas による V.0.9 <
miguel@cetuc.puc-rio.br>
January 16, 2001
キーワード(ロボット用)
google や hotbot などでこの種のドキュメントを見つけようとして、
時間を無駄にしてしまった。
検索を試みる時、以下のキーワードを追加するといい。
true dual-head、multi-user support、
XFree86 4.0、multiple keyboard、multiple mouse、multiple video card、
dual userXFree86 instances、dual keyboard、USB keyboard under X などだ。
きっかけ
僕にはガールフレンドが1人いるんだけど、コンピュータは1台しかない。
コンピュータには処理能力は十分にあるのに、
このままだと二人一緒に使えない。
スペアのモニターと 3D ゲーム(ブードゥー)用のセカンドビデオカードがあったので、
アイディアがひらめいた。
新しい XFree86 4.0 はデュアルヘッドに対応しているので、
一番大変な部分は解決済みだ。
これを Linux に載せればいいのだ。
公開された OS なら、必要に応じて変更できるはずだ。
便利でコストがかからないことから、
Linux は教育機関や教育プロジェ<クトで使われ、成功している、という報告がいくつかある。
1台のコンピュータを複数の学生や作業者が使うと、
さらにコストは低くなる。
また、資源(マザーボード、プロセッサ、ハードディスク)が共有されているので、
その管理やアップグレードが簡単になるというおまけ付きだ。
「動作が遅くならないだろうか」と思うかもしれないが、そんなことはない。
パフォーマンスの違いはほんのわずかで、
そのほとんどが、コンピュータがユーザーからのコマンドを待っている時間だ。
コンピュータのパワーはありあまっている。
たいていのユーザーはワードプロセッサを使ったり Web サーフィンをするだけなのに、
ギガヘルツの Pentium 3 マシンが必要だろうか。
問題
複数の XFree インスタンス(とユーザー)をサポートするには、
解決しなければならない問題がいくつかある。
- VT 操作 − Linux カーネル の バーチャル端末スキームは、
かつてのすごい道具だ。
昔は画面を複数持つのによく使われたが、
だが、完全に書き直したほうがいい
(数人の Linux 開発者が 2.5.x シリーズ用にもっといいスキームを開発しようとしている)
代物になった。
主に問題になるのは、
VT コードは、複数の入出力デバイスがあるかもしれない、ということを理解しないことだ。
だから、入出力デバイスは完全に独立している。
各ハードウェアにとっては VT の既存のセットを連携させる方法がないので、
Linux カーネルはどの VT が同時に使えるか分かるだろう。
XFree86 のインスタンスを複数発行すると、
インスタンスはそれぞれ異なった VT 上にあり、
Linux カーネルはインスタンスに、すべての VT 切り替えを知らせる。
切り替えられた(グラフィックな)VT はハードウェアを使用するはずがない。
通常、ほかのアクティブな VT に干渉するからだ。
しかし、独立した2枚のビデオカードとなると、話は違う。
-
キーボード サポート − X 上の複数のマウスは、
それぞれ「デバイス」オプションを指定できるので、
すでに存在している。
不幸なことに、キーボードドライバはまだ XFree86 コアに深く根づいていて、
分離したモジュールではなく、
コンソールのスキャンコードを読み取る I/O 機能にアクセスする。
各 XFree86 インスタンスには VT 切り替えで停止したキーボードアクセスがある。
その上 Linux はまだはっきりとは複数のキーボードに対応していない。
どうなるかは 2.5.x ツリーを待たなければならない…。
解決法
僕のやり方が一番いいわけでは無論ない。
デュアルヘッド(とデュアルインプット)を XFree86 に実装し、
Linux カーネルにすっきり対応させる方法は何千とある。
しかし、僕の場合はこれだったのだ。
前もって言っておくけれど、
ビデオカード、モニター、キーボード、マウスを買うのに時間とお金を使ったあげく、
うまくいかなかったとしても、僕を責めないでくれ。
XFree86 が同時に複数のレイアウト(別のインスタンスを使わず)
とブランド品の新しいキーボード ドライバをサポートしたらいいなとは思ったが、
どうしてもそれを自分で実装するほどのことだとは思わなかった。
いずれにしろ、このすばらしいソフトウェアを作った XFree86 開発者には敬意を表したい。
僕のアイディアは、XFree86 のインスタンスを2つ持つことだ。
最初のインスタンスは、通常の XFree86 サーバーを使い、
メインビデオカードを初期化し、
VT に付ける。
また、マウスと同様、標準システム AT キーボードや何か
(PS/2、シリアル、PS/2 エミュレート USB、その他何でも好きなもの)を使う。
2番目の XFree インスタンスは 変更された X サーバーだ。
VT 切り替えにまったく対応していない。
なぜなら、
その他のどの VT も通常使用しないハードウェアを制御するのに使われているからだ。
ここが肝心なんだけど、
ビデオカードはプライマリにはなれない、
マウスは gpm が使うものと同じものではないし、
キーボードは USB でなければならないが、
スキャンコードを通常の Linux コンソールに生成してはいけない!
キーボードは通常の AT キーボードのようには見えない(標準コンソールに対するキーがない)ので、
変更された X サーバーのキーボードドライバが、
通常のスキャンコードへ翻訳する USB イベントの面倒を見なければならない。
手順(地道に)
1) XFree 4.0.x(RedHat 7.0 や最新のディストロに付属)を入手し、
ビデオカード2枚とモニター2台用に設定する必要がある。
まず、以下の HowTo 通りに Xinerama 拡張で試してみることを薦める。
http://linuxdocs.org/HOWTOs/Xinerama-HOWTO.html
それから、XF86Config あるいは XF86Config-4 を変更して、
Xinerama 拡張がなくても、画面を2つのレイアウトに分離できるようにする。
次に、XF86Config を読み込んで
「man XF86Config」を実行する。
2つのレイアウトで、XF86Config は以下のようになるはずだ。
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0"
InputDevice "Mouse0" "CorePointer"
InputDevice "Keyboard0" "CoreKeyboard"
EndSection
Section "ServerLayout"
Identifier "Layout1"
Screen 0 "Screen1"
InputDevice "Mouse0" "CorePointer"
InputDevice "Keyboard0" "CoreKeyboard"
EndSection
Section "InputDevice"
Identifier "Keyboard0"
Driver "keyboard"
# this is for supporting deadkeys
Option "XkbRules" "xfree86"
Option "XkbModel" "us"
Option "XkbLayout" "br"
EndSection
Section "InputDevice"
Identifier "Mouse0"
Driver "mouse"
Option "Device" "/dev/mouse"
Option "Protocol" "IMPS/2"
Option "Emulate3Buttons" "off"
Option "ZAxisMapping" "4 5"
EndSection
Section "Monitor"
Identifier "Plex17"
VendorName "Unknown"
ModelName "Unknown"
HorizSync 31.5 - 79.0
VertRefresh 50-90
EndSection
Section "Monitor"
Identifier "Syncmaster3"
HorizSync 31.5 - 79.0
VertRefresh 50-70
EndSection
Section "Device"
Identifier "FireGL 1000 PRO"
Driver "glint"
BusID "pci:1:0:0"
BoardName "Unknown"
EndSection
Section "Device"
Identifier "Voodoo"
Driver "glide"
BusID "pci:0:12:0"
EndSection
Section "Screen"
Identifier "Screen0"
Device "FireGL 1000 PRO"
Monitor "Plex17"
DefaultDepth 16
Subsection "Display"
Depth 16
Modes "1024x768"
EndSubSection
EndSection
Section "Screen"
Identifier "Screen1"
Device "Voodoo"
Monitor "SyncMaster 3"
DefaultDepth 16
SubSection "Display"
Depth 16
Modes "800x600"
EndSubSection
EndSection
Xinerama コンフィギュレーションとほとんど同じで、ただレイアウトが2つあるだけなので、
どうということもない。
それからコンピュータを runlevel 3
(init 3) に切り替え、
両方のレイアウトを、一度に1つずつを試してみる。
# XFree86 -layout Layout0
# XFree86 -layout Layout1
HOWTO に書かれてあるように、BusID の設定に注意。
デュアルヘッドボード(Matrox G400 のような)は次の段階ではうまくはずがない。
同じマシンに語りかける 2つのインスタンスを使うからだ。
自分では試したことはないけれど
(読者の誰かがこんなビデオカードを寄付してくれれば、
喜んでやってみる)。
ビデオカードが全部 XFree86 デュアルヘッド対応で使えるわけではない。
ここでカードがうまく働かなくても、そんなことをメールして来ないで、
その代わり、Xinerama HowTo を読もう。
2)
システムのセカンドマウスを差し込み、
XF86Config を設定して、2番目のレイアウトで使えるようにする。
このマウスは、gpm のようにほかのどのプログラムも使わない。
XF86Config は以下のようになる(変更された部分のみ)。
Section "ServerLayout"
Identifier "Layout1"
Screen 0 "Screen1"
InputDevice "Mouse1" "CorePointer"
InputDevice "Keyboard0" "CoreKeyboard"
EndSection
Section "InputDevice"
Identifier "Mouse1"
Driver "mouse"
Option "Device" "/dev/ttyS1"
Option "Protocol" "Microsoft"
EndSection
もう一度、このレイアウトをテストし、
動作を確認しよう。
3)
Linux Kernel 2.4.0 を入手すれば、
USB に対応できる。
2.2.x カーネルのいくつかは、
USB 対応をバックポートしているので、
動くと思うが、
疑わしいので 2.4.0 でやったほうがいい。
カーネルのコンフィギュレーションで、
USB 対応(CONFIG_USB)とキーボード
(USB マウス対応にする必要がなければ、CONFIG_USB_HID か CONFIG_USB_KBD のどちらか)
を使えるようにする。
「input core support」(CONFIG_INPUT)が使えるようにしなければならないが、
「keyboard support」(CONFIG_INPUT_KEYBDEV)が使えるようにしてはならない。
USB のやつをシステムのキーボードにしたくないからだ。
スキャンコードを受け取るのに使うので、「event interface」も使えるようにする。
カーネルをコンパイルし、インストールする。
USB キーボードを差し込む。
カーネルがいったん入ると、
USB キーボードからの入力はコンソールで確認できないはずだ。
キーボードイベント(キーボードが唯一の USB でバイスだと仮定する)を読み込んでみよう。
# cat /dev/input/event0
画面上には入力したガーベッジが見えるはずだ。
それでいい。キーボードは動いている。
何も見えず、「そういうデバイスはない」というメッセージが出たら、
USB システムに不具合がある。
詳しいことはカーネルソースにあるドキュメントを読めば書いてある。
4) まだ持っていないなら、XFree86 4.0.x のソースを入手しよう。
ソースは
www.xfree86.org
から手に入る。
3個か4個の大きな .tgz ファイルがあるが、最初の1個があればいい。
ツリーを展開し、僕のパッチを当てよう。
パッチは、
ここ (4.0.1)と
ここ (4.0.2)
からダウンロードできる。
パッケージの指示に従って X サーバーを構築する
( make World)。
xc/programs/Xserver ディレクトリに実行可能な新しい XFree86 ができる。
それを /usr/X11R6/bin に別名(XFree86-2nd のような)でコピーする。
あるいはもっと簡単に、僕の XFree86-2nd サーバー(compiled against glibc-2.1)を試してみよう。
XFree86-4.0.1-2nd.gz
XFree86-4.0.2-2nd.gz
このサーバーは USB キーボードにしか対応せず、VT はつかめない。
唯一の VT コードは
XFree86-2nd vtxx パラメータを介して
既存のコンソールに切り替えるものだ。
パッチを当てるのはこのスキームを改良できる開発者を当てにしている。
数百メガバイトのデスク容量が必要だ。
僕の X サーバーが読者のシステムでうまくいかない場合は、僕にできることはほとんどない。
もし皆さんでできるなら、問題を発見し、修復を試みてほしい。
5)
セカンドレイアウトを変更し、USB キーボードを使おう。
これには、僕が作った「usbev」が必要なので、デバイス同様 /dev/input/eventx を指定する。
XF86Config は以下(変更部分のみ)のようになるはずだ。
Section "ServerLayout"
Identifier "Layout1"
Screen 0 "Screen1"
InputDevice "Mouse1" "CorePointer"
InputDevice "Keyboard1" "CoreKeyboard"
EndSection
Section "InputDevice"
Identifier "Keyboard1"
Driver "keyboard"
Option "Protocol" "usbev"
Option "Device" "/dev/input/event0"
EndSection
コマンドでこの X サーバーを試してみよう。
# XFree86-2nd -layout Layout1
セカンドビデオカードとセカンドマウス、USB キーボードを、
コンソールに邪魔されずに初期化しなければならない。
稼働中の X サーバーの xterm ウィンドウからでさえできる。
そう! うまくいく! それでは、いよいよお終いは…。
6) gdm をディスプレイマネージャとして使っていて、グラフィカルログインができる場合は、
/etc/X11/gdm/gdm.conf ファイルを以下のように編集できる。
[servers]
0=/usr/bin/X11/XFree86-2nd -delay -layout layout1 vt07
1=/usr/bin/X11/X vt07
これを動作させるのは大変だ。
安定した設定にするまで何回も失敗した。
「-delay」オプションを追加しなければならなかったので、
それがサーバーのひとつに10秒の遅延を引き起こし、同時にハードウェアを初期化することができなかった。
どうしてこれが必要なのか分からない。
初期化される順番(0= と 1= を変更)を扱うのもトリッキーだ。
よく知られたバグ
これは僕のテキストコンソールに干渉するので、
テキストをよく見えるようになるまで、VT 間を数回切り替えなければならない。
一番の問題は、ここに書いた全部がほかのハードウェアでは動作しないかもしれないので、
これを全部読んでも時間の無駄になるかもしれないのだ。
しかし、アイディアはあるし、
僕の場合にはうまくいったという保証はある。
どこかの開発者がすぐに解決してくれるといいいのだけれど。
更新
Price study
Brad Midgley は、Matrox G400 などのデュアルヘッドカードのサポートは、
フレームバッファ インターフェイスを使えばできる、と指摘している。
これについてテストするハードウェアがまだないが、
読者がもしテストする場合は、
init ルーチンからフレームバッファにとって重要なものは移動することを注意してほしい。
どうか、パッチにあるかもしれない間違いを調べてほしい。
この問題に関する更新を歓迎する…。
連絡先
Miguel Freitas
<miguel@cetuc.puc-rio.br
>
Center for Telecommunications Studies of the
Catholic University of Rio de Janeiro (CETUC/PUC-Rio)
Brazil
関連テーマ USB
Google
|