Life with IT

山好きITエンジニア 木檜(こぐれ)和明 による発信の場

X Window System

2007/7/29更新

CPUの使用率が100%の時など、システムの負荷が高い時にまれにこのようなエラーになることがある。

2007/7/29更新

twm以外のウインドウマネージャを使用しているとこういうことが起こる時がある。

例えばtvtwmがそうである。

xwdをXのソースコードのcontrib/lib/vrootにあるvroot.hをインクルードするようにして再コンパイルする必要がある。

それば不可能な場合には別の手段でダンプを取る。

2007/7/29更新

-lsオプションなしで起動したxtermはログインシェルとして動作していないのでlogoutも実行できない。

その場合、exitコマンドで終了する。

2007/7/29更新

xtermはオプションを付けずにそのまま実行すると.cshrcしか実行しない。

これはxtermで起動されるシェルがログインシェルとして起動されないからである。

ログインシェルとして起動するためには-lsオプションを指定する必要がある。

% xterm -ls &

これはLoginShellというリソースでも指定できる。

XTerm*LoginShell: true

2007/7/29更新

.xinitrcや.xsessionファイルで一番最後に起動されたxtermを終了してしまった可能性がある。

X Window Systemは.xinitrcや.xsessionファイルに記述されている一番最後のクライアントが終了するとシステム全体を終了させる。

間違って終了しないようにxtermを-iconicオプションを付けて起動しておくか、一番最後に起動するクライアントをウインドウマネージャにするとよい。

2007/7/29更新

xonで指定したホストが落ちている場合にこのメッセージが表示される。

指定したホスト名を持つマシンが正常に動いているかどうかを確認する。

また、ネットワークが非常に混んでいる場合もある。

ネットワークが混んでいる場合には電話回線が混んでいる時に電話が繋がりにくいのと同様にどうしようもないので、しばらくしてから再度起動してみる。

2007/7/29更新

xonで指定したホストのホームディレクトリにあるシェル実行時ファイル(.cshrc等)に端末に関する設定(stty)や画面に表示する設定(echo)がされている。

これはxonが指定されたホストでクライアントを実行する前に設定ファイルの内容を実行するために起こる。

端末に関する設定(stty)や画面に表示する設定(echo)はログイン時設定ファイル(.login等)で行うようにする。

2007/7/29更新

以下のような原因が考えられる。

原因1

xonで指定したコマンドを実行しようとするホストに自分のアカウントがない。

対策

xonで指定したホストには自分のアカウントが必要である。

rloginやsshコマンド等を用いてそのホストにログインできるかどうか確認すること。

原因2

.rhosts にホスト名が指定されていない。

対策

これは、指定したホストにアカウントがあるにもかかわらず「Permission denied」と表示される場合である。

まず、前述のようにrloginコマンドでそのホストにログインしてみてパスワードを聞かれたらこのエラーメッセージの原因は指定したホストのホームディレクトリの.rhostsにある。

myhost% rlogin yourhost
Password:

このような場合にはxonで指定したホストのホームディレクトリにある.rhostsにxonを実行するホスト名を書いておけばよい。

上記の例ではyourhostのホームディレクトリの.rhostsにmyhostと指定すればよい。

yourhost% cat ~/.rhosts
myhost

きちんと設定できたかどうかは再びそのホストにrloginすれば確認できる。

パスワードを聞かれなくなったらOKである。

2007/7/29更新

xloadの実行パーミッションが正しく設定されていない。

xloadは/dev/kmemという特殊なファイルを読み込んで内容をグラフに変換し表示している。

通常/dev/kmemのパーミッションは

crw-r-----  1 root  kmem    2,   1  7 27 11:03 /dev/kmem

である。

このためxloadの所有者がrootでグループが/dev/kmemと同じ(この場合kmemグループ)でなくてはならない。

そうでない場合はスーパーユーザーになってxloadのパーミッションを変える必要がある。

# chown root xload
# chgrp kmem xload
# chmod u+s xload
# ls -l xload
-r-s-r-x-r-x 1 root kmem 28520 Mar 15 1993 xload

2007/7/29更新

xhostではマイナス(-)に続く文字列はホスト名として処理される。

xhostで-displayオプションを指定すると"display"という名前のホストをアクセスコントロールリストから削除することになる。

サーバを指定する場合にはDISPLAY環境変数を用いる。

2007/7/29更新

XDMCP

