【WSL2】WSL2のUbuntuでsshdの自動起動を有効にする【Ubuntu】

# はじめに
WSL2(Windows Subsystem for Linux 2)でUbuntuなどのLinuxディストリビューションを利用する場合、常にSSH経由でログインしたいといったケースがあります。
ググってみると、古い時代／新しい情報が錯綜しており、また全体的に混沌としていたので、対応方法を整理しました。

Windowsホスト側でバッチファイルを用意し、スタートアッププログラムとして実行させるといったような対応が見つかりますが、今はもう不要です。

# TL;DR
セットアップ作業として、WSL2(Ubuntu)内で以下を実施するだけで、WSL2(Ubuntu)起動時にsshdが自動で起動されるようになります。

- aptでsshパッケージをインストールする
- sshd用設定ファイルを準備する
- `/etc/wsl.conf` ファイルでsystemdが有効になっていることを確認する

本稿では、sshdは以下のように設定します。

- /etc/ssh/sshd_config
    - Port 10022
    - PasswordAuthentication yes

# 動機（WSL2(Ubuntu)に常にSSH接続したい理由）
WSLはコマンドプロンプトやPowerShell、Windows Termina経由で利用できますが、それらのツールはログを自動的に取得開始するといった機能がありません。

Tera TermやPuTTYなどのSSHクライアントは、ホストへの接続時に自動的にターミナルログを取得出来る機能があり、これを利用したいのが目的です。

# 実現の仕組み
以下の2つの要素を組み合わせて実現しています。

- WSL2側の設定として、稼働するLinuxインスタンス内でのsystemdをサポートするよう設定する。
- Ubuntu内でsystemdを利用し、sshdを自動起動させる。

前者の仕組みについては、以下公式ドキュメントに記載があります。
以前はデフォルトで有効化されていなかったようなのですが、本稿の検証で試行した際にはデフォルトで有効化されていました。

