Ubuntu Weekly Recipe

第666回 Waypipeを用いてWayland環境で「X転送 over SSH」っぽいことをしてみる

この記事を読むのに必要な時間:およそ 4.5 分

先日リリースされたUbuntu 21.04では,長年の懸案だった「Waylandセッションのデフォルト化」が再度実施されました。今後2022年4月にリリースされる予定のUbuntu 22.04 LTSに向けて,さまざまな問題を洗い出し,対応を行っていくことになります。今回はそんなWayland環境で「X転送 over SSH」っぽいことを実現してみましょう。

Waylandセッションになったということ

Waylandとは2008年に登場したの次世代ディスプレイサーバーです。もともとは,X.Orgの開発者でもあったKristian Høgsbergが最小のディスプレイサーバーとウィンドウコンポジッターを組み合わせたものとして個人的に作成していたソフトウェアでした。その後,X.Orgの開発者たちがX Window System/X.Orgを置き換える次世代のディスプレイサーバーとして開発に参加するようになったのです※1⁠。

※1
Waylandそのものの成り立ちや,もうひとつの「次世代ディスプレイサーバー(だった⁠⁠」Mirとの関係は第652回のキミはMirを憶えているかを参照してください。

WaylandはX Window Systemの正当な後継という位置づけであるため,Xを採用している各OSがWaylandへ移行することは既定路線でした。問題は「いつ移行するのか」だったのです。

メジャーなLinuxディストリビューションにおいて先陣を切ったのは,アップストリームの開発者が多く参加しているFedoraです。2014年頃にはすでにGNOMEセッションでWaylandを選択できるようになり,2016年のリリースにおいてWaylandがデフォルトになっていたようです。ただしKDEセッションでWaylandが使われるようになったのは先日リリースされたFedora 34からでした。

Ubuntuは2017年の17.10で一度Waylandをデフォルトセッションに採用したものの,いくつかの機能が足りないために次のLTSである18.04ではXセッションに戻しています。その後,数年の時をかけてようやくWaylandセッションのデフォルト化に踏み切ったというわけです。その間に,GNOMEを採用するメジャーなディストリビューションのほとんどはWaylandセッションのデフォルト化に踏み切っています。つまりUbuntuはどちらかというと後発な対応となりました※2⁠。

※2
ちなみにKDE PlasmaもWaylandはサポートしているものの,開発者自身が言及しているように2020年より前の環境では「まともに動かない」と言える状態だったようです。2020年あたりから劇的に改善したとのことですし,FedoraもKDEセッションでのWayland移行を成し遂げたため,今後KubuntuでもWayland環境の改善が期待できることでしょう。

さて,第663回のUbuntu 21.04の主な変更点でも解説されているように,Waylandへの移行の最大の障害のひとつが画面共有機能がないことでした。つまりリモートデスクトップの機能がなかったのです。Waylandはその設計方針から,Wayland自身はレンダリングAPIを提供せず,またそのAPIはネットワーク透過ではありません。つまりリモートデスクトップを実現するためには,Xに実装されていたいくつかの機能をレンダリングサーバーで肩代わりする必要がありました。

たとえばGNOMEの場合,WaylandコンポジッターでもあるMutterがレンダリングを,マルチメディアのネットワーク越しのパイプラインを実現できるPipeWireが画面情報等の転送を,一般的なデスクトップ環境における各種APIをフレームワーク化したxdg-desktop-portalが諸々のUI部分に対するバックエンドとして動きます。つまりXの頃と比べると複雑化しているのです。

画面共有に関わるさまざまなツールが協調して取り込まれないといけなかったため,UbuntuのWayland対応は遅れることになりました。ちなみに,実際は現時点でもアプリケーションによってはWayland上での画面共有に対応していません※3⁠。

※3
たとえば2021年5月頭時点におけるsnapパッケージ版のzoom-clientも画面共有ができない状態です。ただしこれはZoomがWaylandに対応していないというよりは,ZoomによるWayland環境かどうかの判定基準がディストリビューション単位である/etc/os-releaseを見ている)ことによるもののようです。

WaylandセッションでアプリをSSH越しに転送する

まずはUbuntu 21.04がインストールされたマシンを2台用意してください。次のようにどちらもWaylandが動いていることを確認します。

$ echo $XDG_SESSION_TYPE
wayland

リモート側にSSHサーバーをインストールして,クライアントからウィンドウをX転送してみましょう。

リモート$ sudo apt install openssh-server

通常であれば,次のように実行すると-XオプションでX転送が有効化され,ウィンドウが表示されるはずです。

クライアント$ ssh -X リモートサーバー gedit

おそらく何も反応がないでしょう。たとえばリモート側ですでにGUIにログインしている状態なら,画面を確認してみてください。なぜかgeditが起動してしまっているはずです。

試しにgeditではなくてFirefoxを起動してみるとどうでしょうか。

クライアント$ ssh -X リモートサーバー firefox

こちらは起動しましたね。実はUbuntuのWaylandセッションでは「Xwayland」も一緒に起動するようになっています。これは何かと言うとWaylandコンポジッターと連携できるXサーバーです。つまり純粋にX Window Systemしか対応していないソフトウェアはXwaylandを従来のXサーバーとして利用することで,Wayland環境でも起動できるようになっています。

FirefoxはWayland/X Window Systemを起動時に判定して適切に処理しています。このため,従来のSSH越しのX転送でも動いていたというわけです。

それに対してgeditは,Wayland決め打ちです※4⁠。SSH越しのX転送を利用しようとしても正しく処理できませんでした。今回はこのgeditをWaypipeというソフトウェアを使ってSSH越しに起動してみます。

※4
本来はGDK_BACKEND=x11を指定して起動すれば,GTKアプリケーションもWaylandセッション上でXwaylandを使うはずなのですが,21.04ではうまく動きませんでした。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。