🤖

WSL2 の X 転送が重いので Wayland + VNC + noVNC で快適リモートデスクトップ環境を作る

に公開

WSL2 で GUI アプリを使いたいけど、X-Window 転送が重すぎて困ったことありませんか?
私も「なんとか軽くしたい!」と色々試行錯誤した結果、Wayland + VNC + noVNC の組み合わせで、それなりに動作するリモートデスクトップ環境を作ったので、その手順をまとめてみました。

タイトルには快適と書きましたが、あくまで体感で快適というタイトル詐欺です。
「X 転送が重い…」と悩んでいる方、ぜひ参考にしてみてください!


この記事でできること

  • WSL2 上にヘッドレスな Wayland デスクトップ (sway) を構築
  • Windows の Web ブラウザから noVNC 経由でデスクトップにアクセス
  • プロセス管理は Supervisor で自動化
  • 日本語キーボード配列 (JIS) にも対応

1. 必要なパッケージを一気にインストール

まずは必要なものを全部インストールしちゃいます。
(Ubuntu 前提です)

sudo apt-get update
sudo apt-get install -y \
    sway \
    wayvnc \
    novnc \
    websockify \
    supervisor \
    dbus-x11 \
    xwayland \
    foot \
    clipman
パッケージ名 ざっくり説明
sway Wayland のデスクトップ環境
wayvnc Wayland 用の VNC サーバー
novnc ブラウザで VNC を使うための UI
websockify VNC 通信を WebSocket に変換
supervisor プロセス管理ツール
dbus-x11 dbus-run-session 用
xwayland X11 アプリ互換用
foot 軽量ターミナル
clipman クリップボード履歴マネージャー

2. ユーザーをグループに追加

sway がグラフィックデバイスにアクセスできるよう、VNC 用ユーザー (例: ubuntu) を rendervideo グループに追加します。

sudo usermod -aG render,video ubuntu

※補足: 上記は一般的な WSL2 環境で有効ですが、環境によってはグループ追加後に一度ログアウト・ログイン、または WSL2 の再起動が必要な場合があります。
また、まれに localhost で noVNC に接続できない場合があります。その場合は WSL2 内で ip addr 等で IP アドレスを調べ、http://<WSL2のIP>:6080/ でアクセスしてみてください。


3. Supervisor の設定

sway・wayvnc・noVNC の 3 つを Supervisor でまとめて管理します。

sudo vi /etc/supervisor/conf.d/wayland-desktop.conf

エディタが開いたら、下記をコピペしてください。
(ユーザー名 (例: ubuntu) や UID (例: 1000) は自分の環境に合わせて修正を!)

[supervisord]
nodaemon=true
user=root
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

# --- Wayland Desktop Environment ---

[program:sway]
# コマンドはディレクトリ作成と、環境変数を引き継ぐ形での sway 起動に専念
# sudo の -E オプションで、下の environment で設定した変数を ubuntu ユーザーに引き継ぐ
command=bash -c 'mkdir -p /var/run/user/1000 && chown ubuntu:ubuntu /var/run/user/1000 && chmod 0700 /var/run/user/1000 && exec sudo -E -u ubuntu dbus-run-session sway --unsupported-gpu'

# 環境変数をここに分離し、可読性を向上させる
# WLR_RENDERER="pixman" は、WSL2 環境で最も安定するソフトウェアレンダリングを指定
environment=XDG_RUNTIME_DIR="/var/run/user/1000",WLR_RENDERER="pixman",WLR_BACKENDS="headless",WLR_LIBINPUT_NO_DEVICES="1"

# このプログラムはディレクトリ作成のために root で実行
user=root
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s-stdout.log
stderr_logfile=/var/log/supervisor/%(program_name)s-stderr.log

[program:wayvnc]
# sway が完全に起動するのを待つため、10 秒遅れて開始
startsecs=10

# --config /dev/null を追加し、不要なデフォルト設定の読み込みを回避
command=wayvnc --config /dev/null localhost 5901

# 接続先のディスプレイを明示的に指定
environment=XDG_RUNTIME_DIR="/var/run/user/1000",WAYLAND_DISPLAY="wayland-1"
user=ubuntu
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s-stdout.log
stderr_logfile=/var/log/supervisor/%(program_name)s-stderr.log

[program:novnc-proxy]
# Web ブラウザからの接続 (6080) を、VNC サーバー (5901) へ中継
command=/usr/bin/websockify --web /usr/share/novnc/ 6080 localhost:5901
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s-stdout.log
stderr_logfile=/var/log/supervisor/%(program_name)s-stderr.log

4. sway のユーザー設定&クリップボード共有

日本語キーボード配列やショートカット、クリップボード共有も設定します。今回、IME は使わない前提です。

sudo -u ubuntu mkdir -p /home/ubuntu/.config/sway/
sudo -u ubuntu vi /home/ubuntu/.config/sway/config
sudo -u ubuntu chmod o+r /home/ubuntu/.config/sway/config

設定ファイルの例:

# --- Sway Minimal Config ---
set $mod Mod4

input * {
    xkb_layout jp
}

bindsym $mod+Return exec foot
bindsym $mod+Shift+q kill
bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your VNC session.' -B 'Yes, exit sway' 'swaymsg exit'

# クリップボード履歴マネージャー
exec wl-paste -t text --watch clipman store

※補足: 日本語入力(IME)が必要な場合は、fcitx5 などの日本語入力フレームワークを別途インストール・設定してください。
IME の自動起動設定(例: exec fcitx5 -d)を sway の設定ファイルに追記することで、VNC 経由でも日本語入力が可能になります。


5. Supervisor の起動

手動で Supervisor を起動します。

sudo supervisord -c /etc/supervisor/wayland-desktop.conf
sudo supervisorctl status

sway, wayvnc, novnc-proxyRUNNING になっていれば OK!

もし FATAL になっているものがあれば、設定ミスや依存パッケージ不足、権限の問題などが考えられます。
その場合は /var/log/supervisor/ 配下の各ログファイル(例: sway-stderr.log など)を確認してみてください。

もし systemd が有効な WSL2 や Linux 環境であれば、以下のコマンドで Supervisor サービス自体を再起動できます。

sudo systemctl restart supervisor

6. Windows から VNC 接続

  1. Windows のブラウザで http://localhost:6080/ にアクセス
  2. noVNC の画面が出たら「Connect」ボタンをクリック
  3. sway のデスクトップが表示されます!次の内容ができれば成功です。
  • ターミナルを Winキー + Enter で起動(foot ターミナル)
  • キーボードが日本語配列になっている
  • クリップボード共有が使える(貼り付けは Shift + Insert か中ボタンクリック)

※「爆速!」…とは言えませんが、X 転送よりは体感でだいぶマシです。
画面の描画がもたつくこともありますが、「まあ VNC だしな」と思えば!


おまけ:Google Chrome を Wayland で使う

VNC 内で Chrome を使いたい場合は、sway のターミナルから Wayland モードで起動できます。(※Chrome のインストールは省略。)

google-chrome-stable --enable-features=UseOzonePlatform --ozone-platform=wayland

まとめ

X 転送が重くて困っている方、Wayland + VNC + noVNC の組み合わせは爆速ではないですが、安定して繋げることはできると思うので、ぜひ試してみてください!

「もっとこうしたら良くなるよ!」という Tips があれば、ぜひコメントで教えてください!

Discussion