「セッション」は伝統的な文字ベースの端末の世界では特定のプロセスの 存続期間として定義される。この特定のプロセスとはユーザのログインシェル である。 xdm 環境では任意のセッションマネージャが利用できる。なぜなら、ウィンドウ環 境にあるため、ユーザのログインシェルプロセスは接続を行うための端末のよ うなインタフェースを必要としないからである。 本当のセッションマネージャが使えない時は、普通ウィンドウマネージャか端 末エミュレータを「セッションマネージャ」として用いる。このセッションマ ネージャのプロセスが終了するとユーザのセッションが終了する。
セッションが終了する時、 xdm は X サーバをリセットして(指定によっ ては)すべてのプロセスを再起動する。
xdm が XDMCP 経由で Indirect の問い合わせを受け取ったとき、 xdm はディスプレイのために chooser プロセスを起動して XDMCP BroadcastQuery(または指定されたホストに対する XDMCP Query)を実行 する。そして、XDMCP によってディスプレイ管理ができるホスト一覧を提供す る。 この機能は、ホスト一覧を与えることができない X 端末を使う際に便利であ る。
xdm は選択されたホストからの BroadcastQuery メッセージを無視するように設定 できる。これは、このホストを chooser または X 端末が生成するリストに出したくない場合に便利である。
xdm は最初にユーザが触れるインタフェースを提供するので、簡単に利用でき、個 別のサイトの要望に合わせて簡単にカスタマイズできるようになっている。 xdm は多くのオプションがあり、そのほとんどは適切なデフォルト値になっている。 このマニュアルの多くのセクションを調べて、変更したい部分を選択すること。 セッションのスタイルの設定について説明している セッションプログラム セクションには特に注意すること。
xdm でディスプレイを管理するには2つの異なる方法がある。ローカル マシンで動作するサーバを Xservers に指定する方法と、リモートの X サーバ(通常は X 端末)を Xaccess ファイルで指定して XDMCP(XDM 制 御プロトコル)を使う方法である。
ユーザのセッション外でxdm が実行する X クライアント(これは xdm 自身のログイン画面を含む)のリソースは Xresources ファ イルで設定することができる。
ディスプレイ管理を得るためのホスト一覧を与えない X 端末に対しては、 xdm は自発的に動作するホストを集め、ユーザに一覧を提供するために chooser プログラムを実行する。ホストに接続している X ディスプレ イに対しては通常このような手順は行われず、ローカルホストがディスプレイ 管理を行う。
X サーバをリセットした後、xdm は Xsetup スクリプトを実行し て、ユーザが xlogin ウィジェットで見るスクリーンの設定を補助する。
xdm が提供する xlogin ウィジェットは、よくあるタイプのログ インとパスワードプロンプトである。
ユーザがログインした後で、xdm は Xstartup スクリプトを ルート権限で実行する。
それから xdm は Xsession スクリプトをユーザ権限で実行する。 このシステムセッションファイルは追加の開始処理をいくつか行い、通常はユー ザのホームディレクトリの .xsession を実行する。 Xsession スクリプトが終了するとセッションは終了する。
セッションの最後には、終了処理を行う Xreset スクリプトが実行され、 X サーバがリセットされ、サイクルの最初に戻る。
xdm と Xsetup, Xstartup, Xsession, Xreset が標準エラー出力に送っ たエラーメッセエージは、/usr/X11R6/lib/X11/xdm/xdm-errors ファイ ルに格納される。 xdm の実行中に問題が発生した場合には、このファイルを見て、 xdm が問題解決の手がかりを示しているかどうか調べること。
-config オプション自身を除くすべてのオプションは、リソースとして 設定ファイルでも指定できる。
ローカルディスプレイの場合は、リソース名とクラスは Xservers ファ イルから読み込まれる。
リモートディスプレイの場合は、リソース名はディスプレイのアドレスを解決 したものである。removeDomain リソースを参照すること。名前は完全 に一致しなければならない。xdm は指定されたディスプレイを示すネッ トワーク上の別名が全てわかるわけではない。 名前の解決に失敗した場合は、名前ではなくアドレスを使用すること。リソー スクラスはディスプレイによりXDMCP Manage リクエストで送られる。
リソースマネージャはリソース名とその値を区切るためにコロンを使い、リソー ス名の部分を区切るためにドットを使うので、 xdm がリソース名を生成するときにはドットとコロンは下線(アンダスコア)に置き 換えられる。 例えば、起動シェルスクリプトが ``expo.x.org:0'' をディスプレイに定義して いるときは DisplayManager.expo_x_org_0.startup がリソース名とな る。
以下は xdm-config という名前の使いやすい設定ファイルである:
DisplayManager.servers: /usr/X11R6/lib/X11/xdm/Xservers
DisplayManager.errorLogFile: /usr/X11R6/lib/X11/xdm/xdm-errors
DisplayManager*resources: /usr/X11R6/lib/X11/xdm/Xresources
DisplayManager*startup: /usr/X11R6/lib/X11/xdm/Xstartup
DisplayManager*session: /usr/X11R6/lib/X11/xdm/Xsession
DisplayManager.pidFile: /usr/X11R6/lib/X11/xdm/xdm-pid
DisplayManager._0.authorize: true
DisplayManager*authorize: false
このファイルは普通、他のファイルを参照している点に注意すること。また、 要素を句切る ``*'' を使って指定されるリソースもある点にも注意すること。 これらのリソースは、ディスプレイ名を ``*'' で置き換えることによって異 なるディスプレイに対しては重ならないようにすることができるが、通常はあ まり役に立たない。詳しい議論については、リソース セクショ ンを参照すること。
DisplayManager.accessFile によって指定したデータベースファイルは、 XDMCP サービスを要求するディスプレイからのアクセスを xdm が制御をするために使う情報を与える。このファイルは 3 種類の項目が含ま れる: Direct と Broadcast の問い合わせに応答する制御項目、Indirect の 問い合わせに応答する制御項目、マクロ定義である。
Direct 項目の書式は単純であり、ディスプレイデバイスのホスト名と比較さ れるホスト名またはパターンである。パターンは1つ以上のメタ文字(`*' は 0 個以上の任意の文字に一致し、`?' は任意の一文字に一致する)を含むことに よってホスト名とは区別される。 項目がホスト名の場合は、全ての比較はネットワークアドレスを使って行われ るので、正しいネットワークアドレスに変換される任意の名前を使うことがで きる。 項目がパターンの場合は、カノニカルなホスト名だけが比較に使われるので、 エイリアスにマッチさせようとしないように注意すること。 ホスト名またはパターンの前に `!' 文字をつけると、その項目にマッチする ホストが除外される。
ホスト名もしくはパターンの Direct 問い合わせにだけに応答させるには、 オプションの ``NOBROADCAST'' キーワードを後に加えること。 これを使って、xdm サーバが Broadcast の問い合わせに基づくメニューに現 われないようにすることができる。
Indirect 項目もホスト名もしくはパターンを含むが、この項目の場合はその 後に間接的な問い合わせを送るホスト名またはマクロのリストが続けられる。
マクロ定義は、マクロ名とホスト名のリストとマクロを展開するその他のマク ロを含む。マクロとホスト名を区別するため、マクロ名は `%' 文字で始まる。 マクロはネストさせることができる。
Indirect 項目では、接続できるホストのメニューを出すために xdm に chooser を実行させるように指定することもできる。Chooser の セクションを参照すること。
特定のディスプレイホストへのアクセスを調査するときは、各項目は順番に調 べられ、最初にマッチする項目で応答が決められる。Direct と Broadcast 項 目は Indirect 項目を調べるときには無視される。その逆も同じである。
空白行は無視される。`#' はコメント区切りとして扱われ、その行の残りは無視 される。`\newline' は改行を無視されるようにし、間接ホストのリス トを複数行に渡って記述できるようにする。
Xaccess ファイルの例を示す:
#
# Xaccess - XDMCP アクセス制御ファイル
#
#
# Direct/Broadcast query entries
#
!xtra.lcs.mit.edu # xtra に対する direct/broadcast サービスを禁止する
bambi.ogi.edu # この特定のディスプレイからのアクセスを許可する
*.lcs.mit.edu # LCS ドメインの任意のディスプレイからのアクセスを許可する
*.deshaw.com NOBROADCAST # direct アクセスのみを許可する
*.gw.com # direct アクセスと broadcast アクセスを許可する
#
# Indirect 問い合わせ項目
#
%HOSTS expo.lcs.mit.edu xenon.lcs.mit.edu \
excess.lcs.mit.edu kanga.lcs.mit.edu
extract.lcs.mit.edu xenon.lcs.mit.edu # extract を xenon に接続させる
!xtra.lcs.mit.edu dummy #indirect アクセスを禁止する
*.lcs.mit.edu %HOSTS #他の全てのホストを選択させる
Broadcast または Indirect 問い合わせを使ってホストメニューを出さない X 端末に対しては、chooser プログラムがメニューを出す。 Xaccess ファイルの中で、Indirect ホストリスト内の最初の項目に ``CHOOSER'' を指定すること。chooser は Query リクエストをリスト 中の残りのホスト名それぞれに送り、応答した全てのホストをメニューに出す。
リストで ``BROADCAST'' という語を使うこともでき、この場合には代わりに chooser は Broadcast を送り、応答した全てのホストをメニューに出 す。OS によっては UDP パケットをブロードキャストできず、この機能が動作 しない場合がある点に注意すること。
chooser を用いる場合の Xaccess ファイルの例を示す:
extract.lcs.mit.edu CHOOSER %HOSTS #これらのホストのメニューを出す xtra.lcs.mit.edu CHOOSER BROADCAST #全てのホストのメニューを出す
chooser を使用するプログラムは、 DisplayManager.DISPLAY.chooser リソースによって指定 される。この段階をより柔軟にするため、chooser をシェルスクリプトにする こともできる。 ここで、chooser はセッションマネージャであり、子プロセスの xdm の代わりにディスプレイを管理する。
このプログラム用のリソースは、 DisplayManager.DISPLAY.resources にファイル名を記述 することができる。
ユーザがホストを選択するとき、chooser は選択されたホスト(これは 親である xdm が取得する)を出力して終了する。 xdm は X サーバへの接続を閉じ、 サーバはリセットを行い、別の Indirect XDMCP リクエストを送る。 xdm はユーザに選択されたホストを (DisplayManager.choiceTimeout 秒間)記憶する。この選択されたホス トはそのディスプレイでセッションを開始する。
DisplayManager.servers リソースはサーバの指定を与える。あるいは、 スラッシュ(/)で始まる値の場合には、サーバを指定しているファイルの名前 を1行に1つずつ指定する。
それぞれの指定は、常に管理されており XDMCP を使っていないディスプレイ を示す。 この方法は普通はローカルサーバだけで使われる。このリソースまたはリソー スで指定したファイルが空の場合は、xdm は XDMCP サービスだけを提 供する。
それぞれの指定は最低 3 個の部分から構成されている: これはディスプレイ 名、ディスプレイクラス、ディスプレイタイプであり、(ローカルサーバに対 しては) サーバを起動するコマンド行である。番号0のローカルディスプ レイに対する典型的な項目は次のようになる:
:0 Digital-QV local /usr/X11R6/bin/X :0ディスプレイタイプは次のようになる:
local ローカルディスプレイ: xdm はサーバを起動しなければならない foreign リモートディスプレイ: xdm は動作しているサーバに対する X 接続をオープンする
ディスプレイ名は、-display オプションで X プログラムに渡せるよ うなものでなければならない。この文字列はディスプレイ固有のリソース名を 生成するために使われるので、その名前とマッチするように注意すること(例 えば、他のリソースが ``DisplayManager._0.session'' のように設定されて いる場合には、``localhost:0 Sun-CG3 local /usr/X11R6/bin/X :0'' ではな く ``:0 Sun-CG3 local /usr/X11R6/bin/X :0'' を使用すること)。 ディスプレイクラス部分も、リソースのタイプのようにディスプレイ固有のリ ソースで使われる。これは、似たようなディスプレイがたくさんあり(X 端末 を並べているような場合)これらにまとめてリソースをセットしたいような場 合に便利である。XDMCP を使うときはディスプレイにはディスプレイクラスを 指定しなければならないので、個別の X 端末のマニュアルにはそのデバイス に対するディスプレイクラスが記述されているはずである。これが記述されて いなければ、 xdm をデバッグモードで起動して、そのデバイスに対して生成されるリソース文字 列を見ること。これにはクラス文字列が含まれているはずである。
xdm はセッションを開始するときに、サーバに対する認証データを設定 する。ローカルサーバに対しては、xdm はサーバのコマンド行で ``-auth filename'' を渡し、認証データの場所を示す。 XDMCP サーバに対しては、xdm は Accept XDMCP リクエストを経 由して認証データをサーバに渡す。
xlogin*login.translations: #override\
Ctrl<Key>R: abort-display()\n\
<Key>F1: set-session-argument(failsafe) finish-field()\n\
<Key>Return: set-session-argument() finish-field()
xlogin*borderWidth: 3
xlogin*greeting: CLIENTHOST
#ifdef COLOR
xlogin*greetColor: CadetBlue
xlogin*failColor: red
#endif
トランスレーションの項目に注意すること。ここでは、ユーザがデフォルトセッ ションから抜け出せる(また、ここで起こる問題を避ける)ようにするため、ウィ ジェットのトランスレーションをいくつか新たに指定している。 #override を指定しないと標準のトランスレーションが消去され、新しい値に 置き換えられてしまう。デフォルトのトランスレーションも非常に便利なので (例えば、通常の文字入力に応答する ``<Key>: insert-char ()'' 等)、この ような置き換えはあまり好ましい結果ではない。
このファイルは設定プログラムと chooser に対するリソースも含んで よい。
DisplayManager.exportList による指定に加え、次の環境変数が渡され る:
DISPLAY 関連するディスプレイ名
PATH DisplayManager.DISPLAY.systemPath の値
SHELL DisplayManager.DISPLAY.systemShell の値
XAUTHORITY 認証ファイルがセットされる
xdm はキーボードを占有するので、他のウィンドウはキーボード入力を 受け付けない点に注意すること。しかし、マウスで操作することはできる。 セキュリティホールの可能性に注意すること。 DisplayManager.DISPLAY.grabServer がセットされている 場合は、Xsetup はディスプレイに全く接続できない。 このプログラム用のリソースは DisplayManager.DISPLAY.resources が指すファイルに記 述することができる。
以下に Xsetup スクリプトの例を挙げる:
#!/bin/sh
# Xsetup_0 - ワークステーション用の設定スクリプト
xcmsdb < /usr/X11R6/lib/monitors/alex.0
xconsole -geometry 480x130-0-0 -notify -verbose -exitOnFail &
Ctrl<Key>H: delete-previous-character() \n\
Ctrl<Key>D: delete-character() \n\
Ctrl<Key>B: move-backward-character() \n\
Ctrl<Key>F: move-forward-character() \n\
Ctrl<Key>A: move-to-begining() \n\
Ctrl<Key>E: move-to-end() \n\
Ctrl<Key>K: erase-to-end-of-line() \n\
Ctrl<Key>U: erase-line() \n\
Ctrl<Key>X: erase-line() \n\
Ctrl<Key>C: restart-session() \n\
Ctrl<Key>\\: abort-session() \n\
<Key>BackSpace:delete-previous-character() \n\
<Key>Delete: delete-previous-character() \n\
<Key>Return: finish-field() \n\
<Key>: insert-char() \
このウィジェットがサポートしているアクションを以下に挙げる:
Xstartup プログラムはユーザがログインしたときに root 権限で実行 される。 これは普通はシェルスクリプトである。 Xstartup は root 権限で実行するので、Xstartup についてはセ キュリティに十分注意すること。このファイルには /etc/utmp にエン トリーを追加するコマンドやファイルサーバからユーザのホームディレクトリ をマウントするコマンド、ログインが許可されない場合にセッションを中止さ せるコマンド等を記述する。
DisplayManager.exportList による指定に加え、以下の環境変数を渡す ことができる:
DISPLAY 関連するディスプレイ名
HOME ユーザの最初の作業ディレクトリ
LOGNAME ユーザ名
USER ユーザ名
PATH DisplayManager.DISPLAY.systemPath の値
SHELL DisplayManager.DISPLAY.systemShell の値
XAUTHORITY 認証ファイルをセットすることができる
スクリプトへは引き数は全く渡されない。 xdm はユーザセッションを開始する前に、このスクリプトが終了するのを待つ。 このスクリプトの終了値がゼロでない場合、 xdm はセッションを続行を行わず、他の認証サイクルを開始する。
ここで示すサンプルの Xstartup ファイルは、/etc/nologin ファ イルが存在する間はログインを行わせない。 これは完全な例ではなく、単に利用できる機能のデモである。
以下にサンプルの Xstartup を示す;
#!/bin/sh
#
# Xstartup
#
# このプログラムはユーザの認証後、root 権限で実行される
#
if [ -f /etc/nologin ]; then
xmessage -file /etc/nologin -timeout 30 -center
exit 1
fi
sessreg -a -l $DISPLAY -x /usr/X11R6/lib/xdm/Xservers $LOGNAME
/usr/X11R6/lib/xdm/GiveConsole
exit 0
Xsession プログラムはユーザセッションとして実行されるコマンドで ある。 これは認証されたユーザの権限で実行される。
DisplayManager.exportList の指定に加え、次の環境変数が渡される:
DISPLAY 関連するディスプレイ名
HOME ユーザの初期作業ディレクトリ
LOGNAME ユーザ名
USER ユーザ名
PATH DisplayManager.DISPLAY.userPath の値
SHELL ユーザのデフォルトのシェル(getpwnam で取得する)
XAUTHORITY 標準でない認証ファイルをセットすることができる
KRB5CCNAME Kerberos 証明書のキャッシュ名をセットすることができる
X を普通にインストールした場合には、Xsession は $HOME にある .xsession を参照する。このファイルには、各ユーザがセッションと して利用するコマンドが記述される。 Xsession はまた、ユーザ指定のセッションが存在しない場合に実行す るシステム標準のセッションも実装している。 通常の使用方法 セクションを参照すること。
`set-session-argument' アクションを使用する認証ウィジェットから、この プログラムへ引き数を渡すことができる。これを用いて違うスタイルの セッションを選択できる。この機能の便利な使い方の 1 つは、通常の セッションが失敗したときにユーザがこのセッションからエスケープできるよ うにすることである。この機能を使えば、ユーザは .xsession の設定 に失敗した場合に、管理者の仲介がなくても自分の .xsession を修正 できる。 次の例でこの機能を示す:
これは特殊な「フェールセーフ」モードを使えるようにする例題である。 このモードは Xresources ファイルのトランスレーションで指定し、 通常のセッションからエスケープできるようにする。この例題では .xsession ファイルが実行可能であることも必要であるので、このファイルが使おうとす るシェルを推定する必要はない。
#!/bin/sh
#
# Xsession
#
# これは、ディスプレイマネージャに対するクライアント
# として実行されるプログラムである。
case $# in
1)
case $1 in
failsafe)
exec xterm -geometry 80x24-0-0
;;
esac
esac
startup=$HOME/.xsession
resources=$HOME/.Xresources
if [ -f "$startup" ]; then
exec "$startup"
else
if [ -f "$resources" ]; then
xrdb -load "$resources"
fi
twm &
xman -geometry +10-10 &
exec xterm -geometry 80x24+10+10 -ls
fi
ユーザの .xsession ファイルはこの例のようになっているだろう。 このファイルには実行属性を持たせる必要があるのを忘れないこと。
#! /bin/csh
# .cshrc を実行させて $PATH をセットさせるため、前の行で -f
# オプションは指定しないこと
twm &
xrdb -merge "$HOME/.Xresources"
emacs -geometry +0+50 &
xbiff -geometry -430+5 &
xterm -geometry -0+50 -ls
Xstartup と対になる Xreset スクリプトは、ユーザセッション が終了した後に実行される。このファイルは root 権限で実行され、 Xstartup で実行されたコマンドの効果を打ち消すようなコマンドや、 /etc/utmp からの項目の削除、ファイルサーバからのディレクトリのア ンマウントを行うコマンドを含む。Xstartup に渡された環境変数は Xreset にも渡される。
Xreset スクリプトの例:
#!/bin/sh
#
# Xreset
#
# このプログラムはセッションが終わった後に root 権限で実行される
#
sessreg -d -l $DISPLAY -x /usr/X11R6/lib/xdm/Xservers $LOGNAME
/usr/X11R6/lib/xdm/TakeConsole
exit 0
XDMCP を使わないリモート端末を制御するため、 xdm はディスプレイのウィンドウの階層構造を検索し、次のセッションのために端 末を片づけるために KillClient プロトコルリクエストを用いる。これは実際 には全てのクライアントを破棄するのではなく、ウィンドウを生成したクライ アントだけが通知を受ける。XDMCP はより確実に動作する機構を提供している。 xdm が最初の接続を閉じたとき、そのセッションは終了し、端末には他のすべての 接続を閉じることが要求される。
xdm は二つのシグナル SIGHUP と SIGTERM に応答する。SIGHUP を送ると xdm は設定ファイル、アクセス制御ファイルとサーバファイルを再読み込みする。 サーバファイルについては、項目の追加や削除があれば通知がなされる。新し い項目が追加されたら、 xdm は対応するディスプレイのセッションを開始する。削除された項目は即座に無 効にされる。これは通知無しに進行中のセッションが終了し、新しいセッショ ンが開始されるということである。
SIGTERM を送ると、 xdm は進行中のすべてのセッションを終了させ、自身も終了する。これはシステム をシャットダウンするときに使用する。
xdm はコマンド行引き数リストを適宜修正して、 ps(1) のために各種サブプロセスに印をつけようとする。 xdm はこの作業のために追加の割り当てを行うことができないので、 xdm を十分な長いコマンド行(フルパス名で十分だろう)を使って起動するとよ い。 ディスプレイを提供しているそれぞれのプロセスには、 -display の印が付けられる。
ローカルディスプレイを追加するには、Xservers ファイルに一行追加 する。 (ローカルサーバの指定セクションを参照すること。)
xdm-config 内のディスプレイ固有のリソースを調べ(例えば、 DisplayManager._0.authorize)、どのリソースを新しいディスプレイ用 にコピーするか考えること。 デフォルトの xdm-config には :0 と :1 に対する適切な 指定がある。
4.3 init オプションを使い、xdm で同時に1つのセッションを実 行することができる。また、コマンド行でサーバを指定することにより、 他の適切なデーモンを実行することができる。
xdm -server ":0 SUN-3/60CG4 local /usr/X11R6/bin/X :0"
あるいは、ファイルサーバと何台もの X 端末があるものとする。この場合の 設定ファイルは、Xservers ファイルが次のようになる点以外は前述の 例と同じである:
extol:0 VISUAL-19 foreign
exalt:0 NCD-19 foreign
explode:0 NCR-TOWERVIEW3000 foreign
これは、 xdm をこれらの3台の端末全てのセッションを管理することを指示する。 init(8) と同じようにシグナルを使ってこれらの端末を有効/無効にする方法について は、XDM の制御 セクションを参照すること。
注意: <XRoot> は X11 のインストールツリーのルートディレクトリを示す。