xdmでX端末を管理する際、通常はXDMCP(X Display Manager Control Protocol)というプロトコルを使用する。

X端末はXDMCPによるリクエストをリモートマシンに送るが、xdmの動いているマシンを見付けるには以下の3種類の方法をとることができる。

尚、ここではxdmが動いているマシンを便宜的にxdmサーバと呼ぶことにする。

ダイレクト要求

この方法はxdmサーバに直接リクエストを送る方法で、X端末から直接xdmサーバにXDMCPのリクエストを送る。常に同じxdmサーバを使用したい時はこの方法を使う。

ブロードキャスト要求

リクエストをブロードキャストしてxdmサーバを見付ける方法で、ダイレクト要求と違いXDMCPのリクエストをネットワークにブロードキャストする。

複数のxdmサーバがあれば全てのxdmサーバが返事をする。

どのxdmサーバを利用するかは「早いもの勝ち」で、最初に返事をしたxdmサーバが選ばれる。

インダイレクト(間接的な)要求

この方法はブロードキャスト要求を指定したxdmサーバに肩代わりしてもらう方法で、X端末から指定したxdmサーバにブロードキャスト要求を依頼する。

インダイレクト要求を受け取ったxdmサーバはchooserと呼ばれるプログラムを起動し、ネットワークに対してXDMCPのリクエストをブロードキャストする。

各xdmサーバから返事がくるとchooserは利用可能なxdmサーバのリストをX端末に送る。

X端末上には利用できるxdmサーバの一覧が表示されるので、利用したいxdmサーバをこの中から選ぶ。

選んだ後の処理はダイレクト要求の場合と同じである。

xdmの設定ファイル

xdmの設定ファイルは/usr/X11R6/lib/X11/xdm配下に置かれている。

% ls 
GiveConsole*  Xaccess     Xservers   Xsetup_0*  xdm-config
TakeConsole*  Xresources  Xsession*  chooser*

これらのファイルの内容は以下の通り。

GiveConsole,TakeConsole

xdmサーバのコンソール(/dev/console)をX端末のユーザに渡したり元に戻したりするためのスクリプト。

Xaccess

XDMCPによるアクセスをマシン単位で制御するための設定ファイル。

インストール時の状態ではどのマシンからのXDMCPリクエストも受け付けるような設定になっているが、これを変更することによりアクセス可能なマシンを制御できる。

Xresources

Xのリソースファイルで、ログイン画面の外見などをカスタマイズできる。

Xservers

XDMCPを使わない(あるいは使えない)X端末を管理するための設定ファイル。

ローカルマシンのログイン画面をxdmで管理する場合にも使われる。

Xsession

X端末にユーザがログインしたあとのセットアップを行うためのファイル。

ユーザのホームディレクトリに.xsessionファイルがあればXsessionの最後に実行する。

デフォルトの状態では.xsessionファイルがなければxtermが1つだけ起動される設定になっている。

Xsetup_0

ローカルマシンをxdmで管理する場合のログイン画面をセットアップするためのファイル。

デフォルトの状態ではxconsoleというプログラムが起動される。

chooser

X端末からのインダイレクト要求を受けて起動するchooserプログラム。

xdm-config

xdmが起動する際に利用する設定ファイルで、上記の設定ファイルの場所を指定したりXのauthorization機能を使う/使わないなどの設定ができる。

Xのauthorization機能は従来のxhostに代わるアクセス制御機能で、より細かくXサーバへのアクセスをコントロールすることができる。

2007/7/29更新

xclock、oclockを起動しているUNIXの管理する時刻が正しく設定されていない。

xclockやoclockはそれが起動されたマシンで設定されている時刻を表示している。

UNIXではdateコマンドで表示される時刻である。

つまり、この時間が正しく設定されていないとxclockやoclockも正しい時刻を表示しない。

正しくない場合にはスーパーユーザーになってdateコマンドを使って時刻を設定し直す必要がある。

尚、時間帯(time zone)が異なる場所(たとえば米国)で動いているマシンで起動したxclockの時間はローカルで起動したxclockの表示する時刻と異なるのは間違いではない。

2007/7/29更新

一部のウィンドウマネージャでは画面描画位置をウィンドウマネージャ自体で管理している場合があるのでこのような場合は-geometryオプションは無視される。

2007/7/29更新

twm以外のウインドウマネージャを使用しているとこういうことが起こることがある。

たとえばtvtwmがそうである。

