Debian の Xsession を訳してみる

すっかりWindowsのGUIフィールに心身ともに毒されてしまい、XfceからよりWindowsに近いと言われる Cinnamon に浮気を計画中である。

そこで疑問になるのが、XfceとCinnamonの両方がインストールされている場合に、xrdpで接続した場合はデスクトップ環境がどう選択されるのか、である。

xrdpは etc/xrdp/startwm.sh を実行する。そのstartwm.shの最終行は

test -x /etc/X11/Xsession && exec /etc/X11/Xsession
exec /bin/sh /etc/X11/Xsession

のようになっている。つまり最終的に/etc/X11/Xsessionが実行されることが分かる。

ということで、DebianのXsessionを調べてみた。

ひとまずXsessionのDebian公式ドキュメントを訳してみる:

Debian で X Window System を起動すると、X セッションが作成される。 このページでは、デフォルトの Debian X セッションと、その操作方法について説明する。

man ページの Xsession(5) と Xsession.options(5) に技術的な説明がある。

Debian X セッションの開始

Debian X セッションを実行する標準的な方法は、コンソールログインから startx を実行するか、 lightdm、gdm3、xdm などの DisplayManager からログインすることだ。

ディスプレイマネージャによっては、セッションの種類を選べるものもある。 Debian X セッション以外を選択した場合、このページの残りの部分は完全に適用されないかもしれない。

設定

システム全体の設定

Debian Xセッションのシステム全体の設定は、主に/etc/X11/Xsession.optionsファイル内のオプションと、/etc/X11/Xsession.dディレクトリ内のスクリプトで構成される。 これらのスクリプトはすべて、単一の /bin/sh シェルによって、名前のソートによって決定される順序で点在している。 管理者はスクリプトを編集することができるが、シェルプログラミングに慣れていない場合は注意が必要である。

Debianリファレンスマニュアルには、デフォルトがどのように動作するかが説明されている:

  1. ユーザーが ~/.xsessionrc ファイルを持っていれば、それを読み込む。
  2. DM(GDM、KDM、WDM、LightDM、…)で特定のセッションが選択されていれば、それを実行する。
  3. それ以外の場合、ユーザーが ~/.xsession または ~/.Xsession ファイルを持っていれば、それを実行する。
  4. それ以外の場合、/usr/bin/x-session-manager コマンドが存在すれば、それを実行する。
  5. それ以外の場合、/usr/bin/x-window-managerコマンドがあれば、それを実行する。
  6. それ以外の場合、/usr/bin/x-terminal-emulatorコマンドが存在すれば、それを実行する。

ユーザーごとの設定

ユーザー設定はいくつかの方法で行うことができる。 最も簡単な方法は、~/.xsessionrc ファイルを作成することで、すべての X セッションタイプで使用される。 このファイルはPOSIXシェル(/bin/sh、通常はdashが提供する)によって読み込まれる。 POSIX shでサポートされていない機能の使用は避けるべきだ。

このファイルでは、通常3種類のコマンドを使用することができる:

  • 環境変数の定義を直接ここに置くことができる: export SOME_VAR="some value"
  • 他のPOSIXシェル・コンフィギュレーション・ファイルで指定する: if [ -r ~/.profile ]; then .~/.profile; fi
  • Xクライアントプログラムを直接実行することもできる: xclock -geometry +0+0 &

通常のシェルのドットファイルをドット化する場合は、bash固有の機能、zsh固有の機能、ksh固有の機能などを使用していないことを確認して欲しい。

Xクライアントプログラムを実行する場合は、それ自体がすぐに終了するか(xmodmapやxset、xsetbgコマンドなど)、シェルの&演算子でコマンドを終了してバックグラウンドで実行するようにして欲しい。 また、~/.xsessionrcは非常に早い段階で読み込まれるため、ここで設定した内容は、ログイン後のウィンドウマネージャやデスクトップ環境によって上書きされる可能性があることに注意して欲しい。

GNOMEセッションを選択した場合、~/.gnomercファイルがあれば、そこから追加の設定が読み込まれる。

より高度な選択肢は、~/.xsessionファイルを使用することだ。 このファイルが存在する場合、システム全体のデフォルトのx-session-managerまたはx-window-managerの代わりに使用される。 したがって、このファイルを使用する場合は、目的のウィンドウ・マネージャー(WM)またはデスクトップ環境(DE)が起動するようにしなければらない。

以下は単純化した~/.xsessionの例である:

xsetroot -solid gray
xmodmap -e "keysym Super_L = Multi_key"
xset s off; xset dpms 0 1800 0
exec fvwm

~/.xsessionrcと同様に、WMやDEの前に実行するXクライアントアプリケーションは、自然に短時間で終了するか、バックグラウンドで明示的に起動する必要がある。 スクリプトの最後のコマンドは、WMまたはDEの通常の起動コマンドを実行するexecでなければならない。 (これを決める方法がわからない場合は、WMまたはDEのドキュメントを参照するか、よりシンプルな~/.xsessionrcを使用して欲しい)。

最後に、~/.xsession ファイルは Debian X セッションを使用している場合のみ読み込まれることに注意して欲しい。 gdm3でログインしてGNOMEセッションを選択した場合、~/.xsessionファイルは完全に無視される。(ただし、~/.xsessionrcを使用することはできる)。