Windows11のWSLgで外部Xサーバを使う

環境構築

先頭のIPv4アドレスが接続先とは限らない

下のipconfigを使うスクリプトは、最初に見つかったIPv4アドレスを選びます。VPNや仮想アダプターがあると、WSLから到達できないアドレスを選ぶことがあります。まずネットワーク構成を確認し、無条件に.bashrcへ追加しないでください。

MicrosoftのWSLネットワーク説明では、NAT構成ではWSLから見た既定経路のゲートウェイをWindows側のアドレスとして調べます。mirrored構成なら127.0.0.1で接続できるため、同じ方法を使い回しません。これはWindows側のサーバーへの接続先の話で、外部Xサーバーの起動や待ち受け設定、描画不具合の解消を保証するものではありません。

接続のためにファイアウォールやXサーバーのアクセス制限を一括で無効化しないでください。到達できる範囲と許可する接続元を限定します。DISPLAYを変更しても直らない場合は、元の値へ戻してアプリ側の描画設定も確認します。

WSLgで特定のX11アプリだけ描画が崩れる場合、Windows側の外部Xサーバーへ接続先を変えて切り分ける方法があります。ここではDISPLAYの指定を扱います。

しかし、移行に際して技術的な課題がいくつか存在します。中でも厄介なのが、WSLg(Windows Subsystem for Linux GUI)におけるXサーバの互換性問題です。多くのX11ベースのアプリケーションはWSLg上でも問題なく動作しますが、一部のGUIアプリケーションでは描画崩れやレイアウトの不具合が発生することがあります。

このような不具合を回避するため、WSLgではなく外部のXサーバ(例:VcXsrvやX410など)を用いる方法が有効です。ただし、Windows 11でこのような構成を取るには、手動でDISPLAY環境変数を適切に設定する必要があります。

以下に、WSL上でDISPLAYを自動設定するための~/.bashrc追記用スクリプトを紹介します。

# 日本語環境のWindowsで、ipconfig.exeからIPv4アドレスを取得してDISPLAYに設定
WIN_IP=$(/mnt/c/Windows/System32/ipconfig.exe \
| iconv -f SHIFT-JIS -t UTF-8 \
| grep "IPv4 アドレス" \
| grep -v "169.254" \
| head -n1 \
| awk -F: '{print $2}' \
| tr -d ' \r')
export DISPLAY=${WIN_IP}:0.0

解説:

  • ipconfig.exe: Windows側のネットワーク情報を取得するコマンドです。
  • iconv -f SHIFT-JIS -t UTF-8: 日本語Windowsではipconfigの出力がShift_JISのため、UTF-8に変換しています。
  • grep "IPv4 アドレス": 有効なIPv4アドレスの行を抽出します(※英語環境では “IPv4 Address”)。
  • grep -v "169.254": 自動構成のリンクローカルアドレスを除外します。
  • awk -F: '{print $2}': コロン区切りでIP部分を抽出します。
  • tr -d ' \r': 余分な空白や復帰コードを除去します。

DISPLAYは描画先の指定です。接続できることと、アプリの描画不具合が直ることは分けて確認してください。