目的
以前の記事 でWSL2のdocker環境からGUIアプリを起動する方法について解説しました。
ただ、WSL2の正式版でDNSエラーでapt update時にerrorが出る問題を解決した際にWSL2で毎回DISPLAY設定を行わないとGUIアプリが起動出来なくなってしまったので、今回はその対応方法について解説します。(一応DNSエラーの回避策も記載しておきます。)
※WSL2の正式版の前からこの問題はあったかもしれませんが、その辺りは調べていません。
ちなみに前の記事はWindows HOMEで今回はProですが、HOMEでも同様に出来ると思います。
また、今回はWSL2上でのGUIアプリの起動であり、docker環境では確認していません。ただ、恐らく同様に出来ると思います。
参考にさせて頂いた記事
https://github.com/microsoft/WSL/issues/4285
https://cartman0.hatenablog.com/entry/2020/07/16/https://cartman0.hatenablog.com/entry/2020/07/16/WSL2でネットワークのドメインを解決できない場合
https://stackoverflow.com/questions/61110603/how-to-set-up-working-x11-forwarding-on-wsl2
https://github.com/microsoft/WSL/issues/4106
作業環境
- Windows10 Pro
- バージョン:2004
- OSビルドバージョン:19041
- WSL2 Ubuntu18.04
解決方法
WSL2でネットワークのドメインを解決できない問題
いつ頃からかWSL2でapt updateを実施した際に以下のエラーが発生するようになりました。(正式版から?良くわかりません)
Err:1 http://archive.ubuntu.com/ubuntu bionic InRelease
Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://security.ubuntu.com/ubuntu bionic-security InRelease
Temporary failure resolving 'security.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease
Temporary failure resolving 'archive.ubuntu.com'
Err:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease
Temporary failure resolving 'archive.ubuntu.com'
~以下略~
これはwsl2ではDNSサーバの設定であるresolv.confが自動的に生成されますが、その際の設定がHOST IPになる為、正常に名前解決が出来ません。(恐らく)
これを解決する為、以下のページで紹介されている方法を実施します。
https://cartman0.hatenablog.com/entry/2020/07/16/WSL2でネットワークのドメインを解決できない場合
簡単に記載しておきます。
- wslを起動して
/etc/wsl.conf
ファイルを作成します。ファイルの中身は以下です。
[network]
generateResolvConf = false
これでresolv.conf
が自動生成されなくなります。
- 作成されている
resolv.conf
(恐らくシンボリックリンクとして作成されている)を削除し、新たにresolv.conf
を作成します。ファイルの中身は以下です。
nameserver 8.8.8.8
GoogleのパブリックDNSを使用するように変更します。
上記設定後WSLを再起動する(ウィンドウを閉じて開きなおしても良い。)。
※もしうまく行かない場合はPCを再起動してみて下さい。
これでDNSサーバの設定ができドメイン名が解決できるようになります。
DISPLAY設定でのエラーによりGUIアプリが起動できない
以前の記事 では以下のようにHOST IPをdisplayに設定していました。
LOCAL_IP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
export DISPLAY=$LOCAL_IP:0
前項で解説しましたが、resolv.conf=8.8.8.8
に設定している状態ですので、DISPLAY設定は8.8.8.8:0
になります。これではHOSTのDisplayをオープンできずにエラーが発生します。
その為、以下のようにip route
コマンドを使用してHOST IPを取得するようにします。
export DISPLAY=$(ip route | awk '/default via / {print $3}'):0
(補足)
これだとうまくいかないことがあるかもしれません。
参考ページ
https://github.com/microsoft/WSL/issues/4106
https://stackoverflow.com/questions/61110603/how-to-set-up-working-x11-forwarding-on-wsl2
これを.bashrc
に設定しておけば毎回DISPLAYの設定などせずにWSL2でGUIアプリが使用できます。(この問題を放置していた頃は毎回HOST側でIPを確認して、DISPLAY設定していた。。。)