Proxmox上にDebian 13のVMを構築し、WindowsからGUIで操作するためにxrdpを導入しました。
デスクトップ環境には、メモリ消費を抑えるためXfceを使用しています。
ところが、xrdpへのログイン自体は成功するものの、
- ユーザー名とパスワードを入力する
- 一瞬だけ黒い画面が表示される
- そのままRDP接続が終了する
という状態になりました。
最初はWayland周りを疑いましたが、最終的にはXfceのセッション起動方法とDBus周りを明示することで正常に接続できるようになりました。
今回は、そのときに行った切り分けと設定をまとめます。
環境
今回の構成は以下です。
Proxmox VE
↓
Debian 13
↓
Xfce
↓
xrdp + xorgxrdp
↓
Windows リモート デスクトップ
Debianはサーバー用途でも使用しており、DockerやSambaなども同居しています。
GUIは必要ですが、常時デスクトップ用途で使うわけではないため、GNOMEではなくXfceを選びました。
xrdpを導入する
まず必要なパッケージを入れます。
sudo apt update
sudo apt install -y \
xfce4 \
xfce4-goodies \
xrdp \
xorgxrdp \
dbus-x11
xrdpを有効化します。
sudo systemctl enable --now xrdp
状態を確認します。
systemctl status xrdp
3389番ポートが待ち受けているかも確認できます。
ss -ltnp | grep 3389
ここまで問題なければ、Windows側からリモートデスクトップ接続を開き、DebianのIPアドレスへ接続します。
xrdpのログイン画面では、セッションに Xorg を選択しました。
注意: RDPの3389/TCPをインターネットへ直接公開するのは避け、LAN内やVPN経由など、アクセス元を制限した構成で利用することをおすすめします。
発生した問題
認証画面までは正常に表示されました。
ユーザー名とパスワードも通ります。
しかし、その直後に黒い画面が一瞬表示され、そのままRDPクライアントが終了しました。
この時点で、
- ネットワーク
- 3389番ポート
- xrdp
- ユーザー認証
までは動いています。
問題は、その後のGUIセッション起動にあると考えました。
Xfceが起動できる状態か確認する
まず、Xfceの起動コマンドが存在するか確認します。
which startxfce4
which xfce4-session
正常なら、例えば以下のようになります。
/usr/bin/startxfce4
/usr/bin/xfce4-session
ここで何も返らない場合は、Xfce自体の導入を確認した方がよいです。
.xsession を設定する
今回、最終的に効いたのが .xsession の設定でした。
RDPでログインするユーザーで、次を実行します。
cat > ~/.xsession <<'EOF'
unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR
exec startxfce4
EOF
実行権限も付けておきます。
chmod +x ~/.xsession
DebianのXsessionでは、ユーザーの ~/.xsession をセッション起動用スクリプトとして利用できます。実行権限がない場合でもシェルスクリプトとして扱われますが、今回は意図を明確にするため実行可能にしています。
その後、xrdp関連サービスを再起動します。
sudo systemctl restart xrdp xrdp-sesman
Windows側から再度RDP接続すると、今度はXfceのデスクトップが正常に表示されました。
なぜこれで直ったのか
今回の直接的な原因をWaylandや特定の環境変数だと断定するところまでは確認していません。
ただし、xrdp + xorgxrdp はXorg/X11上でデスクトップセッションを起動します。
今回の環境では、RDP用セッションを開始するときに、
unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR
として既存の値を外したうえで、
exec startxfce4
とXfceを明示的に起動することで正常に動作するようになりました。
DBUS_SESSION_BUS_ADDRESS や XDG_RUNTIME_DIR の値が、ログインシェルの設定などを通じて意図せず引き継がれている環境では、別セッション向けの値がGUIセッション起動の妨げになる可能性があります。
そのため、この設定は「xrdpそのものは動いているのに、認証後のデスクトップセッションだけが終了する」ケースを切り分ける一つの方法として有効です。
X11で動いているか確認する
RDP接続後、ターミナルで次を実行します。
echo $XDG_SESSION_TYPE
今回の環境では、
x11
となりました。
xrdp + xorgxrdp としては意図した状態です。
それでも黒画面になる場合
同じ「黒画面になって切断される」という症状でも、原因は複数あります。
まずログを確認します。
sudo journalctl -u xrdp -u xrdp-sesman --since "5 minutes ago"
ユーザー側のセッションログも確認します。
tail -100 ~/.xsession-errors
.xsession-errors が存在しない場合や、さらにxrdp側を確認したい場合は次も確認します。
sudo tail -100 /var/log/xrdp.log
sudo tail -100 /var/log/xrdp-sesman.log
xrdp自体が落ちているのか、認証後のセッション起動で落ちているのかを切り分けると原因を追いやすくなります。
今回の設定
最終的には以下の構成で動作しました。
Debian 13
↓
Xfce
↓
xorgxrdp
↓
xrdp
↓
Windows RDP
.xsession は以下です。
unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR
exec startxfce4
RDP接続後に、
echo $XDG_SESSION_TYPE
を実行し、x11 になっていることも確認しました。
まとめ
Debian 13 + Xfce + xrdpで、
ログイン後に黒い画面が一瞬表示され、そのまま切断される
という状態になった場合、xrdpそのものではなく、デスクトップセッションの起動で失敗している可能性があります。
今回の環境では、
-
xorgxrdpを導入する -
dbus-x11を導入する -
.xsessionでXfceを明示的に起動する -
DBUS_SESSION_BUS_ADDRESSとXDG_RUNTIME_DIRをunsetする
ことで解決しました。
RDPのログイン画面までは表示されるのに、その直後に切断される場合は、ネットワーク設定だけでなく、Xfceのセッション起動処理も確認すると切り分けしやすいと思います。