WSLで名前解決できない問題を解消
WindowsでWSL2を使用していると、知らぬ間にnameserverの値が172.29.176.1となって名前解決できずにアップデートなどができない事象に遭遇します。
今回はその原因と一時的な対処方法および恒久的な対処方法をご説明します。
発生する事象
以下のようにsudo apt update
などのコマンドを打っても
failure resloving ~ となって名前解決ができないことがわかります。
ということで、DNSの設定ファイルである /etc/resolv.confを確認してみます。
cat /etc/resolv.conf
nameserverの値が172.29.176.1となっていますね。これはプライベートIPアドレスといってインターネット上では使用されることがない、LANの中だけで通用するアドレスになります。
このIPアドレスを持つマシンが適切に設定されたDNSサーバーであれば名前解決が可能ですが、WSL2起動時にWSL自身がが勝手に設定したアドレスになりますので、このままではまず外部にアクセスすることは不可能です。DNSについてはJPNIC(日本ネットワークインフォメーションセンター)の記事が参考になります。
原因
# 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
上記の/etc/resolv.conf
にこのように記載があります。和訳すると「このファイルはWSLにより自動的に生成されました。このファイルの自動生成を止めるには、/etc/wsl.confに次のエントリーを追加して下さい。」です。
デフォルトではWSLが/etc/resolve.confを自動生成する仕組みがになっていることが原因なんですね。
しかも対処方法までしっかり書かれています。
解消法
自動生成される処理を止める
しょっちゅう自動生成されてnameserverの値が書き変わるのが面倒なので。自動生成を止める記述をしていきます。上記の指示通り、/etc/wsl.confに以下の文言を追加します。
[network]
generateResolvConf = false
viで/etc/wsl.confを開きます。
sudo vi /etc/wsl.conf
systemdの行にカーソルを合わせて oキーでInsertモードに移行します。
コピペなどで設定を追加します。「#」はコメントアウトされるため含めません。
Escキーを押下、「:wq!」と入力しEnterキーを押下で変更内容が保存されます。
DNSサーバーの設定する
/etc/resolv.conf を一旦削除する
一度、/etc/resolv.conf ファイルを削除します。というのも次のステップで /etc/resolv.confファイルが削除するための処置を行うのですが、なぜか既に生成されている /etc/resolv.confファイルに対してはエラーが出てその処置を行うことができないからです。
sudo rm /etc/resolv.conf
/etc/resolv.conf を手動で再作成し、DNSサーバーの設定を記述する
/etc/resolv.conf を手動で作成します。resolveではないことに注意してください。resolvです。
その後、nameserverの値を「8.8.8.8」に設定します。これはGoogleが用意してくれているDNSサーバーになります。「:wq!」で変更内容を保存します。
sudo vi /etc/resolv.conf
nameserver 8.8.8.8
/etc/resolv.confが削除されるのを防止する
実は /etc/wsl.confに「generateResolvConf = false」を追加した副作用で /etc/resolv.conf が削除されてしまいます。この削除を防止するため /etc/resolv.confの属性を変更します。
chattr の+i オプションは immutable の頭文字かと思われます。英単語としては「普遍の」という意味で、Linuxではファイル変更不可に属性を変更するコマンドになります。つまり削除されないように変更します。
余談ですが、Unixコマンドのch系は他に「chmod」があります。chがchangeの頭文字です。chmodは change + modeでモードの変更、 change + attributeで属性を変更を意味するコマンドというわけですね。
sudo chattr +i /etc/resolv.conf
動作確認
一度WSLをシャットダウンする
コマンドプロンプトからWSLをシャットダウンします。
Win + Rキーでコマンドプロンプトを起動して以下のコマンドを入力します。
wsl --shutdown
wslコマンドで再度WSLを起動します。
wsl
catで /etc/resolv.conf の中身を確認。ちゃんと残ってますね!外部システムにアクセスできることを確認するために、sudo apt update を使用します。
sudo apt update
はい。今回はエラーなくアップデートすることができました。
まとめ
- 名前解決できない原因はWSLの /etc/resov.conf ファイル自動生成設定が原因
- 対処方法
- ファイルの自動生成設定を変更する
- /etc/resolv.conf を一度削除する
- DNSサーバーの設定をする
- /etc/resolv.conf が消えないように設定する
以上になります!参考になれば幸いです👍