こんにちは。この記事は株式会社Works Human Intelligence Advent Calendar 2021 23日目の記事です。
昨日の記事は@h4ya5eさんの弊社名を文法解析してみた(できるとは言ってない)です。
よろしければカレンダーの他の記事も見ていってください。
朝起きたらPCがWindows 11になっていた
WSLとは、Windows Subsystem for Linuxの略で、Windows上で仮想マシンのオーバーヘッドなしにLinuxを直接実行できる機能です。1
そんなWSLがWindows 11からはGUIをサポートするようになりました。
正確にはWindows 10でもWindows Insider Programに参加してDevチャネルを選択すれば使うことができたのですが、私はWindows上にXServerを立ててGUIアプリを使うことができていた2のでOSをアップデートしてまで利用するほではないと判断していました。
しかしある朝、気がついたらタスクアイコンが中央に寄っていました。
ウィンドウから角が取れ、スタートメニューアイコンの水色タイルは正面を向き、黒系統の落ち着いていたデザインは透明感を目指した方向に統一されていました。
まだそのつもりはなかったのですが、期せずして私のPCはWindows 11にアップデートされてしまっていたのです。
スタートメニューとタスクバーのピン止めが全て吹き飛んでいるのを見て正直やっちまったと思いましたが、普段からWSL2をよく使っていた私はさっそくWSLgを試してみることにしました。
この記事では、私の従来の手法(WindowsにVcXsrvをインストールし、そこにWSL2から接続する)の問題点がWSLgによって解決されることや、WSLgを使ってみて得た感触などを書き連ねていきたいと思います。
従来の手法の問題点
私が従来WSL上でGUIアプリを利用する際に使っていた手法は、ホストマシン上でXServer (VcXsrv)を起動し、そこにWSLから接続するというものでした。恐らく他の人でも同じ手法を使っていると思います。
非常に単純で良い手法なのですが、以下の3つの大きな問題がありました。
-
VcXsrvを起動せずにWSL2上でテキストエディタを開くと、起動に滅茶苦茶時間がかかる
- クリップボードアクセスのために
$DISPLAY
を見に行ってタイムアウトしていたのが原因でした。 - https://github.com/microsoft/WSL/issues/5223#issuecomment-652309457
- クリップボードアクセスのために
-
DISPLAY
環境変数を設定するのがやや大変(WSL2限定)- WSL2からネットワーク空間がホストと共有されなくなり、ホストのIPアドレスを指定しないとホストマシンに接続できなくなりました。その結果
DISPLAY
の設定がやや大変になりました。やり方は色々あると思いますが、私は下のようにDISPLAY
を設定していました。
LOCAL_IP_HOST=$(ipconfig.exe | grep IPv4 | grep -o -E '192\.168\.1\.[0-9]{1,3}') export DISPLAY=${LOCAL_IP_HOST}:0.0
- WSL2からネットワーク空間がホストと共有されなくなり、ホストのIPアドレスを指定しないとホストマシンに接続できなくなりました。その結果
-
ホストマシンがスリープすると、GUIアプリが閉じていることがある(WSL2限定)
- TCPセッションが切断されてしまってGUIを維持できないことが原因でした。
- https://github.com/microsoft/WSL/issues/4992
WSLgでは上で挙げた問題点が全て解決された
WSLgにしてからは、今のところ上記の問題点は全て解決されたように見えます。
また今まではVcXsrvを起動しないとクリップボードをホストと共有できませんでしたが、WSLgにしたらクリップボードが初めからホストとシームレスになり、地味に嬉しいです。
困った点
WSLgに切り替えることで今まで困っていたものが解決されたのはいいのですが、新たにWSLgになって発生した問題がいくつかあったので、それら問題点とその解決方法を紹介したいと思います。
WSLg導入以後もGUIアプリが開かない
Microsoft公式のガイド3では、wsl --update
をしてWSLを再起動するだけでWSLgを有効化できるとのことでしたが、私の手元ではアップデート以後もError: Can't open display: 0
となってGUIアプリを開くことができませんでした。
下の記事を参考に、/tmp/.X11-unix
の向き先を変えてやることで解決できました。
GUIへの入力でキーボードが日本語配列で認識されてしまう
私が普段使っているキーボードはUS配列なのですが、WSLgで開いたGUIには日本語配列で認識されてしまいました。
以下を.profile
に追記してsource
で取り込むことで解決できました。
setxkbmap -layout us
ディスプレイの電源を落とすとGUIが消えてしまう
WSLgのGUIを配置しているディスプレイの電源を落とすとGUIが閉じてしまう現象に遭遇しています。
issueにコメントを付けておいたので、今後改善されるといいなと思っています。
おわりに
ウィンドウの角を引き換えに、WSL2での開発がますます便利になりました。
今のところ、やはりWSLg目当てで無理してWindows 11にアップデートするほどのものではないと感じていますが、Windows 11へのアップデートを行った際にはぜひWSLgをお試しください。