動かざることバグの如し

近づきたいよ 君の理想に

Lubuntu26.04でxrdpリモートデスクトップ

環境

  • Lubuntu 26.04

やりたいこと

Lubuntuのマシンへリモートデスクトップをしたい。Ubuntu 26.04からX11が廃止されてWaylandになったためxrdpではなくGNOME Remote Desktopを使用したが、 LubuntuはGNOMEではないため逆にGNOME Remote Desktopが使えない。そこで今までどおりのxrdpを使用する。

blog.turai.work

インストール

apt install xrdp

そのあとにサーバー再起動する。

接続できない

インストール自体はこれで終わるのだが、そのままではRDP接続できなかった。Windowsのリモートデスクトップクライアントから接続してログインまでは通るものの、デスクトップが表示される前に即切断される。

systemctl status xrdp xrdp-sesman でサービス状態を見ると両方とも起動している。つまり xrdp 自体が死んでいるわけではない。

その状態でログを見ると、以下のようなエラーが出ていた。

[ERROR] Xorg server closed connection

さらに /var/log/xrdp-sesman.log を確認すると、LXQtのセッションが起動直後に終了していることが分かる。

[INFO ] Window manager (pid 2290, display 10) finished normally in 0 secs
[WARN ] Window manager (pid 2290, display 10) exited quickly (0 secs).
        This could indicate a window manager config problem
[INFO ] Session on display 10 has finished.

最初は Xorg 側の問題かと思ったが、~/.xorgxrdp.10.log では正常終了扱いだった。つまり落ちていたのは Xorg ではなく、その上で起動する LXQt セッション側である。

直接の症状は「認証後すぐ切断される」である。画面が真っ黒なまま落ちるので分かりにくいが、実際には lxqt-session が起動してすぐ死んでいる。

決定打になったのは ~/.xsession-errors の中身だった。

isPrimaryInstance
XIO: fatal IO error 17 (File exists) on X server ":0"

isPrimaryInstancelxqt-session のシングルインスタンス判定まわりの出力で、すでに同じユーザーで LXQt セッションが動いていることを示している。

実際に確認すると、サーバー側ではローカルログイン済みの LXQt セッションが存在していた。

pgrep -a lxqt-session
loginctl list-sessions

Lubuntuをデスクトップ用途でも使っていると、物理コンソール側でログインしたままRDP接続したくなることがある。今回はまさにその構成でハマった。

原因

原因は、ローカルの LXQt セッションと xrdp 経由の LXQt セッションが同じ D-Bus セッションバスを見に行っていたことだった。

/etc/xrdp/startwm.sh はデフォルトだと /etc/X11/Xsession を実行するだけなので、環境によっては既存の DBUS_SESSION_BUS_ADDRESS をそのまま引き継ぐ。 その状態で startlxqt が起動すると、すでにローカル側で動いている lxqt-session を検出して「自分は2個目のインスタンスだ」と判断し、即終了する。

要するに xrdp が悪いというより、LXQt のシングルインスタンス前提と D-Bus 共有が噛み合っていなかった。

対処法

対処は単純で、RDPセッション専用の D-Bus セッションを作ってから LXQt を起動すればよい。

/etc/xrdp/startwm.sh を以下のように修正する。

変更前

test -x /etc/X11/Xsession && exec /etc/X11/Xsession
exec /bin/sh /etc/X11/Xsession

変更後

unset DBUS_SESSION_BUS_ADDRESS
exec dbus-launch --exit-with-session startlxqt

やっていることは3つだけである。

  • unset DBUS_SESSION_BUS_ADDRESS で既存のユーザー D-Bus バス参照を消す
  • dbus-launch --exit-with-session でRDPセッション専用の D-Bus を新しく作る
  • startlxqt をその独立したセッション上で起動する

これでローカルログイン中の LXQt セッションとは別物として扱われるため、lxqt-session の競合が起きなくなる。

修正後は次回接続からそのまま反映された。少なくとも手元の環境では systemctl restart xrdp は不要だった。

Lubuntuをヘッドレスで使うなら遭遇しないかもしれないが、ローカル画面とRDPを併用するならかなり踏みやすい罠だと思う。