WSLで名前解決できない問題を解消

Linux,初心者

unixの通信機能をイメージした画像

WindowsでWSL2を使用していると、知らぬ間にnameserverの値が172.29.176.1となって名前解決できずにアップデートなどができない事象に遭遇します。

今回はその原因と一時的な対処方法および恒久的な対処方法をご説明します。

発生する事象

以下のようにsudo apt updateなどのコマンドを打っても

failure resloving ~ となって名前解決ができないことがわかります。

名前解決ができないときのsudo apt update画像

ということで、DNSの設定ファイルである /etc/resolv.confを確認してみます。

cat /etc/resolv.conf
自動生成されたresolve.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モードに移行します。

デフォルトのwsl.conf画像

コピペなどで設定を追加します。「#」はコメントアウトされるため含めません。

resolve.conf自動生成停止画像

Escキーを押下、「:wq!」と入力しEnterキーを押下で変更内容が保存されます。

wsl.conf画像

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
dns設定画像

/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 を使用します。

nameserver設定画像
sudo apt update

はい。今回はエラーなくアップデートすることができました。

通信確認画像

まとめ

  • 名前解決できない原因はWSLの /etc/resov.conf ファイル自動生成設定が原因
  • 対処方法
    • ファイルの自動生成設定を変更する
    • /etc/resolv.conf を一度削除する
    • DNSサーバーの設定をする
    • /etc/resolv.conf が消えないように設定する

以上になります!参考になれば幸いです👍

created by Rinker
マイクロソフト
¥20,200 (2024/09/20 19:51:13時点 Amazon調べ-詳細)

Linux,初心者