はじめに
WSL2にubuntu20.04を入れて使おうとして、sudo apt update や git clone hogehoge をしようとしたら、名前解決できずにネットワークにアクセスできませんでした。
解決はしたのですが、一応メモしておきます。
- (理由は分からないのですが) /etc/resolv.conf がおかしいので、8.8.8.8 と書き直す
- (それでも解決しないので)直接DNS のIPアドレスを調べて、/etc/resolv.conf に書く
がやったことです。
【追記2022/11/27】それでも解決しないとき、なぜか、WSL2 を version 1 にしたら動いたことがありました。
内容
まず、/etc/resolv.conf ですが、私の環境ではシンボリックリンクになっていて、下記のように変な状態でした。
$ file /etc/resolv.conf
/etc/resolv.conf: broken symbolic link to ../run/resolvconf/resolv.conf
もともと、いろいろ書かれているように、初期設定時に resolv.conf を書く、という設定が紹介されていました。自分の所では、下記のようにしていました。
[network]
generateResolvConf = false
ここが true だと resolv.conf が作られるそうです。
true set WSL to generate /etc/resolv.conf. The resolv.conf contains a DNS list that are capable of resolving a given hostname to its IP address.
これは置いておいて、resolv.conf がないと、
nameserver 8.8.8.8
のように自分で書く、ということで解決されている方が多いようです。
調べて書く
私の場合、それでも解決できませんでした。ので、直接、調べて設定しました。power shell で
$ ipconfig /all
として、ホストのwindows がネットワークに接続している接続のDNSサーバのIPアドレスを調べます。それを、resolv.conf に追加しました。
WSL2 再起動
WSL2 を終了させます。power shell から行います。
> wsl --shutdown
正常動作?
とりあえずネットにつながっただけで、あるべき正しい姿がまだよく分かりません。
別の環境では、/etc/wsl.conf はなく、/etc/resolv.conf は
$ file /etc/resolv.conf
/etc/resolv.conf: symbolic link to /mnt/wsl/resolv.conf
$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.21.32.1
となっていて、問題なく使えています。
原因について考察
途中からホスト側のネット環境が変わると、DNSも変わる可能性があると思います。そのとき、起動中のWSL2のresolv.conf は古いままとなり、名前解決されなくなる可能性があるのかな、と思いました。例えば、喫茶店を変えて接続するFree WiFiが変わるとか、途中で会社のVPNに入るとか。
また、正常な状態なら、/etc/resolv.conf が正常に作られるようなので、wsl.conf で generateResolvConf = false にしない方が良いのかもとも思いました。実際にもう一つの環境では、問題なく動いています。
あと、Docker for windows で WSL2を使っていたのも影響していたかもしれません。途中からきどうしたとき、何か変わるのかな。
まぁ、いずれしていも良く分からん。
それでも動かない(WSL1へ)
WSL2からWSL1 へ?(2022/11/27追記)
それでも(確実に)動かないときがありました。ホストマシンがプライベートのネットワークでグローバルIPを持たない状態でしたが、それが関係しているか分かりません。ホスト側でイーサネットのDNSにはIPv6のアドレスが書かれていました。そのとき、確実にWSLでネットにつなぐには、WSL version 1 にしたら動きました。
PS> wsl --set-version ubuntu_20.04 1
で1にできます。
もしversion 2なら、WSL2 でのkernel version が5.10.xxx になるようです。
$ uname -a
Linux node-name 5.10.102.1-microsoft-standard-WSL2 #1 SMP Wed Mar 2 00:30:59 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
考察
Ubuntu20.04 をインストールするとき、WSL のdefault version が 1 でした。それが関係しているのかも、という気もしますが、分かりません。
やはり動かないらしい(2023/4/11追記)
ずばりこの記事。2023年3月の投稿だよ。
WSL1ではhostのネットワーク接続がそのままWSL1で使えるけれど、WSL2ではそうではないと。特に、WSL2ではIPv6は使えないと。がーん。WSL1にするは正しい方法だったのか。
IPv6 access
WSL 2 distributions currently cannot reach IPv6-only addresses. We are working on adding this feature.
参考情報
他にもたくさん読みました。多謝。
まとめ
WSL2でネットワーク接続において名前解決ができなくなったとき、/etc/resolv.conf を修正したら動きました。今後も様子をみます。。。Linuxマシンを使いたいのに使えない環境に、今日も涙。
(2022/10/28)
追記
- 2022/11/27 それでも動かない: WSL2からWSL1 へ? を追加
- 2023/4/11 WSL2でIPv6が現在は使えないとの learn.microsoft.com の記事のリンクを記事を追加