Windows Subsystem for Linux (WSL) のコマンド ラインからグラフィカル Linux デスクトップ アプリケーションを実行するにはどうすればよいですか?
まず、WSL 2をインストールしました。WSLを使用してWindowsにLinuxをインストールする手順:
Windows 10 Pro Insider Preview Build 19619 をインストールしました。
Ubuntu Linux ディストリビューションをインストールしました。
ディストリビューションバージョンをWSL 1からWSL 2に変更しました。
次に、WSLのBashシェルからグラフィカルLinuxデスクトップアプリケーションを有効にするために、Windows 10のBashシェルからグラフィカルLinuxデスクトップアプリケーションを実行する手順:
Xming という X サーバーをインストールしました。
テストとして、GTK ベースのグラフィカル エディタ Vim をインストールしました。
sudo apt-get install vim-gtk
ディスプレイ環境変数を設定しました:
export DISPLAY=:0
アプリケーションを起動しようとしました:
gvim
しかし、アプリケーションは起動しませんでした。次のエラーが発生しました:
E233: cannot open display Press ENTER or type command to continue E852: The child process failed to start the GUI Press ENTER or type command to continue
このエラーが発生する理由をご存知ですか?
ベストアンサー1
WSL2のネットワークサブシステムはWSL1で使用されているものとは異なります。違いを考慮するWindows および Linux 上で実行されているネットワーク アプリにアクセスするには:
localhost
WSL1では、LinuxはWindowsホストと同じIPアドレスを使用するため、またはを使用してアプリケーションにアクセスできます。127.0.0.1
- WSL2 では、Linux は軽量の仮想マシン上で実行され、異なる IP アドレスを持ちます。Windows ホスト上で実行されているネットワーク アプリにアクセスするには、Windows IP アドレスを使用する必要があります。
WindowsホストのIPアドレスを確認する
Windows ホストの IP アドレスを確認する方法は多数あります。WSL Linux で次のコマンドを実行できます。
cat /etc/resolv.conf
eth0
WindowsのインターフェースのIPアドレスを表示しますipconfig.exe
WindowsホストのすべてのIP構成を表示しますroute.exe print
Windowsホストのネットワークルーティング構成を表示します
WSL2のDISPLAY変数の設定
nameserver
Microsoft のドキュメントに基づいて、ファイル内のをチェックして DISPLAY 変数を設定できます/etc/resolv.conf
。(フォローそして翻訳:すでに述べたとおり)
export DISPLAY=$(grep nameserver /etc/resolv.conf | awk '{print $2}'):0.0
しかし、このソリューションを使用すると問題が発生しました。おそらく、WiFi 接続と複数の仮想ネットワークを備えたノートブックを使用しているためです。以前のソリューションの代わりに、route.exe
デフォルト ゲートウェイで使用されるインターフェイスを使用して確認し、Windows IP アドレスを決定します。
export DISPLAY=$(route.exe print | grep 0.0.0.0 | head -1 | awk '{print $4}'):0.0
DISPLAY変数を設定する.profile
ファイル内で DISPLAY 変数を設定できます~/.profile
。私は次のコードを使用しました:
# set DISPLAY to use X terminal in WSL
# in WSL2 the localhost and network interfaces are not the same than windows
if grep -q WSL2 /proc/version; then
# execute route.exe in the windows to determine its IP address
DISPLAY=$(route.exe print | grep 0.0.0.0 | head -1 | awk '{print $4}'):0.0
else
# In WSL1 the DISPLAY can be the localhost address
if grep -q icrosoft /proc/version; then
DISPLAY=127.0.0.1:0.0
fi
fi