はじめに
利用していたVPSがサービスを終了したため、これまで動かしていたアプリ(Rubyベース)をコンテナ化してSynologyの上へ移行しようと考えた。
移行にあたって手元で気軽に触れるDocker環境を用意したく、WSL上にDocker環境を準備していく。
WSL自体触るのが初めてのため、ここに備忘録を残す。
WSLのインストールから起動まで
WSLインストール
管理者権限でPowerShellを開いて、以下コマンドにてインストール(標準はUbuntu)
> wsl --install
WSL2を指定
明示的にWSL2を指定
> wsl --set-default-version 2
インストールできているか確認
> wsl --list --verbose
出力結果がRunningになっていればOK
NAME STATE VERSION
* Ubuntu Running 2
WSL起動
以下でPowerShellのターミナルがUbuntuのシェルに遷移。exitするまではUbuntu上の操作となる
> wsl
Ubuntu on WSLの環境構築
SSHの設定
SSHサーバの起動
PowerShellやコマンドプロンプトのインターフェースは見にくいので、好きなターミナルから操作できるようにSSHを有効化する。
以下、SSHサーバのインストール状況を確認。(自分の環境ではopenssh-serverはすでにインストール済みだった。)
$ sudo apt list | grep openssh-server
openssh-server/noble-updates 1:9.6p1-3ubuntu13.13 amd64
もしインストールされていなければ、以下でインストールから。
$ sudo apt install openssh-server
さて、以下のようにSSHサーバのステータスを確認してみると
$ sudo systemctl status sshd
Unit sshd.service could not be found.
なるほど、sshdがサービス登録されていないようで面倒くさい。
素のUbuntuともパス構造が微妙に違うようなので、とりあえずほかのサービスで動いているものを探す。
$ ps -awe
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 init-systemd(Ub
7 ? 00:00:00 init
53 ? 00:00:00 systemd-journal
112 ? 00:00:00 systemd-udevd
132 ? 00:00:00 systemd-resolve
137 ? 00:00:00 systemd-timesyn
172 ? 00:00:00 cron
173 ? 00:00:00 dbus-daemon
180 ? 00:00:00 systemd-logind
182 ? 00:00:00 wsl-pro-service
184 hvc0 00:00:00 agetty
188 ? 00:00:00 rsyslogd
190 tty1 00:00:00 agetty
200 ? 00:00:00 unattended-upgr
518 pts/1 00:00:00 login
559 ? 00:00:00 systemd
560 ? 00:00:00 (sd-pam)
583 pts/1 00:00:00 bash
687 ? 00:00:00 SessionLeader
688 ? 00:00:00 Relay(693)
693 pts/2 00:00:00 bash
830 ? 00:00:00 polkitd
1200 pts/2 00:00:00 ps
cronが良さそう。
$ sudo systemctl status cron
● cron.service - Regular background program processing daemon
Loaded: loaded (/usr/lib/systemd/system/cron.service; enabled; preset: enabled)
Active: active (running) since Sun 2025-12-28 21:05:24 JST; 1h 13min ago
なるほど。serviceファイルの場所は/usr/lib/systemd/system/ね。
とりあえず、ファイルを作ってステータス確認。リスタートしてみる。
$ sudo touch /usr/lib/systemd/system/sshd.service
$ sudo systemctl status sshd
○ sshd.service
Loaded: masked (Reason: Unit sshd.service is masked.)
Active: inactive (dead)
$ sudo systemctl start sshd
Failed to start sshd.service: Unit sshd.service is masked.
ファイル自体は認識するものの、中身がないのでそりゃ動かないよね。
とりあえずsshdだけでも動かせないかな、ということで。
$ sudo /etc/init.d/ssh restart
これは動く。
この状態で、systemctlからステータスを見てみると
$ sudo systemctl status ssh.service
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/usr/lib/systemd/system/ssh.service; disabled; preset: enabled)
Active: active (running) since Sun 2025-12-28 23:05:14 JST; 1s ago
TriggeredBy: ● ssh.socket
ちゃんと表示される。
systemctlがsshdを認識しているけど、sshd.serviceの中身がないからか、restartすると起動失敗してしまうので、自動起動有効化してみる。
$ sudo systemctl enable ssh.service
Synchronizing state of ssh.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable ssh
Created symlink /etc/systemd/system/sshd.service → /usr/lib/systemd/system/ssh.service.
Created symlink /etc/systemd/system/multi-user.target.wants/ssh.service → /usr/lib/systemd/system/ssh.service.
行ったっぽい。
sshd.serviceの中身を確認してみると
$ cat /usr/lib/systemd/system/ssh.service
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
Alias=sshd.service
できてる。
これ、今後は、このファイルコピペで行けるな。
もちろん、ステータスを確認してみるとssh.service; enabledと有効化されている。
$ sudo systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/usr/lib/systemd/system/ssh.service; enabled; preset: enabled)
Active: active (running) since Sun 2025-12-28 23:11:35 JST; 9min ago
TriggeredBy: ● ssh.socket
SSHサーバのlisten portの変更
Ubuntu 22.10以降、ssh.socketも変更しなければいけないらしい。
こちらが詳しかったので参照。
https://qiita.com/11ppm/items/a17e585e05cc3903f5c9
HostのWindowsからSSH
WSLのIP Addressを確認
$ ip -4 address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 172.21.189.125/20 brd 172.21.191.255 scope global eth0
valid_lft forever preferred_lft forever
eth0のインターフェース当てに適当なターミナルからもアクセスを試してみる。

バッチリ
別の端末からSSH
Host側のWindowsにてポートフォワーディングの設定が必要。
同じく、管理者権限のPowerShellで以下のように設定。
> netsh
netsh> interface portproxy add v4tov4 listenport=20022 listenaddress=0.0.0.0 connectport=20022 connectaddress=172.21.189.125
netsh> interface portproxy show v4tov4
ipv4 をリッスンする: ipv4 に接続する:
Address Port Address Port
--------------- ---------- --------------- ----------
0.0.0.0 20022 172.21.189.125 20022
通常は動作しているとは思うが、もし停止していたら、IP Helperを起動する。(探した記事の中に明確に起動するように指示しているものがあったので一応補足)
> sc start iphlpsvc
Windowsのファイアウォールに穴を空けるのも忘れずに。
同様にwslをミラーモードで動作させるように指示しているものがあるので、一応補足
$ sudo cat ~/.wslconfig
[wsl2]
networkingMode=mirrored
設定後にwslを再起動
> wsl --shutdown
> wsl
HostのWindowsのIP Addressに対して、20022でSSH接続を試す。
バッチリ
おわりに
WSLをインストールした直後は、最小限のものしか入っていないようなので、aptコマンドで適宜いろいろ入れながら環境を整えていく必要がありそう。
SSHで好きなターミナルからアクセスできるようになったことで、かなり操作性が上がったので、ここからはストレスなく目的の操作をしていけば良い。
この後は、必要なものをコンテナ化して揃えていけば、WSL自体は最低限の環境構築でもよいのかもしれない。