[Advanced settings configuration in WSL > systemd support](https://learn.microsoft.com/en-us/windows/wsl/wsl-config#systemd-support)

```
Many Linux distributions run "systemd" by default (including Ubuntu) and WSL has recently added support for this system/service manager so that WSL is even more similar to using your favorite Linux distributions on a bare metal machine. You will need version 0.67.6+ of WSL to enable systemd. 
```

なお、WSL2の起動・実行に関する設定は、WSL2全体の設定を指定するものである `.wslconfig` と、 各Linuxインスタンス内でのふるまいを設定する `wsl.conf` の2種類があります。
今回は `wsl.conf` のみを利用します。またUbuntu内のファイルパスは `/etc/wsl.conf` となることに注意してください。

[Advanced settings configuration in WSL > What is the difference between wsl.conf and .wslconfig?](https://learn.microsoft.com/en-us/windows/wsl/wsl-config#what-is-the-difference-between-wslconf-and-wslconfig
)

> You can configure the settings for your installed Linux distributions that will automatically be applied every time you launch WSL in two ways, by using:
> 
> * .wslconfig to configure settings globally across all installed distributions running on WSL 2.
> * wsl.conf to configure settings per-distribution for Linux distros running on WSL 1 or WSL 2.
> 
> Both file types are used for configuring WSL settings, but the location where the file is stored, the scope of the configuration, and the version of WSL running your distribution all impact which file type to choose.

# 環境
- Windowsホスト:
    - OS Version: Microsoft Windows 10 Pro 10.0.19045 Build 19045
- WLS2ゲスト
    - Ubuntu 22.04.2 LTS

# 作業手順
## セットアップ作業
WSL2自体のインストール、およびUbuntuディストリビューションのインストールは完了しているものとします。

### Ubuntuへのログイン
コマンドプロンプトやWindows Terminalなどから、Ubuntuインスタンスに接続します。

まず、Ubuntuディストリビューションがインストール済みであることを確認します。

```:WSL上のディストリビューションの確認
C:\>wsl --list
Windows Subsystem for Linux Distributions:
Ubuntu (Default)
```

WSL2のデフォルトのディストリビューションがUbuntuとなっていることを確認したのち、下記コマンドを実行してUbuntuインスタンスへログインします。
なお、以降はWSL2(Ubuntu)上でのプロンプトは、 `$` のみの表記とします。

```:Ubuntuへのログイン
C:\>wsl
```

```bash:Ubuntへログインできたことの確認
yourname@YOURHOST:/mnt/c/Users/yourname$
yourname@YOURHOST:/mnt/c/Users/yourname$ uname -a
Linux LAB10 5.15.90.1-microsoft-standard-WSL2 #1 SMP Fri Jan 27 02:56:13 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
```

### aptでsshパッケージをインストールする
通常のUbuntuと同様、sshパッケージをインストールします。

```bash:sshdのインストール
$ sudo apt install ssh -y
# ※出力省略
```

### sshd用設定ファイルを準備する
鍵ペアではなくユーザ名・パスワードでログインできるように、またSSH用のポートを任意のものに設定します。

- Port 10022
- PasswordAuthentication yes

sshdの設定ファイルを変更する必要がありますが、オリジナルの設定ファイルである `/etc/ssh/sshd_config` には手を加えず、`/etc/ssh/sshd_config.d/sshd_ubuntu.conf` というファイルを作成し、必要な設定を加えていきます。

```:sshd設定ファイルの変更
$ sudo vi /etc/ssh/sshd_config.d/sshd_ubuntu.conf
# 以下の2行を追加
Port 10022
PasswordAuthentication yes
```

上記ファイル作成完了後、sshdを再起動させます。

```bash:sshd再起動
$ sudo systemctl restart ssh
```

sshdのステータス等を確認します。

```bash:sshdステータス確認
$ systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2023-04-23 11:58:01 JST; 4s ago
       Docs: man:sshd(8)
             man:sshd_config(5)
    Process: 1429 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
   Main PID: 1430 (sshd)
      Tasks: 1 (limit: 19182)
     Memory: 1.7M
        CPU: 10ms
     CGroup: /system.slice/ssh.service
             └─1430 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

Apr 23 11:58:01 YOURHOST systemd[1]: Starting OpenBSD Secure Shell server...
Apr 23 11:58:01 YOURHOST sshd[1430]: Server listening on 0.0.0.0 port 10022.
Apr 23 11:58:01 YOURHOST sshd[1430]: Server listening on :: port 10022.
Apr 23 11:58:01 YOURHOST systemd[1]: Started OpenBSD Secure Shell server.
```


### `/etc/wsl.conf` ファイルを確認
次に `/etc/wsl.conf` を確認し、 `[boot]` セクションに `systemd=true` という指定があることを確認します。

```ini:/etc/wsl.confの確認
$ cat /etc/wsl.conf
# 以下2行が存在することを確認する。
[boot]
systemd=true
```


## 動作確認
### Ubuntuインスタンスを再起動させ、sshdが自動起動しているか確認する
Ubuntuインスタンスを一旦停止させ、起動後にsshdも自動起動するか確認します。

まず管理者権限でコマンドプロンプトかPowerShellを起動して以下のように実行し、WSL2上で稼働しているインスタンスを停止させます。
（なおこの操作は、すべてのインスタンスが対象になります。特定のインスタンスのみを指定することはできないようです。）

```:WSL2の稼働中インスタンスの停止
C:\>wsl --shutdown
```

改めてWSL2(Ubuntu)にログインします。
（このタイミングでUbuntuインスタンスが起動されますので、数秒待たされます。）

```:Ubuntuにログイン
C:\>wsl
```

uptimeコマンドを実行し、再起動した直後であることを確認します。

```:再起動されたことの確認
yourname@YOURHOST:/mnt/c/Users/yourname$
yourname@YOURHOST:/mnt/c/Users/yourname$ uptime
 13:51:31 up 0 min,  1 user,  load average: 0.27, 0.06, 0.02
```

Windowsホスト側からWSL2(Ubuntu)にSSH接続できることを確認します。
`localhost:10022` に対して、自身のユーザ名・パスワードで接続できるようになっているはずです。


# 参考：昔の対応
以前は、本稿で実現した仕組みが存在しない時代があり、みないろいろ工夫してsshdの自動起動を実現していました。
具体的には以下のような対応になります。

- Windowsホスト側で、WSLのインスタンス内で `service ssh start` コマンドを実行させるバッチファイルを作成する
- 当該バッチファイルを、スタートアッププログラムとして登録する／Task Schedulerで定期的に実行する

現在でも以下のような情報が見つかりますが、このような面倒な対応はもう不要です。

[Is there an easy way to have WSL Ubuntu services start automatically on Windows startup? - Ask Ubuntu](https://askubuntu.com/questions/1177273/is-there-an-easy-way-to-have-wsl-ubuntu-services-start-automatically-on-windows)
[A step by step tutorial on how to automatically start ssh server on boot on the Windows Subsystem for Linux · GitHub](https://gist.github.com/dentechy/de2be62b55cfd234681921d5a8b6be11)