前回はWSL2で導入したUbuntuにLAN上のPCから接続する方法を紹介しました。
ここまで来るとWSL2上で動いているとはいえ普通のLinuxと変わりなく感じてきます。そこでUbuntu(WSL2)が自動的に起動するようにしてしまいましょう。
常に動かしておけば、少々メモリは消費しますが、サーバのように利用できます。
WSL2の自動終了
WSLのLinuxは立ち上げても何もしていないと勝手に終了してしまいます。
どうも、WSL2の設定ファイル「.wslconfig」には「vmIdleTimeout」という設定項目があります。
公式サイトでは
VM がアイドル状態になってからシャットダウンされるまでのミリ秒数。 Windows 11 でのみ使用できます。
と説明されています。
デフォルト値は「60000」となので、アイドル状態が60秒つづくと自動的に終了することになります。
この値を変えて試してみたのですが、自動終了する時間は変わらない気がします。
もしかしたら将来的に有効になる設定なのかもしれません。
WSL2のLinuxをサーバのように動かしておきたい場合は、この自動終了は避けなければ行けません。
問題は「アイドル状態」というのは何を指しているのか、よくわからないことです。
いろいろ試したところ
- WSLのLinuxのシェルが起動している(Windows Terminalなどでシェルを起動している)
→ 自動的に終了しない (アイドル状態ではない) - wslコマンドで適当なLinuxコマンド(lsやecho等のコマンド)を実行する
→ 自動的に終了する (アイドル状態) - wsl.confファイルでSSHサーバ等を起動する状態にして、wslコマンドで適当なLinuxコマンドを実行する
→ 自動的に終了する (アイドル状態)
という挙動でした。
三番目のwsl.confファイルでSSHサーバを起動するというのは下記で紹介した内容のものです。
これは誤算でした。SSHサーバ等が起動していればアイドル状態ではないと思ったのですが、そうではないようです。
そこでさらに調べてみたところ
- wslコマンドでデーモン(サービス)を起動すると、自動的に終了しない
ということがわかりました。
従って、Windowsの起動時に、wslコマンドで何らかのデーモン(例えばSSHサーバ)を起動するようにすれば、バックグラウンドでWSLのLinuxを起動し続けることができ、サーバのように利用できることになります。
WSL2の自動起動の設定
WSL2が自動的に終了する条件がなんとなくわかったところで、WSL2のLinuxを自動起動させる設定をしていきます。
やることは
- WSL2を起動するためのバッチファイルの作成
- 作成スクリプトファイルを自動実行する設定
の二つです。
バッチファイルの作成
下記のような内容のファイルをstart-wsl2.batとして作成します。
wsl -u root -- service cron restart FOR /F "usebackq" %%i in (`wsl -e hostname -I`) do set IP=%%i netsh interface portproxy delete v4tov4 listenport=10022 netsh interface portproxy add v4tov4 listenport=10022 connectaddress=%IP% connectport=22 netsh interface portproxy delete v4tov4 listenport=13390 netsh interface portproxy add v4tov4 listenport=13390 connectaddress=%IP% connectport=3390
1行目が重要で「WSL2を起動して自動終了しないようにする処理」です。この処理ではサービスとしてcronを(再)起動しています。cron以外でもかまいませんが、何らかのサービスを(再)起動するようにしてください。
それ以降の行は前回の記事で紹介した「外部からWSL2のLinux」に接続するための設定です。
ここでは、SSH用にWindowsのポート10022への接続をWSL2のポート22へ、リモートデスクトップ(xrdp)用にポート13390への接続をWSL2のポート3390へ転送しています。
外部からWSL2のLinuxに接続する必要がない場合は、1行目だけあればOKです。
作成したstart-wsl2.ps1は適当なフォルダに保存しておきます。
自動実行の設定
作成したstart-wsl2.batをWindowsの起動時に自動実行するようにします。
自動実行の設定にはWindowsのスケジューラを使用します。Windows11の場合はスタートメニューで「タスクスケジューラ」と入力すると出てきます。
タスクスケジューラが起動したら、右側のペインで「タスクスケジューラライブラリ」を選択し、右側のペインで「タスクの作成」を選択します。
これでタスクの作成画面の「全般タブ」が表示されます。
この画面では下記の設定をしていきます。
- 名前:
何でも良いのですがわかりやすい名前をつけておきます。 - ユーザがログインしているかどうかにかかわらず実行する:
Windowsの起動時に自動実行するためにこれを選択します。 - 最上位の特権で実行する:
忘れずにチェックします。このチェックを忘れるとWSL2が自動終了してしまう気がします。 - 構成:
よくわかりませんがとりあえず「Windows10」としておきます。
つづいて「トリガー」タブを選択します。
トリガータブでは「新規」を選んで、「タスクの開始」を「スタートアップ時」にして新しいトリガーを作成します。
次に「操作」タブを選択します。
操作タブでは「新規」を選んで、「操作」を「プログラムの開始」、「プログラムスクリプト」を「作成したstart-wsl2.bat」として新しい操作を作成します。
次に「条件」タブを選択します。
条件タブでは、「コンピュータをAC電源で使用している場合のみにタスクを開始する」をオフにします。
以上の設定が終わったら「OK」を選択します。
このとき次のようなウィンドウが表示されたら、Windowsの管理者ユーザのユーザ名とパスワードを入力しましょう。
これで設定完了です。
Wndowsを再起動しましょう。再起動後にWindowsTerminalを起動して、wslコマンドで状態を確認し、「Running」となっていれば成功です。
> wsl --list -v NAME STATE VERSION * Ubuntu Running 2
これでバックグラウンドでWSL2のLinuxが動いているのでいつでもSSHやリモートデスクトップで接続できます。
まとめ
今回はWSL2で導入したUbuntuをWindowsの起動に合わせて自動実行する設定を紹介しました。
WSL2のLinuxを自動的に立ち上がるようにしておくと、SSHやリモートデスクトップでいつでも接続することができ、あたかもLinuxサーバが起動しているように使うことができます。
次回はUbuntuではなくLinux MintをWSL2で使ってみたいと思います。
コメント