X11R5のソースコードを持っている場合にはxsetrootのソースコードでXlib.hの後でXのソースコードのcontrib/lib/vrootにあるvroot.hをインクルードするようにして再コンパイルしてxsetrootを作り直す必要がある。

また、ssetrootというクライアントがある場合にはそれでルートウィンドウのパターンが設定できる。

2007/7/29更新

twmをウインドウマネージャとして使用している場合にこのようなことが起きる。

twmを動かしている状態ではクライアントで-bwオプションを指定しても表示されるウィンドウの境界線の幅は変わらない。

これはtwmがウィンドウの境界線の幅を管理しており、デフォルトではBorderWidth変数に指定された値の幅に統一しようとするからである。

このような場合には.twmrcファイルにClientBorderWidth変数を指定してtwmを再起動すればよい。

2007/7/29更新

.twmrcファイルに指定したメニューから「!」(またはf.exec)で起動するコマンドに「&」が付いていない。

このようなコマンドがあった場合には「&」を付けてバックグラウンドで起動されるように指定する。

twmは「!」でコマンドを起動するとそのコマンドが終了するまで待っている。

このため、実行がすぐに終わらないコマンドはバックグラウンドで実行し、twmがすぐに処理を再開できるようにする。

2007/7/29更新

.twmrcファイルにメニューが定義されていない可能性がある。

twmは.twmrcファイルがホームディレクトリにない状態では/usr/lib/x11/twm/system.twmrcファイルの内容を読み込んで起動する。

しかし、いったん.twmrcファイルがホームディレクトリに作られるとsystem.twmrcは読み込まず.twmrcファイルだけを読み込む。

.twmrcファイルを作成する場合にはまずsystem.twmrcファイルを.twmrcという名前でホームディレクトリにコピーしてからそれを変更していくようにするとよい。

2007/7/29更新

すでにウインドウマネージャが起動されている。

X Window Systemでは1つのXサーバに対して1つのウインドウマネージャしか起動できない。

自分が使用しているXサーバに対して他にウインドウマネージャが起動されていないかを調べて、以下のようにkillコマンドで終了させてからもう一度twmを起動させてみる。

% kill -9 <ウインドウマネージャのPID>

2007/7/29更新

表示できるマウスカーソルの大きさはベンダのXサーバに依存し、使用しているマシンのハードウェアの制限などから大きさに上限がある場合がある。

たとえばNECのEWS4800の場合は64x64より大きなカーソルは64x64の範囲だけしか表示されない。

2007/7/29更新

コンソールでXサーバを使用している場合にはデフォルトではクライアントが表示するメッセージはコンソール(つまりルートウィンドウ)に表示される。

.xinitrcや.xsessionファイルで起動しているxtermのうち1つに-Cオプションを指定すると、コンソールメッセージはそのxtermに表示されるようになる。

また、これ以外にxconsoleクライアントを使う方法もある。

ただし、X端末を使用していて他のマシンでxtermを起動している場合には-Cオプションを使用しない方がよい。

そのマシンのコンソールでXを使用しているユーザのxtermにコンソールメッセージが表示されなくなることがあるからである。

2007/7/29更新

Xサーバが終了時にキーボードの再設定に失敗している。

SUNなどでxinitで起動したXウィンドウシステムを終了させてコンソール画面に戻った時や異常終了した場合にキーボード入力がおかしくなることがある。

このような場合には別の端末からネットワークを介してそのマシンにログインし、以下のコマンドを実行すればよい。

% kbd_mode -a

2007/7/29更新

.xinitrcや.xsessionファイル内でxhostでホスト名をアクセスコントロールリストに登録しているのが原因である。

このメッセージはxhostが指定されたホストをアクセスコントロールリストに登録すると表示するものである。

つまり.xinitrcや.xsessionファイル内でxhostを実行しているために画面にメッセージが表示されてしまっている。

この問題を解決するためには以下のようにxhostのメッセージを/dev/nullにリダイレクトして捨ててしまうのが最も簡単な解決策である。

xhost + <ホスト名1> <ホスト名2> ... > /dev/null

2007/7/29更新

オートログアウト機能付きのシェルを使用している。

たとえばtcshにはオートログアウト機能があり、指定された時間以上入力が行われないと自動的にシェルが終了する。

.xinitrcや.xsessionファイルで最後にxtermを指定していてそこで起動されるシェルがこのようなオートログアウト機能を持っている可能性がある。

