startx 〜 デスクトップ環境の起動まで

(2018.11.18 更新)

Xは, display manager か xinit(1) で起動する。現代的には, display manager (XDM, GDM, KDM, or LightDM) がXを立ち上げて, ログイン画面を表示する。

ウィンドウマネジャーを含むデスクトップ環境 (desktop environment) を起動するコマンドは, どこから実行されるのか。

OSによって, 意外と, スクリプトファイルの場所や機能がバラバラ。困るな。

このページでは, startx(1) から辿ってみる.

startxxinit

man startx.1

startx はシェルスクリプトで, /usr/bin/startx にある. NetBSD 8.0 は, /usr/X11R7/bin/startx で, 場所が違う.

$(HOME)/.xinitrc か, なければ /etc/X11/xinit/xinitrc ファイルを xinit(1) コマンドの引数として渡す:

xinit "$client" $clientargs -- "$server" $display $serverargs

man xinit.1.

場所は /usr/bin/xinit で, ELFバイナリ. これがXサーバを起動する.

/etc/X11/xinit/xinitrc スクリプト

このスクリプトが実行されるところまでは同じだが、内容が三者三様になっている。

$HOME/.Xclients は Solaris 由来か?

SparkyLinux 5.5

Debian系. Ubuntu も.

グローバル X セッションスクリプト /etc/X11/Xsession を起動するだけ.

$HOME/.Xclients or /etc/X11/xinit/Xclients は実行しない。

Fedora 28

Red Hat系. CentOS も.

$HOME/.Xclients か, なければ /etc/X11/xinit/Xclients を実行する.

いずれも存在しなければ, failsafe として, xsetroot, xclock, xterm & twm を実行する.

グローバル X セッションスクリプトは, /etc/X11/xinit/Xsession にあるが, xinitrc からは呼び出されないようだ。display manager の場合のみか?

/etc/X11/xinit/Xclients シェルスクリプト::

/etc/sysconfig/desktop ファイルを読み込み, $DESKTOP 変数に基づいて, GNOME, MATE, KDE, LXDE が選択されて、セッションマネジャを起動する.

$DESKTOPの値 セッションマネジャ
GNOME gnome-session
MATE mate-session
KDE startkde
LXDE startlxde

/etc/sysconfig/desktop ファイルは次のようなもの::

DESKTOP="KDE"
DISPLAYMANAGER="KDE"

これら以外のデスクトップ環境を使いたいときは, このファイルが実行されないように, $HOME/.Xclients を手書きする必要がある。

NetBSD 8.0

/etc/X11/xinit/xinitrc.d 以下にあるファイルを順に実行.

その後、failsafe で, twm & xterm を起動するだけ。 /etc/X11/Xsession も, /etc/X11/xinit/Xclients も、どちらもない。

グローバル Xsession シェルスクリプト

ファイルの場所が違う。

SparkyLinux 5.5

ファイルの場所は /etc/X11/Xsession.

/etc/X11/Xsession.d/ 以下のスクリプトを順番に実行していく.

/etc/X11/Xsession.d/50x11-common_determine-startup ::

$STARTUP を設定する.

  1. $HOME/.xsession$HOME/.Xsession (Xが大文字) があれば、これが $STARTUP になる。
  2. なければ、次の順で決まる:
    if [ -z "$STARTUP" ]; then
      if [ -x /usr/bin/x-session-manager ]; then
        STARTUP=x-session-manager
      elif [ -x /usr/bin/x-window-manager ]; then
        STARTUP=x-window-manager
      elif [ -x /usr/bin/x-terminal-emulator ]; then
        STARTUP=x-terminal-emulator
      fi
    fi
    

このようにして $STARTUP を決めたうえで, exec $STARTUP する。シンボリックリンクになっている。

$ ls -l /usr/bin/x-*
lrwxrwxrwx 1 root root 35  9月  5  2012 /usr/bin/x-session-manager -> /etc/alternatives/x-session-manager
lrwxrwxrwx 1 root root 37  9月  5  2012 /usr/bin/x-terminal-emulator -> /etc/alternatives/x-terminal-emulator
lrwxrwxrwx 1 root root 34  9月  5  2012 /usr/bin/x-window-manager -> /etc/alternatives/x-window-manager
lrwxrwxrwx 1 root root 31  9月  5  2012 /usr/bin/x-www-browser -> /etc/alternatives/x-www-browser

update-alternatives コマンドで選択できる。

$ update-alternatives --get-selections
中略
x-session-manager              auto     /usr/bin/startlxde
x-terminal-emulator            manual   /usr/bin/lxterminal
x-window-manager               auto     /usr/bin/openbox
$ update-alternatives --config x-session-manager
alternative x-session-manager (/usr/bin/x-session-manager を提供) には 3 個の選択肢があります。

  選択肢    パス                    優先度  状態
------------------------------------------------------------
* 0            /usr/bin/startlxqt         50        自動モード
  1            /usr/bin/openbox-session   40        手動モード
  2            /usr/bin/startlxqt         50        手動モード
  3            /usr/dt/bin/Xsession       10        手動モード

現在の選択 [*] を保持するには 、さもなければ選択肢の番号のキーを押してください: 
/usr/dt/ にあるのがCDE (CommonDesktopEnvironment) 関係.

Fedora 28

/etc/X11/xinit/Xsession スクリプトは, xorg-x11-xinit パッケージのファイル。

前述の /etc/X11/xinit/Xclients と違い, switchdesk(1) 対応のスクリプトになっている、ようだ。しかし、中身が古い。switchdesk パッケージは, 標準ではインストールされないので、結局のところ使われていない?

~/.xsession をログイン時に呼び出されるようにするには, xorg-x11-xinit-session パッケージをインストールする必要がある。このパッケージは、次の2ファイルを入れる::

  • /usr/libexec/xinit-compat
  • /usr/share/xsessions/xinit-compat.desktop