UbuntuをWindows11上で動かす その13: 自動起動する

UbuntuをWindows11上で動かす その13: 自動起動する Ubuntu
スポンサーリンク

前回はWSL2で導入したUbuntuにLAN上のPCから接続する方法を紹介しました。

ここまで来るとWSL2上で動いているとはいえ普通のLinuxと変わりなく感じてきます。そこでUbuntu(WSL2)が自動的に起動するようにしてしまいましょう。

常に動かしておけば、少々メモリは消費しますが、サーバのように利用できます。

スポンサーリンク

WSL2の自動終了

WSLのLinuxは立ち上げても何もしていないと勝手に終了してしまいます。

どうも、WSL2の設定ファイル「.wslconfig」には「vmIdleTimeout」という設定項目があります。

WSL での詳細設定の構成
Linux 用 Windows サブシステム で複数の Linux ディストリビューションを実行するときに設定を構成するために使用される wsl.conf ファイルと .wslconfig ファイルのガイド。

公式サイトでは

VM がアイドル状態になってからシャットダウンされるまでのミリ秒数。 Windows 11 でのみ使用できます。

と説明されています。

デフォルト値は「60000」となので、アイドル状態が60秒つづくと自動的に終了することになります。

この値を変えて試してみたのですが、自動終了する時間は変わらない気がします。

もしかしたら将来的に有効になる設定なのかもしれません。

WSL2のLinuxをサーバのように動かしておきたい場合は、この自動終了は避けなければ行けません。

問題は「アイドル状態」というのは何を指しているのか、よくわからないことです。

いろいろ試したところ

  1. WSLのLinuxのシェルが起動している(Windows Terminalなどでシェルを起動している)
    → 自動的に終了しない (アイドル状態ではない)
  2. wslコマンドで適当なLinuxコマンド(lsやecho等のコマンド)を実行する
    → 自動的に終了する (アイドル状態)
  3. wsl.confファイルでSSHサーバ等を起動する状態にして、wslコマンドで適当なLinuxコマンドを実行する
    → 自動的に終了する (アイドル状態)

という挙動でした。

三番目のwsl.confファイルでSSHサーバを起動するというのは下記で紹介した内容のものです。

UbuntuをWindows11上で動かす その11: wsl.confによる設定
今回はwsl.confというファイルを使って、WSL2の起動時にネットワークドライブの自動マウントと、sshサーバ・xrdpに自動起動を設定します。WSL2ではsystemdが動いていないため起動時の自動起動は面倒かと思ったのですが、この設定フィアルで簡単に行うことができました。WSL2で動かしておきたいサービスがある方は活用して見てください。

これは誤算でした。SSHサーバ等が起動していればアイドル状態ではないと思ったのですが、そうではないようです。

そこでさらに調べてみたところ

  • wslコマンドでデーモン(サービス)を起動すると、自動的に終了しない

ということがわかりました。

従って、Windowsの起動時に、wslコマンドで何らかのデーモン(例えばSSHサーバ)を起動するようにすれば、バックグラウンドでWSLのLinuxを起動し続けることができ、サーバのように利用できることになります。

スポンサーリンク

WSL2の自動起動の設定

WSL2が自動的に終了する条件がなんとなくわかったところで、WSL2のLinuxを自動起動させる設定をしていきます。

やることは

  1. WSL2を起動するためのバッチファイルの作成
  2. 作成スクリプトファイルを自動実行する設定

の二つです。

バッチファイルの作成

下記のような内容のファイルを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」に接続するための設定です。

UbuntuをWindows11上で動かす その12: 外部から接続する
今回はWindows Subsystem for Linux (WSL2)で導入したUbuntuに、外部のPCから接続する方法を紹介します。WSL1の頃は簡単にできたのですが、WSL2になってからネットワークの構成が変更になっているため、少々設定が複雑になっています。

ここでは、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で使ってみたいと思います。

コメント

タイトルとURLをコピーしました