WSL2のDNS問題をいい感じに解決する(2024)
Could not resolve host
問題
散々苦しめられた、WSL2の 「WSL2と言えばコレ!」と言わんばかりの定番中の定番ネタなのですが、WSL2で apt
にしろ npm
にしろ、パッケージを更新しようとしたら失敗してしまい、よくよく見てみたらWSL2の名前解決がうまくいっていない…という事があります。
定番パターンは 8.8.8.8
を使う方法なのですが、個人的にはゴリ押し感が拭えず数年間モヤモヤしていました。今回はもっと良さそうな方法を見つけたので、紹介しておきます。
1. dnsTunnelingを使用する
WSL September 2023 update から、dnsTunneling
オプションが追加されました。
WSLの仮想マシンからWindowsホスト側にDNS名をリクエストして、直接Windows側のDNS設定を拾ってくるようになります。
設定方法はWSLのdistro毎に設定するのではなく、WSL全体のコンフィグに適用するので都度設定する必要もありません。Cのユーザ直下の自分のユーザディレクトリ内にある、 C:\Users\<username>\.wslconfig
に以下を追記するだけです。
[wsl2]
dnsTunneling=true
手元の環境で試した限りでは、Ubuntu
, Arch
どちらでも正常に動作しました。Dockerコンテナからも問題なく名前解決ができているようです。
2. 起動時にPowershellからDNS情報を引っこ抜く
結局はやっていることは dnsTunneling と近い事なのですが、Powershellから引っこ抜いてくる方法もあるようです。こちらはGithubでたまたま見つけました[1]。
ブート時のコマンドを指定して、マウントされたWindows側のpowershellを叩いてDNSサーバのIPを拾ってきているようです。
/root/boot.sh
に配置し、 /etc/wsl.conf
で指定してWSL起動時に呼び出します。
[network]
generateResolvConf=false
[boot]
command=boot.sh
手元環境では Arch
で動作確認済みです。
まとめ
長年悩まされた問題が dnsTunneling=true
一行で解決できるので超スッキリしました。 Windowsはどうしても開発環境が整え辛いイメージがありますが、WSLの発展に伴ってかなり良くなってきている実感があります。
Microsoftさん、この調子でシンボリックリンクの問題とか、 Wayland環境で fcitx5
が動かない問題とかも…何卒よろしくお願いします🙇
Discussion