そのような場合にはオートログアウト機能をオフにするか十分な長い時間が経たないとオートログアウトしないようにする。

tcshでオートログアウト機能を抑止するには以下のような設定を.cshrcファイルに追加すればよい。

unset autologout

2007/7/29更新

以下のような原因が考えられる。

原因1

.xinitrcや.xsessionの最後のクライアントがバックグラウンドで実行されている。

対策

X Window System は.xinitrcや.xsessionに指定されたクライアントの実行が全て終了するとシステム全体を終了させてしまう。

.xinitrcや.xsessionに指定している最後のクライアントにも「&」を付けて実行していないか、または実行がすぐ終ってしまうようなクライアント(例えばxhostなど)を指定していないかどうかを確認する。

原因2

.xsessionが実行可能でない。

対策

xdmで使用される.xsessionに実行権が必要な場合があるので実行権が付いているかどうかチェックする。

他の端末からログインするか、xdmでパスワードを入力した後に[F1]キーか[Ctrl]+[リターン]を押すと.xsessionを実行せずにログインすることができるので.xsessionに実行権を付けたい場合にはこのようにしてログインするとよい。

2007/7/29更新

xsetクライアントを用いるとスクリーンセーバを止めることができる。

ターミナルから次のコマンドを実行すればよい。

% xset s off

2007/7/29更新

一部のOSではデフォルトで外部からの接続が拒否されるようになっている(TCPのLISTENソケットが生成されない)。

これを許可されるようにするにはstartxに-listen_tcpオプションを付けて起動する。

2007/7/29更新

/etc/X11/XF86Configを以下のように変更してXを再起動する。

変更内容はxset qにて確認できる。

Monitorセクション

Section "Monitor"
  Identifier      "Monitor0"
  HorizSync       30.0-96.0
  VertRefresh     50.0-160.0
  Option          "DPMS" ← この行を追加する
EndSection

ServerFlagsセクション(新設)

Section "ServerFlags"
  Option "StandbyTime" "10" ← スタンバイモードに移行するまでの時間(分)
  Option "SuspendTime" "30" ← サスペンドモードに移行するまでの時間(分)
  Option "OffTime" "60" ← ディスプレイをオフにするまでの時間(分)
EndSection

2007/7/29更新

使用しているXサーバが丸いウィンドウ(不定形ウィンドウ)を表示する機能をサポートしていない。

不定形ウィンドウを表示する機能(SHAPE機能)はX11R4からサーバに拡張機能として加わり、Xl1R5でも拡張機能としてサポートされている。

拡張機能はベンダによってはサポートされていない場合もあり、その場合にはoclockやxeyesは四角いウィンドウで表示されてしまう。

SHAPE機能がサポートされているかどうかはxdpyinfoで調べることができる。

% xdpyinfo
name of display: unix:0.0
version number: 11.0
:
number of extensions : 5
SHAPE ← サポートされている場合にはここに表示される
MIT-SHM
Multi-Buffering
MIT-SUNDRY-NONSTANDARD
NEC-KANA-SHIFT-1
default screen number : 0
:

2008/12/2更新

対応バージョン: (Xorg)

/etc/X11/xorg.confのDeviceセクションのビデオカード設定のところに以下の記述を追加してXサーバを再起動する。

Section "Device"
        Identifier  "Card0"
:
        Option      "SWCursor" "True" ← ソフトウェアカーソル有効化
EndSection

2007/7/29更新

ktermで使用している英数字フォントの問題である。

バックスラッシュと円記号の文字コードが同じであるためktermで使用している英数字フォント(-fn オプションによって指定されるフォント)によって形が異なる。

解決方法としては、

-*-fixed-medium-r-normal--14-*-*-*-*-*-jisx0201.1976-*

の代わりに

-*-fixed-medium-r-normal--14-*-*-*-*-*-iso8859-*

を指定すればよい。

バックスラッシュを円記号にしたい場合はこの逆をやればよい。

2007/7/29更新

コントロールキーを押しながらマウスの真ん中ボタンを押すとktermの"VT Options"メニューが表示されるので、そこから"Do Full Reset"を実行する。

2007/7/29更新

キーの割り当てはユーザ単位、システム全体それぞれで行える。

例えば左側のCtrlキーとCaps Lockキーを入れ換えるには以下の方法で行う。

ユーザ単位で設定する場合

~/.Xmodmapに以下の記述を追加してxmodmap ~/.Xmodmapを実行するか、Xサーバを再起動する。

remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L

システム全体で行う場合

/etc/X11/xorg.conf(X.org)、/etc/X11/XF86Config(XFree86)のInputDeviceセクションに以下の記述を追加してXサーバを再起動する。

Section "InputDevice"
	Identifier  "Keyboard0"
:
	Option      "XkbOptions" "ctrl:nocaps"
EndSection

尚、元々のCtrlキーもそのまま使用したい場合は"ctrl:nocaps"と指定する。

関連資料・記事

2007/7/29更新

X Window Systemではキーボードのマッピングをkeycodeとkeysymの組み合わせで管理している。

keycodeとはキーボード上のキーと一対一に対応している番号で、キーボードが変わればkeycodeも変わる可能性がある。

keysymとはそのキーがどういう意味を持つかという論理的な識別子である。

例えばkeycode 9 = Escapeは「keycode 9のkeysymはEscape」であることを表している。

つまり、キーボード上のESCキーのkeycodeは9で、そのキーを押すと「Escape」というkeysymが発生することを表している。

また、keycode 10 = 1 exclamのように、2つのkeysymが設定されているものはそれぞれ「普通にキーを押した場合のkeysym」「Shiftキーを押しながらキーを押した場合のkeysym」を表す。

現在のkeycodeとkeysymのマッピング状態は以下のコマンドで調べることができる。

% xmodmap -pke
:
keycode   9 = Escape
keycode  10 = 1 exclam kana_NU
keycode  11 = 2 quotedbl kana_FU
keycode  12 = 3 numbersign kana_A kana_a
:
keycode  37 = Control_L
:
keycode 100 = Left
:
keycode 102 = Right
:

また、どのキーがどのkeycodeなのかを調べるにはxevコマンドを使用する。

2007/7/29更新

ファイルに格納されている日本語の漢字コードとktermが日本語を表示する時に用いる文字コードが異なっている。

ktermはデフォルトではJISコードとして日本語の文字表示を行う。

ファイルの文字コードがEUC-JPやShift-JISの場合にはktermの文字表示コードをそれらに変更しなくてはならない。

または、なんらかのコマンド(例えばnkf)を用いてファイルの文字コードをktermの文字表示コードに変換する必要がある。

ktermの文字表示コードを変更するためには-kmオプションを用いる。

% kterm -km euc &   ← 表示コードをEUC-JPにする
% kterm -km sjis &  ← 表示コードをSJISにする

これは[Ctrl]+[3ボタン]で表示される「VT Options」メニューからも変更可能である。

また、ktermの文字コードを指定するリソースはKanjiModeである。

KTerm*KanjiMode: euc

2007/7/29更新

ktermがデフォルトで使用する漢字フォントをXサーバが持っていないためである。

これは、あるワークステーションメーカーが提供しているktermを別のメーカーが提供しているXサーバに表示させようとすると起きることがある。

たとえば、EWS4800のktermは漢字フォントとしてEWS4800独自のフォントであるneck16を使用しようとする。

このため、neck16という漢字フォントを持っていない他社のXサーバ(例えばSUNのXサーバ)では表示できない。

このような場合には-fkオプションを使用して、使用しているXサーバが持っている漢字フォントを指定する必要がある。

例)

% kterm -fk k14 -fn a14 -fr r14 &

2007/7/29更新

ktermでフォントを指定して使用している場合に日本語を表示すると英数字が小さなフォントに変わってしまい表示が乱れてしまうことがある。

ktermでは起動オプションで文字の種類によって漢字(-fk)、英数字(-fn)、半角カナ(-fr)に対してフォントを指定できる。

文字表示が乱れる原因としては、例えば漢字のフォントにk14以外のフォントを指定してそれ以外の英数字や半角カナのフォントを指定していないことなどが考えられる。

例えば一部のフォントしか指定しないとこのようなトラブルのもとなので、全てのフォントを指定するようにする。

悪い例

% kterm -fk kanji16 -fn a16 &

良い例

% kterm -fk kanji16 -fn a16 -fr r16 &

また、このようなフォント指定は起動時のオプション以外にリソース(KanjiFont,Font,RomanKanaFont)でも指定できる。

KTerm*KanjiFont: kanji16
KTerm*Font: a16
KTerm*RomanKanaFont: r16

2007/7/29更新

以下の原因が考えられる。

原因1

指定したフォント名が間違っている。

フォント名が正しいかどうかはxlsfontsで確認することができる。

