WSL2のDNSサーバーアドレスとX11の$DISPLAYを別にする

環境

既存の方法における問題

WSL2ではネットワーク構成が従来のWSL1と異なるため、X Window SystemGUIをホストOSのWindows上に表示させるといったケースでは、DISPLAY環境変数を(:0.0などから)変更する必要がありました。 その指定方法として、多くのサイトでは次のような設定が提示されていました。

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0

上記の指定方法ではWSL2のネームサーバーとして、仮想ネットワーク上のホストOS(Windows)のローカルIPアドレスを指定しています。 しかしながら、この方法では/etc/resolv.confを参照しているため、DNSとして(GoogleやCloudflareなどといった)外部のDNSサーバーを指定することができません。

WSL2を使っているとDNSX11が参照するIPアドレスを分けたくなる場合があります。 そのための設定手順をまとめます。

注意

OSやディストリビューションの違いによってはうまく動作しないかもしれません。 動作しないようなら元に戻しておくことをお勧めします。

手順

  1. /etc/wsl.confを編集し、generateResolvConfをfalseにする
  2. Powershell/cmd上でwsl --shutdownを実行する
  3. WSL2を再起動しsudo unlink /etc/resolv.confシンボリックリンクを解除する
  4. /etc/resolv.confを作成(中身は"nameserver 1.1.1.1"など)し、2.と同様にWSL2を再起動する
  5. ~/.bashrcなどで指定されているDISPLAY環境変数を次のように変更する*1
    bash export DISPLAY=$(arp -a | sed -E "s/.*\((.+)\).*/\1/"):0.0

    bash export DISPLAY=$(ip route show 0.0.0.0/0 | awk '{print $3}'):0.0

  6. WSL2にログインしなおし、DNSサーバーとDISPLAY環境変数の設定が問題ないことを確認する

参照

github.com

zuntan02.hateblo.jp

Fix DNS resolution in WSL2 · GitHub

*1:ホストOSにあたるゲートウェイを指定したいので下の方が良さそうです