はじめまして。ウチイダです。Qiita初投稿です。
普段はブログを書くのですが、今回はQiitaにも書きます。
結論から
WSL2で、Linux側のファイルシステムにファイルが置いてあってもnpmがとても遅いときに試してみてほしいことです。
パッケージ配信サーバの名前解決ができてないことが原因の場合があります。
以下のコマンドでWSL2が利用するネームサーバーを8.8.8.8に変更すると改善するかもしれません
$ sudo rm /etc/resolv.conf
$ sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
$ sudo bash -c 'echo "[network]" > /etc/wsl.conf'
$ sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf'
$ sudo chattr +i /etc/resolv.conf
コマンド実行後、Powershellやコマンドプロンプトからwsl --shutdown
を実行してWSL2を再起動してください。
環境情報
- OSバージョン: Windows 11 Pro 21H2(ビルド 22000.376)
- WSLカーネル バージョン: 5.10.60.1-microsoft-standard-WSL2
- Ubuntu バージョン: 20.04.3 LTS (Focal Fossa)
WSL2 でnpm がめちゃ遅い問題
ウチイダもずっと悩まされていたこの問題。
コンソール上のスピナー(点がくるくる回るやつ)が止まってしまうし、プログレスバーも動かない。
最終的にタイムアウトになってしまい、なかなか開発に着手できないことが多々ありました。
解決しようと思って検索すると、だいたい「/mnt 配下にファイルを置いてはいけない」という内容のページが出てきます。
WSL2のファイルシステム上でもやっぱり改善せず。
結構時間をかけて調べたけど、原因が特定できず、長いこと放置していました。
名前解決の問題だった?resolve.confを修正したら改善した
WSLの通信状況について別の問題も出てきたので、改めて調べてみました。
どうやら名前解決ができてないことが原因のようでした。
その方向でググり直してみたら、以下のページを見つけました。
こちらのコメントの中で、resolv.conf
を修正する解決策を提示しているものがありました。
$ sudo rm /etc/resolv.conf
$ sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
$ sudo bash -c 'echo "[network]" > /etc/wsl.conf'
$ sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf'
$ sudo chattr +i /etc/resolv.conf
上記のコマンド実行後、PowerShellや cmdでwsl --shutdown
を実行してください。
ウチイダの環境では、これでWSLのネットワーク関係で困っていたことがいくつかまとめて解決しました。
是非試してみてください!
その他の効能
この設定を行ってから、ウチイダの環境で改善した事象がいくつかありました。
-
git clone の動作不良
名前解決の問題に気づいた原因になったのが、これでした。
github.comの名前解決に失敗することがあり、git コマンドでリモートリポジトリにアクセスできなくなることがしばしばありました。 -
docker コマンド の速度改善
きちんと時間を測ったわけではないのですが、docker pullでイメージを取ってくる時間や、ビルドにかかる時間が短くなりました。
余談、なぜQiitaに書いたのか
ここからは余談です。
じつは同じような内容を自身の備忘録ブログにも書いたのですが、今回はQiitaにも書いてみようと思いました。
理由はいくつかあります。
ひとつめ、日本語の検索キーワードに引っかかるように
これが大きな理由です。
日本語の情報では、この事象に対してresolv.conf を変更するという方法が紹介されているものが検索上位に表示されませんでした。
Qiitaのドメインパワーで上位に表示されないかな…と考えて、こちらでも記事にしてみることにしました。
ふたつめ、副作用についての知見を得たい
とりあえず解決はしましたが、この変更によってWSL2になにか他の問題が起こりそうでドキドキしています。
ふつうのLinuxならともかく、Windowsと密接に連携しているので、なにが起こるのか理解しきれていません。
もともと設定されていたvEthernetじゃないとうまくできないことがあるかもしれない…と心配なので、
自身のブログだけでなく、人目につきそうなQiitaにも書いておくことにしました。
WSL2とWindows ホストの名前解決の連携について、どなたか詳しい方がいれば、問題や懸念点などをご指摘いただけると嬉しいです🙇
まとめ
改めて、英語で情報を取りに行くことの効果を実感しました…
日本語での検索で引っかからなかったものは、今回のようにまたQiitaに書いていこうと思います。