対策

指定したフォント名をxlsfontsの-fnオプションの後に指定してきちんとフォント名が表示されれば大丈夫である。

原因2

フォントパスが正しく設定されていない。

対策

フォントパスは以下のコマンドで表示される。

% xset q
:
Font Path:
/usr/X11R6/lib/X11/fonts/misc/,/usr/X11R6/lib/X11/fonts/75dpi/
:

自分が使用しようとしているフォントが格納されているディレクトリがフォントパスに含まれているかどうかを確認する。

2007/7/29更新

xfdは表示するフォントがないページも表示するため、そのページを表示している可能性がある。

恐らく"NextPage"ボタンを数回クリックすればそのうちフォントが表示されるので心配ない。

2007/7/29更新

既存のフォントパスが何らかの理由で存在しなくなった場合、新たにフォントパスを追加することはできない。

以下の手順で存在しないフォントパスを明示的に削除してから再度xset +fpを実行する。

% xset -fp <存在しないフォントパス>

尚、設定されているフォントパスはxset qコマンドで確認できる。

% xset q
:
Font Path:
/usr/X11R6/lib/X11/fonts/misc/,/usr/X11R6/lib/X11/fonts/75dpi/
:

2007/7/29更新

以下の原因が考えられる。

原因1

フォントファイルをフォントディレクトリにコピーしただけでfonts.dirファイルの内容を更新していない。

対策

クライアントのオプションなどで使用される論理フォント名と実際のフォントファイルとの対応はfonts.dirファイルで行われている。

フォントファイルを新しく追加した場合はmkfontdirコマンドでfonts.dirファイルを更新する必要がある。

原因2

fonts.dirは更新したがサーバ内にキャッシュされているfonts.dirファイルの内容が更新されていない。

対策

Xサーバは起動時にフォントパス上にあるfonts.dirファイルの内容を読み込みキャッシュして持っている。

この内容はXサーバを再起動するかxsetコマンドでサーバに指定しない限り更新されない。

xsetで更新する場合には以下のようにする。

% xset fp rehash

2007/7/29更新

対応バージョン: XFree86-4.X

/etc/X11/XF86Configを以下のように変更してXを再起動する。

Moduleセクション

Load    "dri" ← この行を追加する

DRIセクション(新設)

Section "DRI"
  Mode 0666
EndSection

DRIが有効になっているかどうかは以下のようにして確認できる。

・/proc/dri/0が存在すること

・glxinfoを実行し、DRIが有効(Yes)になっていること

% glxinfo | grep "direct rendering"
direct rendering: Yes

2007/7/29更新

xwdで画面ダンプしたXサーバと違うXサーバでxwudを実行するとこのような事象になることがある。

これはxwdでダンプしたデータは同じカラー深度を持つXサーバでしか表示できないからである。

モノクロ表示でもよければ、以下のようにpbmplusを用いてモノクロのXのビットマップ形式に変換すればカラー表示ができないXサーバ上でも表示させることができる。

% xwdtopnm color.xwd | ppmtopgm | pnmtoxwd > gray.xwd

2007/7/29更新

画面ダンプをとったときと再表示するときで、Xサーバのカラーマップの内容が異なるときにこのようなことが起こる。

擬似カラーのサーバではxwdでダンプを取るときに-icmapオプションを付けてカラーマップ情報も同時に保存しておく必要がある。

2007/7/29更新

これは実は正しい現象であり不具合ではない。

Xでは色の割り当てにカラーマップを用いており、カラーマップのエントリには上限がある。

このようなカラーマップは2種類ある。

それは、すべてのクライアントがアクセスできる「共有カラーマップ」と、特定のクライアントしかアクセスできない「プライベートカラーマップ」である。

これらのカラーマップのどちらを使うかはクライアントに依存する。

ウィンドウにマウスカーソルが入らないと色が正しく表示されないのは、そのウィンドウがプライベートカラーマップを用いている場合である。

twmのようなウィンドウマネージャはクライアントがプライベートカラーマップを使用している場合にはそのクライアントが表示しているウィンドウにマウスカーソルが入ったときにそのカラーマップを用いて色を表示する。

このため他のウィンドウにマウスカーソルがある場合にはそのウィンドウのカラーマップ(又は共有カラーマップ)が用いられるため、それ以外のウィンドウの色表示が正しくされなくなるのである。

2007/7/29更新

以下のような原因が考えられる。

