LoginSignup
2
1

WSL2でDNSエラーを回避しつつGUIアプリを起動出来るようにする

Last updated at Posted at 2020-10-31

目的

以前の記事 で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設定していた。。。)

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1