• Windows Subsystem for Linuxガイド 第23回 Linux GUIアプリを動かすWSLg「基本編」

今回は、WSL2で、Linux GUIアプリケーションを動作させるためのWSLgについて解説を行う。まずは、LinuxのGUIシステムになれていないユーザーのためにWSLにおけるLinuxのGUIシステムの基本的な部分やWSLgの仕組みなどを解説する。

LinuxのGUIシステム

以後、WSLのGUI環境(WSLg)を整えるための解説を行うが、まずは、基本的な用語を表01に示す。基本的には、WSLgの構成を変更する必要はないものの、たとえば、GUI環境を日本語対応させる程度の設定は必要になる。

  • ■表01

X Window System

Linuxは、Unixで作られたX Window SystemをベースにしたGUIシステムを使う。Linuxの現在の状況を説明するため、その基本となるX Window SystemによるGUI環境をまずは解説する。

X Window Systemは、Unix用に作られたウィンドウシステムである。このXでは、単一のシステムでGUIすべてを実現するのではなく、複数のコンポーネントを組み合わせて、GUIシステムを構築できるように構成されている(図01)。特徴として、ネットワークを介して表示を行えるように、X自体がプロトコルとして定義されたことがある。また、X自体はユーザーインターフェースは何も規定せず、他のコンポーネントとの組み合わせにより、GUIやデスクトップを実現することを想定した。

  • 図01: LinuxのGUIシステムの基本となったX Window System。複数のモジュールが連携してGUI環境を実現し、モジュール単位で差し替えることも可能

これに対して、Windowsは、最初からGUI環境を提供するために作られたため、内部的には複数のコンポーネントから構成されていても、アプリケーション側からは、単一のGUI/デスクトップシステムしか見えず、これを差し替えることもできない。ウィンドウ表示やGUI、デスクトップなどを構成する部分を「Windowsサブシステム」と呼ぶ(図02)。

  • 図02: Windows GUI環境は、変更ができない単一の仕組みで、Windowsサブシステムなどと呼ばれる

デスクトップ環境

こうした基本的な枠組みができたのち、Xを中心に、複数の「デスクトップ」が作られることになる。Windowsのデスクトップを見るとわかるように、単なる画面ではなく、アイコンやタスクバー、スタートメニューなどの各種のオブジェクトや、コンテキストメニュー、ダイアログボックス、ウィンドウのタイトルバーやメニューといった部品など、GUIの統一した機能を提供するのがデスクトップ環境である。また、考え方にもよるが、時計や電卓プログラムといった「アクセサリ」プログラムや、エクスプローラーのようなファイルブラウザもデスクトップ環境に含めることがある。

Linuxは、多数のソフトウェアをまとめて「ディストリビューション」として配布されることになっているが、このとき、ディストリビューションにより、デフォルトの「デスクトップ環境」が決まる。ただし、異なるデスクトップ環境向けに作られたアプリケーションであっても、まったく動作できないわけでもない。

異なるデスクトップ環境も結果的には、Xの上で動作しており、この点では、すべて互換性がある。UIツールキットは、自身ですべての描画を行い、ウィンドウの表示のみをXに委ねるものと、Xの描画コマンドを使ってウィンドウ内の描画を行うものに大別されるが、どちらもウィンドウの描画に関しては、Xプロトコルで行うからだ。

Wayland

Xが作られてからすでに40年が経過している。その間にさまざまな改良が行われたが、40年の間にハードウェアも大きく変化した。しかし、Windowsが過去のアプリケーションも動作させているように、互換性は重要な問題であり、簡単にGUIの仕組みを切り替えるわけにもいかない。このため、Xが作られたときのGUI構造がいまでも保たれているが、これを置き換えようとする動きもある。

 その1つがWaylandと呼ばれるシステムだ(図03)。Waylandは、ディスプレイサーバーとウィンドウマネージャーを組み合わせた「コンポジタ」として動作する。組み合わせた最大の理由は、GPUを使ってデスクトップを合成する「コンポジット型」を実現するためだ。Xが作られたとき、デスクトップは、「スタック型」と呼ばれる考え方で作られていた。しかし、スタック型では、効率が悪く、ウィンドウの中身には変化がなくても、ウィンドウの重なり具合などで再描画が発生し、システムに負荷がかかってしまう。

  • 図03: WaylandもX同様プロトコルとして定義されている。これをWaylandコンポジタと呼び、いくつかの実装がある

その後、メモリは増え、GPUなどのビットマップ合成をハードウェアで行うことが可能になってきた。ここで登場したのが、コンポジット型ウィンドウマネージャである。コンポジット型では、アプリケーションが描画したウィンドウを、GPUのビットマップ合成機能などを使って、イメージのレベルでデスクトップを合成し、これを表示させる。

