問題の事象
sudo apt-get update
をしたら
W: Failed to fetch https://packages.microsoft.com/ubuntu/18.04/prod/dists/bionic/InRelease Temporary failure resolving
と表示された??
え?
wget https://packages.microsoft.com/ubuntu/18.04/prod/dists/bionic/InRelease
したら
curl: (6) Could not resolve host: packages.microsoft.com
となった。 DNS による名前解決ができていない??
Windows 側の環境では ちゃんと https://packages.microsoft.com/ubuntu/18.04/prod/dists/bionic/InRelease
見えるのに・・。
DNS の状況確認
dig +tcp packages.microsoft.com
した結果
;; Connection to 172.25.208.1#53(172.25.208.1) for packages.microsoft.com failed: timed out.
でも
dig packages.microsoft.com
だと ちゃんと応答を返す。
TCP 接続での DNS 解決ができていないために このトラブルが発生している。
解決方法(2024/05 に 解決方法がリリースされました)
WSL の 最新バージョンでは ネットワーク設定周りの強化が行われました。
現在インストールされている WSL を最新版に更新します。
wsl --update
Windows 11 でも Windows 10 でも インストールできます。
インストール後の確認
wsl --version
Windows 11 の場合
WSL バージョン: 2.1.5.0
カーネル バージョン: 5.15.146.1-2
WSLg バージョン: 1.0.60
MSRDC バージョン: 1.2.5105
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22631.3593
Windows 10の場合
WSL バージョン: 2.1.5.0
カーネル バージョン: 5.15.146.1-2
WSLg バージョン: 1.0.60
MSRDC バージョン: 1.2.5105
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.19045.4412
になっていると思います。
C:\Users\<<ユーザ名>>\.wslconfig
ファイルを作成して
[wsl2]
dnsTunneling=true
の定義を入れると DNS の 問題が改善するようです。
この方法は WSL 側から Windows で管理しているDNS情報をネットワークを使わずに取得する事ができるような仕組みになっているそうです。
実験的な機能です、と公開されている時から利用していますが、安定して動作しています。
Windows 11 22H2 以降を実行しているマシンでは、.wslconfig ファイルの [wsl2] の下に dnsTunneling=true を設定すると、WSL では WSL 内から DNS 要求に応答する仮想化機能が使用され、ネットワーク パケット経由でそれらが要求されることはありません。 この機能は、VPN やその他の複雑なネットワーク設定との互換性を向上させることを目的としています。
解決方法(旧方法 参考までに・・)
WSL2 の DNS は WSL2 起動時に自動的に 仮想ネットワークの 172.25.208.1
等のアドレスに
なっている事があって、この仮想ネットワークのDNS が不調になっている場合に発生する。
WSL2 の中でも Google の DNS サーバー 8.8.8.8
を利用するように設定する事で
仮想ネットワーク上の DNS を利用しないようにする。
コマンドプロンプトから WSL をシャットダウンさせる。
wsl --shutdown
次に wsl にログインして /etc/wsl.conf
ファイルを作成して、下記の内容を登録する
sudo vi /etc/wsl.conf
[network]
generateResolvConf = false
次に /etc/resolv.conf
ファイルを削除して DNS の設定を登録
sudo rm /etc/resolv.conf
sudo sh -c "echo 'nameserver 8.8.8.8' > /etc/resolv.conf"
/etc/resolv.conf
は ../run/resolvconf/resolv.conf
へのシンボリックリンク
なっているので一旦削除して設定します。
編集したら、サービスの再起動をしなくても DNS 設定が変更されます。
おまけ: DNS 設定を元に戻す方法
DNS 設定を変更前に元戻す場合下記の手順を行います。
cd /etc
sudo mv resolv.conf resolv.conf.new
sudo ln -s ../run/resolvconf/resolv.conf resolv.conf
sudo rm /etc/wsl.conf
コマンドプロンプトから
wsl --shutdown
として もう一度 wsl にログインします。
参考URL
Microsoft Docs : Windows Subsystem for Linux のトラブルシューティング
/etc/wsl.conf
についての詳細な解説は