😸

PC起動時にWSL2の自動起動【ログインすらしたくない場合】

2024/01/27に公開

課題となっていたこと

  • WSLは、PCを起動しただけでは、起動しない
    • PCを起動し、ログイン後、WSLのターミナルを立ち上げて初めて起動する
  • WSLのターミナルを終了させるとWSLも停止となる
  • 電源ONのみでSSHが起動するような、あたかもサーバーのような動作を期待、Windowsへログインすらしたくないので、スタートアップにWSL起動プログラムの登録もしたくない
    (スタートアップだとサインイン時で自動で起動になってしまうため)

やりたいこと

  • 普段使っていないノートPCのWSLを外部からSSH接続させたい
  • SSHサーバはノートPCのWSL2環境を使い、ノートPC起動時にWSLのSSHが自動起動してほしい
  • ノートPCは電源ONだけで、ログインはさせたくない
  • WSLの自動停止を回避したい

WSL上の自動停止について

動かし続けるには ターミナル ウィンドウを開い ておけば良いってことらしい.

https://zenn.dev/quantum/articles/b1de629aca3cf0#wsl上のdocker自動停止について

なるほどです!

パソコン起動時に、WSLウインドウを立ち上げる

WSLの場所

WSLを起動する実行ファイルは以下にありました。

C:\Program Files\WSL\wsl.exe

タスクスケジューラでシステム起動時に設定

  • タスクスケジューラの起動
    • [コントロールパネル]の[システムとセキュリティ]-[管理ツール]をクリックし、[タスクスケジューラ]をダブルクリックする
  • トリガー
    • スタートアップ時
  • 操作
    • プログラムの開始
    • プログラム/スクリプト "C:\Program Files\WSL\wsl.exe"
      タスクスケジューラだと、%userprofile%\AppData\Local\Microsoft\WindowsApps\wsl.exeにはアクセスできなかった
  • 条件
    • 「コンピューターをAC電源で使用している場合のみタスクを開始する」のチェックを外す

SSH Serverのインストール

sudo apt install openssh-server
sudo systemctl enable ssh
sudo service ssh restart
sudo systemctl status ssh

ファイアーウォールの設定

IPアドレスの確認(Win側)

ipconfig

IPアドレスの確認(wsl側)

ifconfig

ポートフォワーディング設定

netsh interface portproxy add v4tov4 listenaddress=<WindowsのIPアドレス> listenport=22 connectaddress=<WSLのIPアドレス> connectport=22

ポートフォワーディング確認

netsh interface portproxy show v4tov4

ファイアウォールの22番ポート開放

New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort 22 -Action Allow -Protocol TCP
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 22 -Action Allow -Protocol TCP

ファイアウォール確認

Get-NetFirewallRule -DisplayName 'WSL 2 Firewall Unlock' | Get-NetFirewallPortFilter | Format-Table

ノートPCの画面を閉じてもスリープさせないようにしておく

スリープ状態に入るとWSLも止まってしまうようです。(多分)

  1. 「コントロールパネル」を開く。
  2. 「電源オプション」をクリックする。
  3. 左側のナビゲーションペインで、「カバーを閉めたときの動作」をクリックする。
  4. 「カバーを閉じたときの動作」を設定する。
    「バッテリ駆動」と「電源に接続」の2つの場合があるので、どちらか、または両方を「何もしない」に設定する。

コンピュータのスリープ状態を変更する

スリープ状態に入るとWSLも止まってしまうようです。(多分)
コントロール パネル→すべてのコントロール パネル項目→電源オプション→プラン設定の編集
私の場合は、電源に接続した場合だけ、スリープ状態を「適用しない」にしました。

ssh接続

念のため、ssh接続する際に、keepaliveをしておく

ssh -o ServerAliveInterval=60 -l username host.example.com

参考にさせていただいたページ

Discussion