🙄

WSL2で名前解決ができない場合の設定

2024/09/26に公開

はじめに

普段はMacを使っていますが、会社の方針でWindowsでWSL2+dockerの環境で開発環境を作っています。
個人的にはDocker使えればいいや、って思っていたんですがWSL2はバグや設定で、初心者の人は戸惑うことも多いんじゃないかと思います。
私もサーバーサイドエンジニアをやって、フロントエンドもやるようになりましたが、正直ネットワークまわりは余り気にしたことがなく、勉強も兼ねてZennに書くようにしています。

今回紹介する例はWSL2で名前解決ができず、nodeやnpmのインストールができなくなったお話です。

急にnpm installでエラーがでるようになった

ある日、nodeをinstallしようと思うと下記のようなエラーがでました
1行だけpickupしていますが、盛大にFailedが出ています

Failed to fetch http://archive.ubuntu.com/ubuntu/pool/universe/n/nodejs/nodejs-doc_18.19.1%2bdfsg-6ubuntu5_all.deb  Temporary failure resolving 'archive.ubuntu.com'
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

Ubuntsからのメッセージをみると

Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

一部のアーカイブが取得できませんでした、多分apt-get updateすれば大丈夫。もしくは --fix-missing オプション付けてtryしてみては?

そう思ってupdateやオプション付けても結果は変わりません
なんだか嫌な予感がしました

WSL2ではよくあること

幸いなことにWSL2を使っている人は多く、同じエラーに遭遇している人も沢山いました
WSL2のネットワークに不備があるのではないかとあたりがつきました

まずpingで外部ドメインにネットワーク繋がるかをチェックします

ping yahoo.co.jp

ネットワークにつながらない場合

ping: google.com: Temporary failure in name resolution

ネットワークにつながる場合

この場合は別要因でエラーになっていつものと思われます

PING yahoo.co.jp (182.22.24.124) 56(84) bytes of data.
64 bytes from 182.22.24.124 (182.22.24.124): icmp_seq=1 ttl=56 time=29.5 ms
64 bytes from 182.22.24.124 (182.22.24.124): icmp_seq=2 ttl=56 time=55.6 ms
64 bytes from 182.22.24.124 (182.22.24.124): icmp_seq=3 ttl=56 time=54.7 ms
64 bytes from 182.22.24.124 (182.22.24.124): icmp_seq=4 ttl=56 time=64.0 ms

--- yahoo.co.jp ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5003ms
rtt min/avg/max/mdev = 29.520/52.785/64.046/10.945 ms

ネームサーバーを確認する

レゾルバ設定ファイルというものがあって、ここにDNSの設定を書く必要があるようです。
WSL2+Ubunts24.04についてはWSL2起動時に、WindowsのIPアドレスが自動で書き込まれるようになっているんですね。やっかいなのが、これは通常のLinuxサーバーとは異なる設定なので、初心者じゃなくても気が付くにはなかなかハードモードです。

/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.29.192.1

このファイルの末尾にパブリックDNSを8.8.8.8をいれてあげます(今回はGoogleさん)

nameserver 8.8.8.8

ネームサーバーの自動書き換えをオフにする

/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

WSLは自動でファイル作成しているので、ストップする方法を書いてくれています。
新設ですね

wslの設定ファイルを開きます

touch /etc/wsl.conf #ファイルがない場合は作る
vi /etc/wsl.conf

末尾にこちらを追記してあげましょう

[network]
generateResolvConf = false

これで設定は完了しました。
あとは再起動をして/etc/resolv.confが自動生成していないか確認しましょう。

wsl --shutdown

EOF

Discussion