LinuxのX11に関する世界観(1.アーキテクチャ)です。
自分の書いたブログ「神々とともに生きる詩人」2021/01/27より。
Linuxでは、GUI環境をWindowsと同様に利用することができる。
このために、Xサーバーを使う。
X Window System(X11)は、クライアント・サーバー方式で、ネットワーク透過と呼ばれるネットワーク通信をサポートしており、その中核のプトロコルをXプロトコルと呼ぶ。
Xプロトコルは、ディスプレイを表示するXサーバーと、アプリケーションウィンドウを担当するXクライアントの間で、ネットワークで通信しながら、マウスボタンクリックなどのイベントメッセージをやり取りする。
Xプロトコルの詳細を知らなくてもいいように、Xlibと呼ばれるライブラリが用意されており、プログラマはXlibを使ってXクライアントを書くことができる。
また、X11においては、ウィンドウを表示するプロトコルとAPIは決まっていても、ボタンやメニューなどのウィジェットツールキットまでは用意されていない。
そのため、Motif, Qt, GTKなどのウィジェットツールキットを用いてアプリケーションを書くことが一般的である。
また、X11はウィンドウマネージャと呼ばれるGUI環境を用いて、ユーザーは操作するが(これがWindowsやMacの環境に相当する)、標準ではとても簡素なウィンドウマネージャしか提供されておらず、これを使ってデスクトップ環境を操作することは一般的ではない。
ウィンドウマネージャにはたくさんの種類があるが、ウィンドウマネージャだけではなく、統合的なデスクトップ環境を与えるものとして、GNOME, KDE, Xfce, MATE, Cinnamonなどがある。
GNOMEではツールキットにGTKが、KDEではツールキットにQtが採用されている。
X11はディスプレイ、キーボード、マウスなどのデバイスを管理し、それぞれの通信を処理して、2Dグラフィックスの「ウィンドウ」をディスプレイに表示し、マウスやキーボードなどでデバイスからの操作や要求があった場合は、「イベント」としてそれらを処理する。
X11の担当範囲はカーネルの担当範囲と重なることがある。特に、グラフィックチップ・グラフィックボードなどの設定は、X11で設定する必要がある。最近は、モジュールによって自動的に読み込まれることが多い。
X11ではネットワーク透過と呼ばれる、ネットワーク処理をXサーバーとXクライアントの間で行う。これをネットワーク透過と言う。Xサーバーは自分の使うマシンで動作するが、Xクライアントは自分のマシンではなくても、ネットワーク上にあるどのマシンのXクライアントとも、ネットワークと繋いで自分のXサーバーから表示・操作することが出来る。
マウス移動や文字入力などのイベントはXサーバーで処理されて、ディスプレイにマウスカーソルや(システムのフォントを用いた)文字を表示する。また、クリックなどのイベントは個別のXクライアントのウィンドウにイベント駆動で送られる。
Xプロトコルにより、Xはネットワーク透過な通信をXサーバーとXクライアントの間で行う。Xサーバーで発生したイベントは、マウスやキーボードなどのデバイスと、クライアントであるXアプリケーションの間でやり取りされ、その間で通信を行う。
X11のネットワーク透過は、グラフィックス操作におけるネットワーク分散処理を可能にする。これは古い技術だと思われることが多いが、コマンドラインでSSHを実行するのと同様に、GUIでの操作や処理において早い段階からネットワーク通信をベースにした設計がなされているという点では、Windowsなどの競合システムよりも優れた点かもしれない。
Xlibは、クライアント向けのライブラリで、Xプロトコルの詳細を知らなくても、XクライアントがXサーバーと通信ができるようになっている。
Xlibでは、イベント駆動としてメッセージループと呼ばれる仕組みを使う。これはWindows APIなどと同等のシステムで、何かのイベントがそのプログラムに常に送られ続ける、というループを条件分岐で処理することで、メッセージを監視・処理することで、1つのループとしてクライアントプログラムを書くことができる。
また、XlibでXアプリケーションを書くことはできるが、Xlibにはボタンやメニューなどの「ウィジェットツールキット」が用意されていない。このため、通常はGTK+やQtのような、Xlibを用いて作られたGUIツールキットと呼ばれるボタンやメニューなどのウィジェットが用意された多重階層のライブラリを使ってウィンドウを表示するGUIプログラムを開発する。
X11におけるGUIの操作性は、ウィンドウマネージャと呼ばれるサードパーティのプログラムに任されている。プログラマは独自のウィンドウマネージャを作ることができる。これによって、X11ではどんな操作性を実現したウィンドウマネージャでも自由に開発できる。
また、ウィンドウマネージャはウィンドウの操作を担当するが、Windowsのような近代的なシステムでは、ファイルマネージャや端末エミュレータなどを、統一された操作性で実現する必要がある。また、設定やファイルシステムを仮想化する手段も必要であり、CORBAのようなコンポーネントの利用とその準備も実現する必要がある場合がある。これを統合デスクトップ環境、あるいはデスクトップ環境と呼ぶ。統合デスクトップ環境には、商用UNIXなどで用いられるCDEや、オープンソースなKDEやGNOMEなどが存在する。言ってみれば、WindowsやMacのようなパソコンOSも、その主体となるシステムはデスクトップ環境(Windowsではファイルマネージャを兼ねたExplorerやレジストリ・COMなどのGUIシステム)である。
デスクトップ環境・ウィンドウマネージャやGNOMEやKDEも参照のこと。
X11のアーキテクチャに関しては以下を参照のこと。最近はネットワーク透過のないWaylandと言うシステムが代替を目指しています。
Wikipedia
X11は、ユーザーのコンピュータの入出力デバイス(マウス、キーボード、ディスプレイなど)を監視するXサーバーと、GUIアプリケーションであるXクライアントが、ネットワーク透過なXプロトコルを使って、要求などの応答を通して成り立っている。(HTTPDとは違い、ユーザーのコンピュータがサーバーで、リモートのプログラムがクライアントである、と言うところに注意が必要。ユーザーはサーバーであるXサーバーの画面を操作しながら、リモートのXクライアントをネットワークで操作する。)
Xlibは、XクライアントがXプロトコルの詳細を知らなくてもXサーバーと通信出来るようにしたライブラリ。Xlibによるプログラミング処理を見ると、Windowsプログラミングのようなメッセージループによるプログラムになる。
だが、普通、Xlibを直接に操作することは無い。ボタンやメニューのようなグラフィックス・ツールキットが用意されていないからである。あらかじめ作られたボタンやメニューを使うためには、GTKやQtなどのツールキットなどを使う。
X11は、最近ではWaylandと言うものにとってかわられようとしている。
ウィジェットツールキットには、Intrinsics/Xt、Xaw(X11の開発元であるアテナプロジェクトによるウィジェットツールキット)、Motif、GTK+、Qt、Tkなどがある。
Xlibによるプログラミングが具体的にどんなプログラムになるのかは、以下をご覧あれ:
X11では、ハードウェアを操作しグラフィックを表示するXサーバーと、ウィンドウフォームを描画しGUIプログラムを実行するXクライアントが、「ネットワーク透過」というネットワークプロトコルで繋がっている。
なぜこんな設計にしたのか。それは、僕はウィンドウシステムとウィンドウの間でメッセージをやり取りする上で、それをネットワーク通信にするのが自然だから、だと思う。
ウィンドウシステムの役割とは、大きく3つある。それはハードウェアの操作、グラフィックスの表示、そしてメッセージのやり取りである。
サーバーとしてハードウェアの操作とウィンドウ描画を行うXサーバーと、ウィンドウの内部のグラフィックスの表示を行うXクライアントが、メッセージをやり取りする。このメッセージをネットワーク透過で行うことで、サーバーはSSHのようにネットワークに繋がった他のクライアントとも、「遠隔通信のようにメッセージをやり取りできる」のである。
ただ、これは僕の勝手な意見だから、設計者がこのように考えて設計した、というものではない。僕が勝手に、「X11のネットワーク透過はこんな意味があるのではないか」と考えた、推測にすぎない。
SSHも参照のこと。
実際のところ、X11のネットワーク透過は、端末と中央処理コンピュータが分かれていたごろの名残りであると同時に、一種のネットワークを通じた分散システムであると考えられる。
UNIXの端末のように、Xアプリケーションのプロセスを大きな処理能力のある中央のワークステーションで行いながら、そのプログラムをたくさんのX端末からネットワークを通じて操作することができる。
また、一種の分散システムとして見れば、さまざまなコンピュータのホストにあるXクライアントを、Xサーバーがそれぞれのコンピュータに役割を持たせながら遠隔操作することができる。
これをより発展させたのがWindowsのCOMやGNOMEのCORBAで、さまざまなホストにあるネットワーク上のコンポーネントが連携して、「ネットワーク通信上のさまざまなオブジェクトが相互にメッセージをやり取りしてひとつのシステムとして実行する」ことができる。
CORBAではWindowsのオブジェクトとLinuxのオブジェクトがネットワークで別々の言語で相互に通信することもできる。
後日注記:X11の優れた点は、ひとつのモニターから遠隔地にある複数のコンピュータを操作できるということ。モニターやキーボードがついていないコンピュータでも、X端末から遠隔操作できる。モニターがついているコンピュータはひとつだけで良い。そのひとつのX端末から、ネットワークで繋がった全てのコンピュータを遠隔操作できる。もちろんX11のアプリケーションが入っている必要はあるが、さまざまな場所に分散したコンピュータをひとつのX端末から遠隔操作することで、コンピュータがどこにあったとしてもひとつの端末から遠隔操作し、遠隔地にあるコンピュータシステムを管理することができる。
コマンドプログラムとXアプリケーションの違いは、コマンドはターミナルに文字を出力し、シェルからコマンドで実行するが、XアプリケーションはXサーバーにウィンドウを表示し、Xサーバーから操作して実行する、ということが異なる。
コマンドプログラムは、文字ベースの入出力で操作が完結しているが、Xアプリケーションは「Xサーバー」を介して実行・操作する。Xサーバーが無ければ動かないし、操作もできない。
Xにおいては、「ウィンドウマネージャ」と呼ばれる特別なプログラムが、ウィンドウの操作と実行を管理する。
このウィンドウマネージャの役割は大きく2つ。それは「ウィンドウの管理」と「アプリケーションの実行」である。
X11におけるウィンドウをどのように管理するかという「ウィンドウマネージメント」の機能と、アプリケーションを実行する「ランチャー」の機能を、ウィンドウマネージャは持っている。
X11においてはウィンドウマネージャからXアプリケーションを実行し、ウィンドウマネージャの機能を使って実行されたウィンドウを破棄・表示を切り替えする。
つまり、コマンドラインにおける「ターミナルとシェル」が、X11における「Xとウィンドウマネージャ」となる。
これに加えて、デスクトップ環境では、ファイルマネージャや端末エミュレータなど、さまざまな「GUIアプリケーション」を提供し、一貫した操作法を実現する。
UNIXにおけるGUI環境では、XサーバーをコアにXlibによるプログラミングを行うが、ここではボタンやスクロールバーのような「ツールキットライブラリ」は提供されていない。
このため、通常はMotif, Qt, GTKのようなツールキットライブラリを用いてプログラミングを行う。Linuxでは主にGTKとQtを用いる。
詳細はMotifとLinux X11(2.ツールキットとデスクトップ環境)を参照のこと。
X11の上でGTK+/GNOMEやQt/KDEを動かすのは、「複雑だ」という人が居る一方で、実際のところ、GUI機能をWindowsのようにカーネルに統合してしまうとサーバーで使う時に困るということと、GNOMEやKDEが独自にディスプレイサーバまで実装するのでは面倒くさい、といった感じで、X11だけがディスプレイサーバを実現する、という感じの設計になりました。
そもそもがUNIXワークステーションやOpenVMSで動作することが前提で、本当に古臭い昔の技術です。LinuxのおけるX11はそもそもXFree86プロジェクトをベースとしており、UNIXならX11だよねといったとても昔の技術であるため、色んなところで旧来のコンピュータのさまざまな要件にぶち当たります。
X11は商用UNIXにも搭載できる、BSDライセンスと同様のMIT/Xライセンスを採用しており、各種の商用UNIXワークステーションでも動作する。
ただし、GNUはこの点を批判しており、「そもそもは自由だったはずのX11の実装が、商用UNIXではプロプライエタリな独自のバイナリになっており、UNIXユーザーはウィンドウシステムを書き換えたりコピーしたりソースコードを自由に見ることができない」として、「GPLではフリーソフトウェアがフリーでなくなることがない」とGNUは言っている。
だが実際のところX11のソースコードはもともとのオープンなX11のソースコードはMITライセンスで公開・配布されているのであり、開発自体もオープンなコミュニティによって行われているため、「ストールマンの言っていることはおかしい」とされることが多い。たとえばFreeBSDがフリーでなくなることは考えづらく、「わざわざGPLなんかで配布する意味が無い」とされることの方が一般的である。
Intel i386用のフリーなXサーバーの実装は、以前はXFree86として知られていました。Linuxでは、長い間XFree86を標準のXサーバーとして利用してきました。
昔のRed Hat Linuxの書籍などを見ると、設定ファイルやログファイル、コマンドやツールなどの名前に、XFree86の言葉を見ることがあります。
XFree86は、プロジェクトのごたごたからX.orgがforkして生まれ、XOrg Serverという新しいXサーバーになりました。この時、XFree86関連の言葉は削除されました。
そのため、昔のホームページなどは、Xの設定ファイルをXF86Configという名前のままでサンプルとして掲載している場合があります。xorg.confという名前では検索してもヒットしない情報でも、XF86Configという名前ならヒットする場合があります。
X.orgでは、設計のモジュール化が進み、ハードウェアの自動認識技術が向上したりしています。
また、X.orgなどが参画して作られたプロジェクトに、freedesktop.orgがあります。これは、フリーソフトウェアをデスクトップ用途で使う場合に必要となる技術の開発促進を目指しています。
freedesktop.orgでは、さまざまな下部プロジェクトが生まれています。ベクターグラフィックスAPIのcairoなどがこれに当たります。また、GNOMEとKDEの相互運用や共通化も図られ、アプリケーションメインメニューの設定項目の仕様などの共通化が行なわれました。ほかにも、たくさんのフリーなデスクトップ関係のプロジェクトが生まれています。
Xのライセンスには、MIT/Xライセンスが使われています。これは緩やかなフリーソフトウェアライセンスで、GPLのようなコピーレフトのライセンスではありません。GNUが述べるように、Linux上のX11がフリーで配布されていたからといって、派生ソフトウェアの商用のX11がフリーで使えるとは限りません。多くの商用UNIXでは、プロプライエタリなX11が搭載されており、フリーに改造や再配布を行うことはできません。ですが、GNUが計画上、ウィンドウシステムを独自に実装するのではなく、既にあるフリーソフトウェアを積極的に使用しようとして、GNUではX11を採用することを決めました。
プロプライエタリに配布されるX11が必ずしもフリーではない、とGNUは主張しますが、MITライセンスではクローズドな商用ソフトウェアにX11をコンポーネントの一部としてフリーにせずに組み込むことができます。このため、商用のOSの一部としてXを採用することができます。商用ソフトウェアとしては、使いやすいライセンスです。
同じことは*BSD系のフリーUNIXが採用しているBSDライセンスにも言えます(MITライセンスとBSDライセンスは条項などがほとんど同じです)。このため、AppleのDarwin(Macのカーネル)やSONYのゲーム機であるプレイステーションなどには、BSDライセンスのFreeBSDの技術が使われています。(DarwinではMachとFreeBSDのコードを元に、オープンソースでmacOSのUNIX系カーネルを開発しています。)
パーミッシブ・ライセンスも参照のこと。
Linux X11(2.ツールキットとデスクトップ環境)を参照のこと。
X11設定とプログラミングを参照のこと。
Linux 日本語入力を参照のこと。
Waylandを参照のこと。
伝統的なUNIXのX11では、Macの1ボタンやWindows/PCの2ボタンではなく、3ボタンマウスを使っていた。
この3ボタンマウスは、現在のホイール用の中ボタンがあるマウスでは、エミュレートして使うことができる。
X11では、伝統的に、選択して右クリックメニューからコピーを選択しなくても、文字列を選択しただけでコピーできる。そして、中ボタンのクリックでペーストができる。
ただし、今ではGNOMEやKDEでも右クリックメニューからコピー・ペーストを行うのが一般的である。
X11でも、UNIXの基本はターミナルです。X11では、端末エミュレータというソフトウェアを使って、X11からコマンドシェルを用いてコマンドを実行することができます。
ただし、アイコンで操作したい、という人は多いでしょう。GNOME/KDEには、ターミナル以外に「ファイルマネージャ」というソフトウェアが用意されています。これは起動時のGNOMEやKDEで既に起動しており、ユーザーはデスクトップのアイコンをクリックしたり、ファイルマネージャを新しく起動して深いディレクトリ階層を辿ったりすることができます。
いわば、「WindowsもUNIXもどちらの形式の操作もできる両刀使い」です。GNOMEとUNIXコマンドラインを上手く使い分けることで、デスクトップLinuxの真価が発揮するでしょう。
また、インターネットも同じで、wgetのようなコマンドとMozillaのようなGUIのWebブラウザを使い分けます。現代のパソコンでは、クラウド化が進み、何でもローカルのアプリケーションよりもブラウザから見る場合が増えました。これはLinuxにとって朗報です。というのは、Linuxには優れたアプリケーションが多くなくても、ブラウザのMozilla FirefoxやGoogle ChromeなどはWindowsと全く同じように操作することができるからです。僕はLinuxを使ってYouTubeを見ることの多いYouTube利用者です。最近はAndroidからもYouTubeの音楽を良く聴きますが、ネットワークやクラウドが行き着く先は、きっとWindowsよりもLinuxのはずです。
Xサーバーでは、ローカルのマシンをXサーバーと言い、ネットワーク上のマシンをXクライアントと言います。これは、マイクロカーネル的なOSの考え方に基づいています。マイクロカーネルOSでは、プロセスやメモリ管理やプロセス間通信などを除いて、ファイルシステムやネットワーク、デバイスドライバは、ファイルシステムサーバーのようなデーモンで行います。Xサーバーもこれと同じで、グラフィック専門のマイクロカーネルサーバーのようなものだと考えることができます。
後日注記:基本的に、Xサーバーはローカルの端末で動き、Xクライアントはリモートで動く。ローカルがサーバーで、リモートがクライアントというのは、違和感があるかもしれないが、Xサーバーはひとつのマシンでモニターに画面表示を行う「サーバー」であり、ほかのXクライアントはこのサーバーに対して接続する「クライアント」である。
ウィンドウシステムの開発手法として、僭越ながらプログラミング作法2(入門)に説明を載せています。
UNIXでGUI環境を実現するウィンドウシステム。
X11 man-pages
X11によるプログラミング。
以下の書籍が参考になります。