はじめに
WSL2 でシェルを抜けると数秒後に Ubuntu がシャットダウンしてしまい外から ssh できなくなってしまう問題を解消したく色々と調べていたところ、とても分かりやすい解説が GitHub に載っていたので自分のメモがてら抜粋の日本語意訳をここに載せておきます。
出典
抜粋・日本語意訳
WSL2 の 詳細設定のページ に以下の記述があります。この説明は正しいのですが、紛らわしいです。
key | value | default | notes |
---|---|---|---|
vmIdleTimeout | number* | 60000 | The number of milliseconds that a VM1 is idle, before it is shut down. Only available for Windows 11. |
紛らわしい原因は、ここでいう「VM」が、WSL2 を動かしている VM それ自体を指しているという事実にあります。すなわち、この「VM」は WSL2 の distro(「コンテナ」「インスタンス」も同意)を指しているわけではありません。
本件に関して、2つのタイマーが存在します。
1つ目のタイマーは、distro のインスタンスがアイドルになってからどれだけの時間で終了するか、というものです。「アイドルになる」とは、たとえば wsl --terminate <distro>
で init
以外に実行中のプロセスがなくなったと考えていただければよいでしょう。
このタイマーは設定不可能であり、私の知る限り 15 秒にハードコード2されています。
2つ目のタイマーは、WSL2 の VM に固有のものです。
WSL2 VM は 1 つの Windows につきただ一つしか実行されない共有 VM で、インスタンスが終了した後もこの VM は実行されつづけ、メモリを消費します。wsl --shutdown
は、この VM を終了させるコマンドです。
タスクマネージャーで以下のプロセスを見てみると、VM の起動と終了の様子が分かります。
- Vmmem: vmmem.exe
- 仮想マシンワーカープロセス: vmwp.exe
これらは最初に WSL2 インスタンスを実行すると現れます(インスタンス起動の前にまず VM が起動するので)。そして(vmIdleTimeout
または wsl --shutdown
によって)VM がシャットダウンされると消えます。
また、VM の起動と終了はイベントビューアーの Applications and Services Logs -> Microsoft -> Windows -> Hyper-V-Worker -> Admin でも確認ことができます。
vmIdleTimeout
はこの2つ目のタイマーの秒数です。すなわち、すべての WSL2 インスタンスが終了してから VM がシャットダウンするまでの時間を指定するものです。
まとめると、あなたが最後の WSL インスタンスから exit したとき(他にバックグラウンドでプロセスが実行されていないとして)に起きることは以下のとおりです。
- 15秒のタイマーが始まり、その後にインスタンスが終了する
- 最後のインスタンスが終了すると「アイドル状態」のタイマーが始まる。そして
vmIdleTimeout
(デフォルトは 60) 秒後に WSL2 VM がシャットダウンする
-
厳密には "a VM" は "the VM" であるべきでしょう。なぜなら WSL2 の VM は一つしか実行されないからです。 ↩
-
これを設定可能にしてほしいという issue が Add the ability to change the timeout period of a WSL instance #6782 で起票されています。 ↩