初めに
システム治療家もやっている @CinTAKE です。
WSL2は新しいツールであるため、未知の問題が発覚したり、既知であるが対処法が固まっておらず未修正のままの問題がある。その中から重大なものを取り上げ、原因や治療法を解説する。
事例と治療法
マシンのメモリーを使い果たしてしまって、WSL2以外のアプリが動かなくなる
前提
- 発生時期:2021年卯月
- バージョンおよび確認方法:下記に記載
- マシンスペック:下記に記載
[WSL]
10.0.19041.867
[Windows]
WindowsProductName WindowsVersion OsHardwareAbstractionLayer
------------------ -------------- --------------------------
Windows 10 Pro 2009 10.0.19041.844
[CPU]
CsNumberOfLogicalProcessors CsNumberOfProcessors CsProcessors
--------------------------- -------------------- ------------
8 1 {Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz}
[Nemory]
CsTotalPhysicalMemory
---------------------
21327122432
# 情報取得:PowerShellにて、以下のコマンドを実行
(Get-Command wsl).FileVersionInfo.ProductVersion
Get-ComputerInfo | select WindowsProductName, WindowsVersion, OsHardwareAbstractionLayer
Get-ComputerInfo -Property "*processor*"
Get-ComputerInfo -Property CsTotalPhysicalMemory
現象
原因
以下の記事に書いてあった。 @yoichiwo7 さん、ありがとう。
結論から言うと、WSL初期設定とLinuxのメモリー利用方針の相互作用で発生していた。
- デフォルト設定のWSLは、メモリーを自動拡張して使用し、上限は80%
- Linux側はメモリーの空きをファイルキャッシュなどに割当てる
- 完全なフリーエリアが極小となり、マシンメモリを使い果たす
治療
対症療法ではあるが、治療法も記事にあり、メモリー自動拡張をやめ、さらにSWAPも無効にするとよいとのこと。以下のように、「.wslconfig」というWSL設定ファイルを作成・修正する。
sakura $ENV:Userprofile/.wslconfig
以下がファイルの内容。物理メモリー(20G)の60%程度を指定し、swapは0とした。
[wsl2]
memory=6GB
swap=0
結果と予防
メモリー使用量は劇的に減り、初期状態での「Vmmem」は約2.2Gのみとなった。VSCodeでDocker開発した場合でも、9G程度であり、食い尽くすことはなくなった。
このままだと、複数コンテナを起動するときに、メモリー不足になることも想定できる。定期的にモニターしておいて、リソースプランニングすればいいのだが、適当なツールが思いつかず、当面はタスクマネージャを手動で起動て監視し、割当量をを調整することとする。
bashでスクリプトが異常動作する
前提
- 発生時期:2021年卯月
- バージョンおよび確認方法:下記に記載
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
. . . . .
Linux LAPTOP-4SVL7A92 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28 23:40:43 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
. . . . .
# 情報取得:bashにて、以下のコマンドを実行
bash --version
uname -a
cat /etc/os-release
現象
bashスクリプトを実行すると、以下のようなエラーとなる。
: No such file or directory
原因
「set -xe」で実行するも原因特定できず、別のスクリプトを試していると、以下のようなエラーが出た。
bash: /usr/bin/systemctl: /usr/bin/bash^M: bad interpreter: No such file or directory
改行コードが問題であった。
初心者向けの詳細説明
文字列の改行を制御する「改行コード」は、扱っている言語やOSなどで違いがあり、表示は同じに見えても内部コードとしては異なっている事がある。今回のbashスクリプトも、改行コードの違いで動作しなかった。よく遭遇する代表例としては、Windows(MS-Dos)系とLinux(*nix/BSD...)系の違いであり、それぞれAscii/UTF-8の文字セットではWindows系がCR+LF(16進数で0D0A)、Linux系がLF(0A)となる。治療
Visual Studio Codeの設定を変更し、改行コードをLinuxと同じLFにする。34
Gitの設定も変える。(デフォルトではテキスト系の書類はpullするときに改行コードがOS標準に変換される)5
結果と予防
無事動作するようになった。改行コードや行末の余分はスペースを表示する拡張機能を入れることで可視化し、再発防止に役立てる。
WSL2 Docker が Windowsの C: ドライブを食い尽くして戻らない
前提
- 発生時期:2021年春
- バージョンおよび確認方法:下記
- マシンスペック: CドライブHDD:250G SSD
PS C:\home> winver
# バージョン 20H2 (OSビルド 19042.1237)
PS C:\home> docker --version
Docker version 20.10.8, build 3967b7d
現象
C:ドライブの空き領域サイズが残り少なくなり、Docker領域が大きかったので、system prune などをして不要なイメージ等を削除。しかし、Docker領域が解放されず、ディスクの空き領域サイズに変化がない。???
原因
色々調べると6、WSL2が仮想ディスクとして領域を抱え込んでしまい、自動的には解放してくれないとのこと、しかもその領域がC:ドライブで、サイズが250Gであることが判明。
治療
以下のリンクを参考に対処する、Windowsの環境やバージョンによって使える・使えないものがあるので、注意。なお、領域を変更するときに壊れる可能性もあるため、重要なデータはバックアップすること。
その他参考リンク集
- https://7me.nobiki.com/2020/10/12/wsl2-docker-re-use-disk-space/
- https://dev.to/marzelin/how-to-reduce-size-of-docker-data-volume-in-docker-desktop-for-windows-v2-5d38
- https://www.curict.com/item/f4/f46da60.html
- https://marcroussy.com/2020/12/01/cleaning-up-docker-disk-space-in-wsl2/
- https://note.com/yulianess/n/n8d2b1a43369a
- https://blog.dreamhive.co.jp/mkoba/?p=4033
結果と予防
無事に領域が戻ってきてC:ドライブの空領域サイズも増えたのだが、250GというWSL2領域サイズの指定自体を変える方法が見つからないので、時々メンテしてあげる必要が残っている。
終りに
困ったときほど、成長するチャンス。
親記事:WSL2とVSCで作るWindowsでのDocker内開発環境(2021年睦月)
テンプレート
## 事象のタイトル
### 前提
- 発生時期:
- バージョンおよび確認方法:
- (マシンスペック:)
### 現象
### 原因
### 治療
### 結果と予防