Xをコンポジット型に改良することは不可能ではなかったが、効率がよいものでもなかった。このために、ディスプレイサーバーやウィンドウマネージャを置き換える動きが出てきた。Waylandはその1つである。

このWayland自体もX同様にプロトコルとして定義が行われている。そのリファレンス実装(実際のプログラムソース)として作られたものをWestonという。Wayland自体はプロトコルの定義であり、これを元に作られたものがWaylandコンポジタである。Westonはその1つで、このほかにもいくつかWaylandコンポジタが存在している。

このWaylandのプロトコルは、Xとの直接の互換性はない。このためにXのプロトコルを受け付けて、Waylandに描画などを行わせるXWaylandというプログラムモジュールも作られた。これは、アプリケーション側から見るとXのディスプレイサーバーとして動作するが、その処理をすべてWaylandで処理するものだ。

WSLgの仕組み

2020年にマイクロソフトは、WSL2でLinuxのGUIアプリケーションを動作させるためのWSLgを発表した。WSLgは、Linuxディストリビューション用のバイナリのGUIアプリケーションを変更することなく実行できる。つまり、GUI部分については、前出のXの仕組みや後継のWaylandと互換性がある。

ただし、大きな違いとして、WSLgを使う場合、デスクトップ環境は存在せず、WindowsデスクトップにGUIアプリケーションのウィンドウが直接表示される点だ。逆に言うと、WSLgの場合、WindowsのデスクトップがLinuxデスクトップ環境の代わりに使われる。

もう1つは、ディスプレイサーバー、ウィンドウマネージャなどGUIを構成する大半のプログラムは、稼働中のディストリビューション内には存在せず、WSLg専用のsystemと呼ばれるディストリビューション側で動作している点だ(図04)。これが可能になるのは、XもWaylandもプロトコルとして定義されており、ソケットを介してX/Wayland側と通信を行うからだ。

  • 図04: WSLgでは、systemディストリビューションでWayland(リファレンス実装のWestonを利用)などを動かし、WSLディストリビューションとはソケット経由で接続、Wayland、Xプロトコルを受け付ける。Win32側とはHyper-Vソケットを経由してRDPでウィンドウ描画を行う

WSLgでXアプリケーションを起動する

現在のWSLでは、標準でWSLgが組み込まれており、Xのアプリケーションなどをディストリビューションにインストールすれば、これを起動することができる。

まずは、X用に作られたアプリケーションを動かしてみる。ここでは、WSLディストリビューションとしてUbuntuを使う。

著名なXのプログラムに、Xのデモ用プログラムかある。まずは、パッケージのインストールを行う。


sudo apt update
sudo apt install x11-apps -y

このパッケージには、27個のプログラム(表02)が含まれている(写真01)。どれも、プログラムとしては簡単なものだが、Xのプログラミングのサンプルとして重要なものだ。たとえば、xeyesは、マウスの動きを追跡して目玉を動かすプログラムだ。


xeyes &
  • ■表02

  • 写真01: "x11-apps"パッケージに含まれるアプリケーション。画面左側、上から2番目がxeyes

次に、UIツールキットを使ったプログラムを起動してみる。UIツールキットGTKを使う“gedit”だ(写真02)。これは、GNOMEというデスクトップ環境の標準的なテキストエディタとして使われている。

  • 写真02: UIツールキットGTKを使ったGNOMEデスクトップ環境用のエディタgedit


sudo apt install gedit -y
gedit &

geditをインストールすると、Win32側であるスタートメニューの「すべてのアプリ」にあるディストリビューション名のフォルダーに、“Text Editor”が登録される(写真03)。これは、WSLディストリビューション内で、geditがデスクトップ環境のラウンチャーに自身を登録する処理をWSLgが検出してスタートメニューに登録を行う。このとき、Win32側からLinux GUIアプリケーションの起動に使われるのがwslg.exeである。

  • 写真03: Linuxディストリビューションにデスクトップ環境に自身を登録するアプリケーションをインストールすると、Win32側のスタートメニューにも起動ショートカットが登録される

WSLgを使うことで、LinuxのGUIアプリケーションを通常のLinuxディストリビューションとおなじようにインストールして実行できる。ただし、いくつかの問題があり、たとえば、日本語入力を行うことができない。そのためには、WSLディストリビューション側にLinux用の日本語入力プログラム(IME。Input Method Engine。WindowsのIME:Input Method Editorとは異なる)をインストールする必要がある。次回は、WSLgの日本語環境整備を行う。

Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/