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) を render
と video
グループに追加します。
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-proxy
が RUNNING
になっていれば OK!
もし FATAL
になっているものがあれば、設定ミスや依存パッケージ不足、権限の問題などが考えられます。
その場合は /var/log/supervisor/
配下の各ログファイル(例: sway-stderr.log
など)を確認してみてください。
もし systemd が有効な WSL2 や Linux 環境であれば、以下のコマンドで Supervisor サービス自体を再起動できます。
sudo systemctl restart supervisor
6. Windows から VNC 接続
- Windows のブラウザで
http://localhost:6080/
にアクセス - noVNC の画面が出たら「Connect」ボタンをクリック
- 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