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

(2018.11.18 更新)

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

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

同じ Linux でも, ディストリビューションによって意外と, スクリプトファイルの場所や機能がバラバラ。困るな。

SDDMの解像度

[2020.11] Fedora 33 Linux の場合。

KDE5 では display manager として SDDM が使われる。ログイン後にユーザ設定に基づき解像度が切り替わるが、ではSDDM の解像度はどこで設定するのか。

いろいろ試してみたが, カーネル起動時の設定がよさそう。出来上がりは /boot/grub2/grub.cfg ファイル。こういう文字列が含まれる。

# grep -i gfx /boot/grub2/grub.cfg 
  set gfxmode=1024x768x32
  insmod gfxterm
terminal_output gfxterm

昔は vga= パラメータだった。次でも動くは動く。

# grep -i vga /boot/grub2/grub.cfg
  insmod vga
  set kernelopts="root=/dev/mapper/fedora_localhost--live-root ro resume=/dev/mapper/fedora_localhost--live-swap rd.lvm.lv=fedora_localhost-live/root rd.lvm.lv=fedora_localhost-live/swap rhgb quiet vga=833 "

しかし、モード番号は, (今は) 標準がない。gfxmode のほうが簡単でいい。See VESA Video Modes - OSDev Wiki Common Mistakes

/etc/default/grub ファイルを編集する。変数 GRUB_GFXMODE などで設定。Debian系も同じ。

GRUB_GFXMODE
デフォルトは"auto"。
GRUB_GFXPAYLOAD_LINUX
デフォルトは"text"。
GRUB_TERMINAL_OUTPUT
デフォルトは "console"。
GRUB_TERMINAL_OUTPUT="gfxterm"
GRUB_GFXPAYLOAD_LINUX="keep"
GRUB_GFXMODE="1024x768x32"

更新する。

# grub2-mkconfig -o /boot/grub2/grub.cfg 
Generating grub configuration file ...
done

Debian系:

# /usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-5.9.0-2-amd64
Found initrd image: /boot/initrd.img-5.9.0-2-amd64
Found linux image: /boot/vmlinuz-5.9.0-1-amd64
Found initrd image: /boot/initrd.img-5.9.0-1-amd64
done

これだけ。簡単。

GRUB のコマンドプロンプトで videoinfo コマンドを叩くと、使えるモードが一覧表示できる。

startxxinit

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

man startx.1

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

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

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

次, xinit について。man xinit.1.

場所は /usr/bin で, 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