原因1

色の指定をしていない。

対策

カラーディスプレイを使用していてもリソースファイル(.Xdefaults等)で色の指定をしていないと色は表示されない。

それぞれのファイルの設定をチェックすること。

原因2

色の名前を間違えている。

対策

色を名前で指定する場合はスペルミスに注意すること。

色の名前は/usr/X11R6/lib/X11/rgb.txtや/usr/lib/X11/rgb.txt等に定義されている。

たとえばxtermでは次のようなエラーが表示される。

% xterm -fg White -bg DrakSlateGray &
Warning: Color name "DrakSlateGray" is not defined

この場合にはDarkSlateGrayが正しい綴りである。

原因3

Xサーバが扱える色数の上限を超えてしまった。

例えば次のようなメッセージを出して色が表示されない場合がある。

% xcolors
Warning: Cannot allocate colormap entry for "DarkOrangell"
xcolors: Not enough room in color map.
To see colors after this, use the -start option to name a starting color.

対策

これはXサーバが扱える色の個数以上に色を使用しようとしたときに生じる。

一般的なXサーバは256色までしか同時に色を表示することができない。

256という数はカラーマップのエントリ数であり、Xサーバはクライアントから色表示の要求を受けるとカラーマップから1色につき1つのエントリを割り当てる。

エントリの割り当ては要求のあった順番であり、エントリがいっぱいになるとXサーバはそれ以上の色の割り当てを拒否する。

このため色が表示されなくなる。

このような場合には色を沢山使っているクライアントを終了させ、カラーマップのエントリを解放する必要がある。

2010/1/27更新

X Windows Systemではクリップボードに3種類のバッファが用意されており、コピー方法によって使用するバッファが異なる。

PRIMARY

マウスでテキストを反転させてコピーした場合

SECONDARY

(未使用)

CLIPBOARD

マウスでテキストを反転させ、右クリックしてコピーを選択した場合

異なるバッファ間のデータ受け渡しにはxclipを使用することができる。

例えばPRIMARYバッファの内容をCLIPBOARDバッファにコピーするには以下のようにする。

% xclip -o -selection PRIMARY | xclip -selection CLIPBOARD

また、~/.Xresourcesに以下の記述をしておけばPRIMARYバッファの内容をCLIPBOARDバッファにもコピーしてくれる。

XTermの場合)

XTerm*selectToClipboard: true

上記設定はXの再起動かxrdbコマンドで有効になる。

% xrdb -merge ~/.Xresources
% xrdb -query
XTerm*selectToClipboard:	true
:

2007/7/29更新

サイズが変更されたことがxtermやktermで実行されているシェルに伝わっていないのが原因である。

いったんviやmoreを終了して次のコマンドを実行してみる。

% set noglob; eval `resize`; unset noglob

その後で再びviやmoreを起動すれば今度はウィンドウのサイズで起動される。

また、このコマンドは次のようにエイリアスしておくと便利である。

% alias rs 'set noglob; eval `resize`; unset noglob'

2007/7/29更新

.xinitrcや.xsessionファイルにxrdbクライアントが指定されている。

xrdbはXサーバにリソースファイルを登録するためのクライアントである。

一度xrdbでリソースが登録されると.Xdefaultsファイルは機能しなくなる。

このような場合には以下のようにして.Xdefaultsの内容Xサーバに登録し直せばよい。

% xrdb ~/.Xdefaults

2007/7/29更新

ディスプレイ名が他のマシンのサーバを指定している(そこに表示されている)ので正しいディスプレイ名を設定し直して再度クライアントを起動する。

2007/7/29更新

これは共有ライブラリを使用しているシステムで起こるエラーで、当該ライブラリが存在しないか、存在してもライブラリパスに登録されていない。

共有ライブラリを使用しているシステムではアプリケーションの実行時にリンクする必要があるライブラリを/usr/lib等に探しにいく(どのディレクトリを探しにいくかはOSや設定によって異なる)。

このため、実行時にそのディレクトリにライブラリがないと上記のエラーが表示されるのでライブラリ格納ディレクトリにあるかどうか確認し、ない場合はコピーするか、他のディレクトリにインストールしてある場合にはLD_LIBRARY_PATH環境変数にそのディレクトリを追加しておけばよい。

尚、クライアントがどの共有ライブラリを使用しているかはlddコマンドで確認することができる。

例)

