はじめに
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
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?
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ディストリビューションがインストール済みであることを確認します。
C:\>wsl --list
Windows Subsystem for Linux Distributions:
Ubuntu (Default)
WSL2のデフォルトのディストリビューションがUbuntuとなっていることを確認したのち、下記コマンドを実行してUbuntuインスタンスへログインします。
なお、以降はWSL2(Ubuntu)上でのプロンプトは、 $
のみの表記とします。
C:\>wsl
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パッケージをインストールします。
$ sudo apt install ssh -y
# ※出力省略
sshd用設定ファイルを準備する
鍵ペアではなくユーザ名・パスワードでログインできるように、またSSH用のポートを任意のものに設定します。
- Port 10022
- PasswordAuthentication yes
sshdの設定ファイルを変更する必要がありますが、オリジナルの設定ファイルである /etc/ssh/sshd_config
には手を加えず、/etc/ssh/sshd_config.d/sshd_ubuntu.conf
というファイルを作成し、必要な設定を加えていきます。
$ sudo vi /etc/ssh/sshd_config.d/sshd_ubuntu.conf
# 以下の2行を追加
Port 10022
PasswordAuthentication yes
上記ファイル作成完了後、sshdを再起動させます。
$ sudo systemctl restart ssh
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
という指定があることを確認します。
$ cat /etc/wsl.conf
# 以下2行が存在することを確認する。
[boot]
systemd=true
動作確認
Ubuntuインスタンスを再起動させ、sshdが自動起動しているか確認する
Ubuntuインスタンスを一旦停止させ、起動後にsshdも自動起動するか確認します。
まず管理者権限でコマンドプロンプトかPowerShellを起動して以下のように実行し、WSL2上で稼働しているインスタンスを停止させます。
(なおこの操作は、すべてのインスタンスが対象になります。特定のインスタンスのみを指定することはできないようです。)
C:\>wsl --shutdown
改めてWSL2(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
A step by step tutorial on how to automatically start ssh server on boot on the Windows Subsystem for Linux · GitHub