Table of Contents
X Window Systemとは?
LinuxのGUIは多くのディストリビューションでX Window Systemと呼ばれる仕組みで提供されています. X Window SystemはX11(正確にはversion 11のXプロトコルを実装したX Window System)やXと呼ばれたりします.
1
2
3
4
5
6
7
## X Window Systemを利用している場合
% echo $XDG_SESSION_TYPE
x11
## Waylandを利用している場合
% echo $XDG_SESSION_TYPE
wayland
X Window SystemはXサーバ, ディスプレイマネージャxdm, ウィンドウマネージャtwm, 基本的なXクライアント, Xライブラリ, フォントファイルなどから構成されていますが, 一義的にはクライアントサーバー方式を採用したネットワーク型のウィンドウシステムです.
X Window Systemの仕組み
X Window Systemにおいて,
Xサーバー | キーボードからの入力処理や, ディスプレイへの出力処理等のハードウェアの管理を行う | Xorg |
Xクライアント | クライアント | Webブラウザ,オフィスのアプリケーション,xclockなど |
XサーバーとXクライアントはXプロトコルで通信するので,XクライアントとXサーバーが異なったアーキテクチャをもつハードウェアやOS上にあっても動作することができます(=同一ホストである必要はない)
sequenceDiagram
participant A AS 入力機器
participant B AS ディスプレイ
box ローカルホスト
participant C AS Xサーバー
participant D AS Xクライアント<br>(gnome-terminal etc)
end
A->>C: 入力
C->>D: Xサーバは入力データを<br>受け付けて<br>Xクライアント(アプリ)<br>にデータを送る
D->>C: Xクライアントは受け取った<br>データを処理して<br>処理結果をXサーバへ送る
C->>B: XサーバはXクライアント<br>から受け取った<br>処理結果をディスプレイ<br>に出力
上記の処理がX Window Systemの処理の流れとなります. このようにXサーバーは, 各Xクライアント間の調整やユーザー側とXクライアントの仲介をするものと理解することができます.
X Window Systemが起動するまでの流れ
X Window Systemが起動するまでの流れは
- テキストログイン(ランレベル3)の場合
- グラフィカルログイン(ランレベル5)の場合
の2種類があります. 基本的にはGUI環境でログインする機会が多いので, 日常的には後者がメインとなります.
テキストログインの場合
テキストログインの流れ
- ランレベル3で立ち上げ
- テキストベースでログイン
startx
コマンドを実行 →xinit
コマンドでXサーバとクライアントアプリケーションを起動
flowchart TD
A[ multi-user.target経由でログイン ] --> B[コンソールからstartxコマンドを実行]
B --> C[xinitコマンド]
C -->D{~/.xinitrcがあれば実行}
D -->|no| E[ /etc/X11/xinit/を実行 ]
D -->|yes|F
E --> F[Xサーバー起動]
F --> Z{ ~/.xsessionを実行}
Z -->|no| G{~/.Xclientsを実行}
G -->|no| H{ /etc/X11/xinit/Xclientsを実行}
Z -->|yes| I[統合デスクトップ環境GNOMEや<br>ウィンドウマネジャーが起動]
H -->|yes| I
G -->|yes| I
startx
はxinit
を起動するシェルスクリプトxinit
はXサーバを起動するプログラム/etc/X11/xinit/Xclients
: ウィンドウマネージャの起動.xinitrc
: startxやxinitコマンドで読み込まれるスクリプト.xsession
: 起動後の処理設定. ログイン後の起動プログラムの定義スクリプト
グラフィカルログインの場合
Xサーバー(/usr/bin/Xorg
)をもつシステムについて, 起動シーケンスを介してsystemd
がgraphical.target
を起動すると
- ディスプレイマネージャ(
gdm
,kdm
,xdm
が有名)が起動 - ディスプレイマネジャーがXサーバ(通常は
/usr/bin/Xorg
)を起動 - グラフィカルログイン画面が表示
という流れになります. /lib/systemd/system/graphical.target
を確認すると以下のようにdisplay-manager.service
を呼んでいます.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
% cat /lib/systemd/system/graphical.target
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes
ディスプレイマネージャからログインした後,セッションが開始してX Window画面を表示します. Xsession起動シーケンスはランレベル3の場合と同じになります.
X Window Systemにおけるアプリケーション
アプリケーションをディスプレイに表示する
Rule
- Xのアプリケーションは環境変数
DISPLAY
で司祭されたディスプレイに表示される
1
2
## DISPLAU変数の書式
サーバー名:ディスプレイ番号.スクリーン番号
サーバー名 | リクエストの送り先のXサーバーを指定,省略するとlocalhostになる |
ディスプレイ番号 | 同じキーボードとマウスを共有するモニタの集合に対して付けられる(通常は0) |
スクリーン番号 | モニタに付けられる番号(一台目は0) |
アプリケーション xclock を2台目のモニタに表示する場合は, Xクライアント側で環境変数 DISPLAY
の設定が必要なので
1
% export DISPLAY=:0.1; xclock
となります.
Appendix: ウィンドウマネージャと統合デスクトップ環境
Def: ウィンドウマネージャ
ウィンドウマネージャはWindow System Xの外観を管理するシステム. ウィンドウの外観, アイコン, メニュー などを提供しユーザが設定できるようになる.
ウィンドウマネジャーの種類として, Metacity
, Kwin
, twm
, fvwm
, enlightment
が有名です. ウィンドウマネジャーはあくまでもユーザーがログインした後に立ち上がります.
ウィンドウヘッダのデザインが変更されてしまった/したい場合は, ウィンドウマネージャの設定を変更します.
ログイン画面の表示を変更したい場合は, etc/X11/xdm/Xresources
(設定ファイル自体とは別)のようにディスプレイマネージャの方で表示変更を行います.
Def: 統合デスクトップ環境
ウィンドウマネジャーにデスクトップ用のユーティリティを組み合わせたものを総合デスクトップ環境と呼ぶ.
GNOMEが有名ですが, Ubuntuインストール時にLibreOfficeやFirefoxなどのツールがついていますが, これは UbuntuがGNOMEという総合デスクトップ環境を提供してくれているからです. また定義より, ウィンドウマネジャーも 統合デスクトップ環境が提供する機能の一部といえます.
References
- Ryo’s Tech Blog > reboot コマンド/poweroff コマンドの仕組み
- Ryo’s Tech Blog > Sys V initに基づくLinux Boot Sequence
- Linux - Display Manager
(注意:GitHub Accountが必要となります)