% ldd /usr/X11R6/bin/xclock
/usr/X11R6/bin/xclock:
   libXft.so.2 => /usr/X11R6/lib/libXft.so.2 (0x28079000)
   libfontconfig.so.1 => /usr/X11R6/lib/libfontconfig.so.1 (0x2808b000)
   libfreetype.so.9 => /usr/local/lib/libfreetype.so.9 (0x280b3000)
   libexpat.so.4 => /usr/local/lib/libexpat.so.4 (0x2811d000)
   libXrender.so.1 => /usr/X11R6/lib/libXrender.so.1 (0x2813d000)
   libm.so.2 => /lib/libm.so.2 (0x28145000)
   libXaw.so.7 => /usr/X11R6/lib/libXaw.so.7 (0x2815e000)
   libXmu.so.6 => /usr/X11R6/lib/libXmu.so.6 (0x281b9000)
   libXt.so.6 => /usr/X11R6/lib/libXt.so.6 (0x281cf000)
   libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x28220000)
   libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x28229000)
   libXpm.so.4 => /usr/X11R6/lib/libXpm.so.4 (0x28240000)
   libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x2824f000)
   libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x2825e000)
   libc.so.5 => /lib/libc.so.5 (0x28326000)
   libz.so.2 => /lib/libz.so.2 (0x28400000)

また、上記の例でも分かるように、起動したクライアントが使用しているライブラリと現在システムにインストールされているライブラリのバージョンが異なるとやはり起動できないので、該当バージョンのライブラリをインストールするか、クライアントを再コンパイルして現行バージョンのライブラリを使用するようにする。

2007/7/29更新

UNIXではシステム全体で起動できるプロセスの上限が決まっているのでこの上限値を超えてしまった可能性がある。

したがって現在起動しているプロセスのうちいずれかを終了させ、プロセスの総数を減らさなくてはならない。

とりあえず不要なプロセスを終了させてみるとよい。

ただし、UNIXはマルチタスク機能をもつOSなので自分のプロセスを終了させ、新しく別のプロセスを起動する前に他の人が新しくプロセスを起動すると同じメッセージが表示される。

もし頻繁にこのメッセージが出るようならシステム管理者に頼んでシステムで実行可能なプロセス数の上限値を増やしてもらう必要がある。

2007/7/29更新

例えば、次のように表示される。

yourhost% xclock -display myhost:0.0 &
X server not responding. Check your DISPLAY environment variable.

これは、myhostで起動されているXサーバのアクセスコントロールリストにyourhostというホストが登録されていないのが原因である。

xhostコマンドを使ってmyhostで起動しているXサーバのアクセスコントロールリストにこのマシン(yourhost)が登録されているかどうかを確認し、登録されていない場合には次のようにして登録すればよい。

myhost% xhost +yourhost
yourhost being added to access control list

2007/7/29更新

リソースファイルに設定されたリソース値がクライアントで使用している内部表現に変換できない場合にこのようなエラーメッセージが表示される。

リソース値に指定されている値が正しいかどうかをマニュアル等で確認する。

2007/7/29更新

以下のような原因が考えられる。

原因1

ディスプレイ名が間違っている。

対策

ディスプレイ名を確認する。DISPLAY環境変数に設定している場合にはそれも確認する。

原因2

何らかの理由でUNIX domain socketが消えた。

対策

ディスプレイ名にunix:0.0(または:0.0)を指定して起動すると「Can't open display」と表示されて起動できないが、そのマシンのホスト名(例えばmyhost:0.0)を指定して起動すると動くことがある。

これは、Xサーバとクライアント間の通信にsocket()システムコールを使っている場合に起こる可能性がある。

Xでのunix:0.0の実体は/tmp/.X11-unix/X0というファイルになっている。

このファイルがなんらかの理由で消されるとこのような現象が起こる。

例えばcronなどで定期的に/tmpにあるファイルを消していないだろうか。

unix:0.0を使えるようにするにはXサーバを再起動するしかない。

再起動したくない場合にはとりあえずホスト名を指定してクライアントを起動する。

2007/7/29更新

以下のような原因が考えられる。

原因1

シェルのコマンドパスが正しく設定されていない。

対策

setコマンドでコマンドパスを表示させ、Xのクライアントが置かれているディレクトリが登録されているかどうかを確認する。

クライアントが置かれているディレクトリはシステムによって異なる。

原因2

起動しようとしたクライアントがインストールされていない。

対策

当該クライアントをインストールする。