Windows 11搭載のパソコンを手に入れたので、早速WSLで遊んでみようと思ったら、GUIアプリケーションが起動できませんでした。WSLgのおかげで、自分でXクライアントをWindowsに用意しなくてもよくなっています。Xクライアントをインストールせず、WSLgを使いこの問題を解決します。

バージョン情報

> wsl --version
WSL バージョン: 0.51.2.0
カーネル バージョン: 5.10.81.1
WSLg バージョン: 1.0.30
Windows バージョン: 10.0.22000.469

症状

WSLで動作しているUbuntuで、GUIアプリケーションが起動できません。

$ xeyes
Error: Can't open display: :0

ただしgeditやnautilusは起動できます。起動できるものとできないものの差は分かりません。

WSL起動後、xeyesのように起動できないアプリケーションを起動しようとするまでは、X11 serverが起動しています。

$ ls /tmp/.X11-unix/
X0

xeyesのような起動できないアプリケーションを起動しようとしたあとは、X11 serverが停止しているようです。

$ xeyes
Error: Can't open display: :0
$ ls /tmp/.X11-unix/
[表示なし]

解決方法

C:\User\{ユーザ名}\.wslgconfigに以下テキストを追記します。ファイルが存在しない場合は作成します。

[system-distro-env]
LIBGL_ALWAYS_SOFTWARE=1

反映のために、WSLを終了して再度起動します。Windows上で操作します。

wsl --shutdown

Ubuntu上でもLIBGL_ALWAYS_SOFTWARE=1を与えると、xeyesが起動します。初回起動には時間を要します。

$ LIBGL_ALWAYS_SOFTWARE=1 xeyes

便利にする

アプリケーション起動のたびにLIBGL_ALWAYS_SOFTWARE=1を与えるのは手間ですし、Windowsから直接GUIアプリケーションを起動をしたいので、Windowsに環境変数を設定します。

  1. Windowsキーを押し「env」と入力します
  2. 候補に出てきた「システム環境変数の編集」を起動します
  3. 「環境変数」をクリックします
  4. ユーザ環境変数の「新規」をクリックします
  5. 「変数名」にLIBGL_ALWAYS_SOFTWARE「変数値」に1を入力し、OKをクリックします
  6. ユーザ環境変数の「新規」をクリックします
  7. 「変数名」にWSLENV「変数値」にLIBGL_ALWAYS_SOFTWAREを入力し、OKをクリックします
  8. OKをクリックします
  9. WSLを終了します wsl --shutdown

環境変数の反映にはWindowsの再起動が必要かもしれません。

これで$ xeyesだけでxeyesを起動できます。Windowsから直接、WSLのGUIアプリケーションを起動できるようにもなっています。ただしexyesはWindowsから呼び出せるようになっていないので、これを直接起動できません。

関係しているかもしれないこと

CPUはCeleron N5100です。dGPUはありません。