Windows 11 起動時に WSL も起動させておく VBScript
- ホストマシンに
cloudflaredを入れて WSL 環境に向けて SSH 接続できるようにした - DDNS を使って、グローバル IP アドレスの変化にも対応して Wake on WAN によるマシン起動ができるようにした
netplwizでマシン起動時のログインパスワード入力も自動化して回避した
ココまで設定したのだが、どうも WSL というのは Windows 起動時には立ち上がっていないようで、マシンを起動しただけでは WSL 環境への SSH 接続ができなかった。一度 Windows Terminal なんかを開いて、WSL Ubuntu のプロンプトを目視してあげれば、以降は SSH 接続ができた。
というワケで、マシン起動時に WSL を起動させるためのスクリプトを VBScript で組んだ。こうなった経緯を書いておく。
軽く調べてみると、PS> wsl -d Ubuntu --exec /bin/true という風に /bin/true を実行すれば WSL を起動できます、という文献が見つかるのだが、コレは実はうまく行かない。
実際、コマンドによって一瞬 WSL は起動する。PS> wsl -l -v で確認すれば Running にはなるのだが、数分放置しているとすぐに Stopped になってしまうのだ。
そこで実行すべきコマンドを調べ直すと、/bin/true ではなく sleep infinity を実行し続けるのが良いらしい。
コレさえ実行できればいいので、最初はタスクスケジューラで設定してみたのだが、PowerShell や Windows Terminal のウィンドウが開きっぱなしになる問題が避けられなかった。
- タスクスケジューラで
wsl.exe・d Ubuntu --exec sleep infinityを指定すれば、WSL が起動はするが、PowerShell ウィンドウが表示されっぱなしになってしまう。この PowerShell ウィンドウを閉じると、WSL は Stopped になってしまう- ちなみに、タスクスケジューラのトリガーを「スタートアップ時」にしていると上手く効かなかった。「ログオン時」じゃないとダメそう
- WSL 起動に関しては「最上位の特権で実行する」にチェックを入れると動作がおかしくなることが多いらしいので、このチェックは入れないでおくべき
- 「タスクを停止するまでの時間」などを設定してしまうと、マシン起動後にこのスケジューラが落ち、WSL へのコマンド実行が止まってしまい、WSL が Stopped になるので設定してはいけない
- ならばと、タスクスケジューラで
powershell.exe・WindowStyle Hidden -Command "wsl -d Ubuntu --exec sleep infinity"とすると、今度は Windows Terminal のウィンドウが表示されっぱなしになってしまう。コレも Windows Terminal のウィンドウを閉じるとコマンド実行が止まるため、WSL が Stopped になってしまう
というワケで、PowerShell を想定してコマンドを直接叩くのではなく、余計なウィンドウが出ないようにするため VBScript を経由することにした。
CreateObject("WScript.Shell").Run "C:\Windows\System32\wsl.exe -d Ubuntu --exec sleep infinity", 0, False
このような1行の .vbs ファイルを作ってコレを実行することで、完全ウィンドウ非表示にできる。
この .vbs ファイルをスタートアップに入れるだけにして、タスクスケジューラは使わない運用にして解消できた。
マシン起動後、スタートアップから呼ばれた .vbs ファイルによって、裏では VBScript 経由で sleep infinity が実行されっぱなしになっているはず。
試しに WSL のプロンプトを開かないように注意しながら PowerShell のウィンドウを起動して、以下のようなコマンドで直接 WSL 環境を確認してみると良い。
# WSL 内の SSH と cloudflared が起動しているか確認する
PS> wsl -d Ubuntu -- systemctl is-active ssh cloudflared
自分はコレで上手く行った。