第15章 グラフィカル環境の設定
LPIC-1 106.1〜106.3 相当
サーバー管理では普段CUIしか使わなくても、GUIの仕組みを理解しておく必要がある場面があります。リモートの画面共有トラブルの切り分けや、アクセシビリティ設定の代行など、LPIC-1の106番台で問われるグラフィカル環境の基礎を扱います。
X Window System のアーキテクチャ
Linuxのグラフィカル環境の土台になってきたのがX Window System(X11)という仕組みです。Xには「サーバー」と「クライアント」という2つの役割がありますが、この呼び方は直感と逆になりがちなので注意が必要です。Xサーバーは、実際にディスプレイ・キーボード・マウスといったハードウェアを直接扱う側(つまり手元のマシン)を指し、Xクライアントは、ブラウザやエディタなど「画面に何かを描画してほしい」と要求するアプリケーション側を指します。
この設計のおかげで、Xクライアントとサーバーはネットワーク越しに分離できます。これをネットワーク透過性と呼びます。例えば、リモートサーバー上で動かしたアプリケーションのウィンドウを、手元のパソコンのXサーバー(画面)に表示する、といったことが可能です。手元のマシンが「サーバー」、遠隔のマシンで動くアプリが「クライアント」という向きになる点を、まずは押さえておきましょう。
Wayland との違いと移行の現状
Waylandは、X11の後継として開発された、より新しいディスプレイサーバープロトコルです。X11ではXサーバーが「表示の管理」と「入力の管理」を一手に引き受けていましたが、Waylandではコンポジタ(画面の合成処理を行うプログラム)がその役割を統合し、アプリケーションがより直接的に画面へ描画できる設計になっています。この違いにより、Waylandは一般にセキュリティ面や描画の遅延(レイテンシ)で有利とされています。
X11には設計上、任意のXクライアントが他のクライアントのウィンドウの内容を覗いたり、キー入力を横取りしたりできてしまうという弱点があります。これはXがネットワーク越しの利用を前提に、あえて制限をゆるく設計してきた歴史的経緯によるものです。Waylandでは、コンポジタがすべての描画・入力のやり取りを仲介し、アプリケーションごとに扱える範囲を分離することで、こうした盗み見や入力の横取りを構造的に防いでいます。
近年の主要ディストリビューションでは、デスクトップ環境の既定がWaylandに移行しつつありますが、古いアプリケーションやリモート表示の仕組みの中には、まだX11を前提にしたものが少なくありません。そのため多くの環境では、XWaylandという互換レイヤーを介してX11用アプリケーションもWayland環境上で動かせるようになっています。LPIC-1の出題範囲は現時点でも主にX11の仕組みを対象にしているため、この章でもX11を中心に扱います。
DISPLAY環境変数とリモートアクセスの制御
あるXクライアントがどのXサーバーに描画すればよいかは、DISPLAYという環境変数で指定します。書式はhost:display.screenで、hostを省略するとローカルのXサーバーを指します。
$ echo $DISPLAY
:0
$ DISPLAY=192.168.1.50:0.0 xterm # 192.168.1.50のXサーバーにxtermを表示させる
他のホストからの接続を許可するかどうかは、xhostコマンドで制御します。xhost +は、認証なしで誰でも接続を許可してしまう設定であり、同一ネットワーク上の第三者に画面の操作を許してしまう危険があります。より安全な方法として、xauthコマンドと、各ユーザーのホームディレクトリにある~/.Xauthorityファイルによる、クッキーベースの認証の仕組みが使われます。
xhost +は、ホスト名やユーザーを指定しない全許可の設定であり、本来は避けるべき設定です。特定のホストだけを許可するxhost + ホスト名や、後述のSSH X11転送を使うほうが安全です。
より実務的な方法として、SSH X11転送があります。ssh -X user@hostのように接続すると、リモートホスト上で起動したXクライアントの描画を、SSHの暗号化された通信路経由で手元のXサーバーに転送できます。-Xは標準の(制限付きの)転送、-Yはより信頼度の高い転送として扱われ、一部のアプリケーションでは-Yでないと正しく動作しないことがあります。
$ ssh -X user@remote-server
$ echo $DISPLAY # SSH側が自動的にDISPLAYを設定してくれる
localhost:10.0
$ xclock # リモート側で起動したxclockが、手元の画面に表示される
このときDISPLAYがlocalhost:10.0のように、見慣れない番号になっている点に注目してください。これはSSHが、リモート側からの描画要求をトンネリングするための仮想的なXサーバーをローカルに用意し、そこに転送しているためです。xhostで全体を緩めなくても、SSH接続だけで安全に画面を転送できるのは、この仕組みのおかげです。
xterm: Xt error: Can't open displayのようなエラーが出る場合、DISPLAYが正しく設定されていない、SSH接続時に-X/-Yを付け忘れた、またはリモート側のsshd設定でX11Forwarding yesが有効になっていない、といった原因が考えられます。まずはecho $DISPLAYで値が入っているかを確認すると、切り分けの手がかりになります。
Xの設定ファイルとツール
Xサーバーの動作は、伝統的に/etc/X11/xorg.confという1つの設定ファイル、または/etc/X11/xorg.conf.d/ディレクトリ以下に分割された複数の設定ファイルで管理されます。ファイルの中は、役割ごとにSectionというブロックに分かれています。
| Sectionの種類 | 役割 |
|---|---|
Device | グラフィックカード(GPU)の設定 |
Monitor | モニターの仕様(リフレッシュレートなど) |
Screen | DeviceとMonitorを組み合わせた画面全体の設定 |
InputDevice | キーボード・マウスなど入力デバイスの設定 |
ServerLayout | 複数のScreen・InputDeviceをまとめる全体レイアウト |
Xorg -configureを実行すると、接続されているハードウェアを自動検出して設定ファイルのひな形を生成できます。ただし近年のXサーバーはハードウェアの自動検出精度が上がっているため、多くの環境ではxorg.confを手動で用意しなくても問題なく起動します。設定ファイルが必要になるのは、特殊な構成(マルチGPU、特殊なモニター配置など)を明示的に指定したい場合が中心です。
画面が起動した後の解像度やマルチディスプレイの配置は、xrandrコマンドで確認・変更できます。
$ xrandr
Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 8192 x 8192
HDMI-1 connected primary 1920x1080+0+0 ...
$ xrandr --output HDMI-1 --mode 1280x720 # 解像度を変更
ディスプレイマネージャとデスクトップ環境
電源投入後、ログイン画面を表示してユーザー認証を行い、成功したらデスクトップ環境を起動する役割を持つのがディスプレイマネージャです。代表的なものに、GNOMEでよく使われるGDM、KDE Plasmaでよく使われるSDDM、軽量なLightDMがあります。ディスプレイマネージャ自体はデスクトップ環境と切り離されているため、GDMでKDE Plasmaを起動する、といった組み合わせも可能です。
ログイン後に実際に操作する画面一式がデスクトップ環境です。GNOMEとKDE Plasmaは機能が豊富な大規模デスクトップ環境、XfceとLXDEは動作が軽く低スペックな環境でも動きやすい、といった特徴で使い分けられます。
リモートデスクトップの選択肢
離れたマシンの画面を丸ごと操作したい場合、いくつかの方式があります。
| 方式 | 特徴 |
|---|---|
| XDMCP | Xのディスプレイマネージャに直接ネットワーク経由でログインする古い方式。暗号化されないため、現在はSSHトンネル越しでの利用などが推奨される |
| VNC(TigerVNC / x11vnc) | 画面のピクセル情報を転送する方式。OSを問わず利用でき、既存のデスクトップをそのまま共有できる |
| RDP(xrdp) | Windowsで標準的なリモートデスクトッププロトコルをLinux側でも受け付けられるようにする実装 |
| SPICE | 主に仮想マシンのコンソール表示に使われるプロトコルで、音声やUSBリダイレクトなど仮想化に強い機能を持つ |
アクセシビリティ機能
キーボードやマウスの操作が難しいユーザーのために、デスクトップ環境にはさまざまなアクセシビリティ機能が用意されています。スティッキーキー(CtrlやShiftなどの修飾キーを押しっぱなしにせず、順番に押すだけで組み合わせ入力ができる機能)、スローキー(キーを一定時間押し続けないと入力と認識しない機能)、バウンスキー(同じキーの連続入力を一定時間無視する機能)、トグルキー(Caps LockなどON/OFF切り替え時に音で知らせる機能)、リピートキー(キーを押し続けたときの連続入力の速度調整)、マウスキー(テンキーでマウスカーソルを操作する機能)などが代表的です。
視覚に障害があるユーザー向けには、画面の内容を読み上げるスクリーンリーダー(GNOMEのOrca、古くから使われるEmacspeakなど)、画面の一部を拡大表示する画面拡大(GNOME Magnifierなど)、見やすさを高める高コントラストテーマ、キーボード操作が難しい場合に画面上でクリック入力するオンスクリーンキーボード(GOKなど)も用意されています。
graphical.targetとmulti-user.targetの切り替え
systemdを使うディストリビューションでは、GUIを起動するかどうかはターゲットという単位で管理されています。GUIを含む通常のデスクトップ環境はgraphical.target、GUIを使わないCUIのみのサーバー用途はmulti-user.targetに対応します。graphical.targetは内部的にmulti-user.targetを包含しており、CUIの機能一式に加えてディスプレイマネージャの起動が上乗せされた状態と考えると理解しやすくなります。
$ systemctl get-default
graphical.target
$ sudo systemctl set-default multi-user.target # 次回起動時からCUIのみで起動するように変更
$ sudo systemctl isolate multi-user.target # 再起動せずに今すぐCUIのみの状態へ切り替える
サーバー用途のマシンでは、GUI関連のパッケージやサービスを常時起動しておくとメモリやCPUの無駄になるため、既定値をmulti-user.targetにしておき、必要なときだけ一時的にGUIを起動する運用がよく取られます。