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に環境変数を設定します。
- Windowsキーを押し「env」と入力します
- 候補に出てきた「システム環境変数の編集」を起動します
- 「環境変数」をクリックします
- ユーザ環境変数の「新規」をクリックします
- 「変数名」に
LIBGL_ALWAYS_SOFTWARE
「変数値」に1
を入力し、OKをクリックします - ユーザ環境変数の「新規」をクリックします
- 「変数名」に
WSLENV
「変数値」にLIBGL_ALWAYS_SOFTWARE
を入力し、OKをクリックします - OKをクリックします
- WSLを終了します
wsl --shutdown
環境変数の反映にはWindowsの再起動が必要かもしれません。
これで$ xeyes
だけでxeyesを起動できます。Windowsから直接、WSLのGUIアプリケーションを起動できるようにもなっています。ただしexyesはWindowsから呼び出せるようになっていないので、これを直接起動できません。
関係しているかもしれないこと
CPUはCeleron N5100です。dGPUはありません。