(2018.11.18 更新)
Xは, display manager か xinit(1) で起動する。現代的には, display manager (XDM, GDM, KDM, or LightDM) がXを立ち上げて, ログイン画面を表示する。
ウィンドウマネジャを含むデスクトップ環境 (desktop environment) を起動するコマンドは, どこから実行されるのか。
同じ Linux でも, ディストリビューションによって意外と, スクリプトファイルの場所や機能がバラバラ。困るな。
[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
GRUB_GFXPAYLOAD_LINUX
GRUB_TERMINAL_OUTPUT
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 コマンドを叩くと、使えるモードが一覧表示できる。
このページでは, 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 由来か?
Debian系. Ubuntu も.
グローバル X セッションスクリプト /etc/X11/Xsession
を起動するだけ.
$HOME/.Xclients
or /etc/X11/xinit/Xclients
は実行しない。
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
を手書きする必要がある。
/etc/X11/xinit/xinitrc.d
以下にあるファイルを順に実行.
その後、failsafe で, twm & xterm を起動するだけ。
/etc/X11/Xsession
も, /etc/X11/xinit/Xclients
も、どちらもない。
Xsession
シェルスクリプトファイルの場所が違う。
ファイルの場所は /etc/X11/Xsession
.
/etc/X11/Xsession.d/
以下のスクリプトを順番に実行していく.
◆ /etc/X11/Xsession.d/50x11-common_determine-startup
::
$STARTUP
を設定する.
$HOME/.xsession
か $HOME/.Xsession
(Xが大文字) があれば、これが $STARTUP
になる。
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) 関係.
/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