WSL2で「困った」を解決したTips

AvatarPosted by

この記事は GRIPHONE Advent Calendar 2021 11日目の記事です。
サーバーサイドエンジニアの皆田です。

WSL2が公開になってしばらく経ちます。dockerを動かそうと思って「困った!」ということは誰しもぶつかる壁だったりします。
基本的なことではあるので詳しい人にとっては大した記事じゃないかもしれませんが、WSL2で困ったを解決したのでまとめたいと思います。

筆者環境については以下のようになっています。

Windows10 Pro 64bit
WSL2 Ubuntu20.04

sudo apt update がうまくいかない

docker-compose buildなどしようとした際、apt update エラーになり「ん?」となったことがあります。このとき、WSL2のubuntuを更新しようとしてみたら同様にエラーになってしまい、update & upgrade できない!困った!となりました。

この問題を解決するにあたり、私が遭遇した2つの解決方法についてまとめます。ファイアウォールについて書かれている記事を見かけましたが、私はその問題で利用できなくなるという事象には私はまだ遭遇していません。

1. DNSサーバの名前解決ができない問題

WSLの設定問題です。確認方法はカンタンで、ping打って接続が確立できていないことがわかれば大抵これです。最も遭遇しやすいエラーだと思います。

$ ping google.com
PING google.com (142.251.42.142) 56(84) bytes of data.
64 bytes from nrt12s45-in-f14.1e100.net (142.251.42.142): icmp_seq=1 ttl=117 time=4.58 ms
64 bytes from nrt12s45-in-f14.1e100.net (142.251.42.142): icmp_seq=2 ttl=117 time=4.91 ms
64 bytes from nrt12s45-in-f14.1e100.net (142.251.42.142): icmp_seq=3 ttl=117 time=4.99 ms
64 bytes from nrt12s45-in-f14.1e100.net (142.251.42.142): icmp_seq=4 ttl=117 time=5.12 ms

ping打ってみて上記のように返ってこない場合、これに該当します。
pingが正常に動いているならCtrl+cで止めましょう。
解決するには、次の手順を行います。

  1. wsl.confを書いて保存
sudo vim /etc/wsl.conf
[network]
generateResolvConf = false

2. wslを再起動します。Windows PowerShell で以下コマンドを実行します

wsl --shutdown

3. resolv.confに設定を書き、保存します。

sudo vim /etc/resolv.conf
nameserver 8.8.8.8

ubuntuターミナル上で再度pingを実行してみると、うまくいきました。

2. 時間ズレ問題

よくある問題のうち一つとして、Windows側とWSL2側で時間がズレてしまう問題があり、これにより一致が取れないのでsudo apt updateがこけてしまいます。

確認方法)dateコマンドを実行してズレがないか確認する

$ date
Mon Dec  6 00:51:10 JST 2021

dateコマンドを打って出てきた時刻とWindows側の時計と明らかにズレている場合、WSL2自体の再起動だけで解決可能です。Windows PowerShellを起動して以下コマンドでシャットダウンした後、WSL2のターミナルを起動してください。

wsl --shutdown

この問題はスリープした際などに発生するという記事が多いですが、必ずしもスリープしたからということではないように思います。(Windows起動してすぐこの現象に遭遇したことがあるため)

無事動きましたか?

WSL2で apt update などできない問題についてまとめてみました。
上記解決法で解決しない場合は、お力になれず申し訳ありませんが、他の記事を探してみてください。

おまけ:Xdebug動かない問題

PHP で開発をしていると、Xdebug が動いてくれないと困りますよね。
WSL2 や Linux環境を利用していて Xdebug がうまく動かない!という問題に遭遇している人は多いみたいです。

趣味で Ubuntu をいじっていて調べたら解決した方法があり、WSL2 でも動作確認ができたのでご紹介します。

docker を使っている場合、xdebug.ini に以下のような記述をしていると思います。

xdebug.client_host=host.docker.internal

実はこの host.docker.internal を解決できずに Xdebug と通信できないというのが問題点になります。

私の周りはmacユーザーが多く、WSLを利用している人がいなかったので、docker-compose.yaml を配置しているディレクトリ内に docker-compose.override.yaml を作りました。

内容は以下のような感じにします。

version: '3'

services:
  php-fpm:
    extra_hosts:
    - "host.docker.internal:host-gateway"

対処法としてはコレだけです。mac利用者には不要な設定なので、docker-compose-wsl.yamlを作っても良いのですが、-fオプションでいちいちファイルを読みだすのは面倒です。
docker-compose.override.yamlはdocker起動時に暗に読み込んでくれるため、意識しなくてもこのファイルを配置した人のみに適用することが可能です。
※賛否ありそうなので、あくまで私見ですが、個人環境に依存する設定はココに書いてしまう方が良いように思います。

gitで無視させておく

ここで注意したいのは、他の開発者には影響を与えたくないということです。このため、docker-compose.override.yaml は git で無視したいですが、ignore ファイルにも入れたくないので、.git/info/exclude を開き、ファイル名 docker-compose.override.yaml を記載します。

# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
docker-compose.override.yaml

最後の一行のみ追記して保存すると、git status 打っても何も出てこなくなります。

さいごに

2021年もコロナ禍でなかなか大変な一年でしたが、みなさんいかがお過ごしでしょうか?リモートになり、新たなPCに環境構築してみたらうまくいかなくなり作業がはかどらないということもあるかと思います。

いろんな環境を試し、柔軟に対応できると楽になれることもありますよね。

macのみ、Windowsのみとこだわらず、Linux環境にも触れていきましょう。