WSL 開機啟動並持續運行 (透過背景運行SSH)

以下主要解決 WSL(2) 在 windows 10 環境下, 無法開機啟動 以及 持續運行 的狀況 (windows 11也適用).

主要設定步驟:

* 安裝 SSH 並開啟 Systemd
* 內網連線與防火牆轉發: 任何與內網服務相關的, 都需要做
* WSL2開機啟動/持續背景運行 (Win10)
  - sleep infinity: 持續運行核心動作

---

以下內容範例設定: 需變更為你電腦的內容
* <WIN_BAT_PATH>: 開機時需要執行的 .bat 檔案; 如: E:\WSL\ubuntu\scripts\update_wsl_ports_by_admin.bat
* <WIN_IP>: windows IP

## WSL Ubuntu 內部的 SSH 與 Systemd 設定

### 1. 安裝 SSH 並開啟 Systemd

* 進入 Ubuntu 後,執行以下指令:

```bash
# 更新並安裝
sudo apt update && sudo apt install openssh-server -y
# 編輯 wsl.conf 以開啟 systemd (WSL2 必備)
sudo nano /etc/wsl.conf
```

* 在檔案 `/etc/wsl.conf` 中貼入以下內容:

```yaml
[boot]
systemd=true

[user]
default=cyadmin
```

### 2. 設定 SSH 參數

* 編輯 SSH 設定檔:

```bash
sudo nano /etc/ssh/sshd_config
```

* 搜尋以下key, 確認或修改以下資訊(**Port 2222** 較能避開 Windows 衝突):

```text
Port 2222
ListenAddress 0.0.0.0
PasswordAuthentication yes
```

### 3. 封印 Socket 衝突並重啟服務

Ubuntu 24.04 預設使用 Socket 觸發,這在 WSL 會導致失敗,必須改回傳統模式:

```bash
# 停用並遮蓋 Socket
sudo systemctl disable --now ssh.socket
sudo systemctl mask ssh.socket

# 啟用並啟動服務
sudo systemctl enable ssh
sudo systemctl restart ssh
```

---

## 內網連線與防火牆轉發

這是讓其他電腦能透過你的 Windows IP (<WIN_IP>) 連進 WSL 的關鍵。

### 1. 開啟防火牆 (PowerShell 管理員權限) - 執行一次就好!

```bat
New-NetFirewallRule -DisplayName "WSL SSH Port 2222" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 2222
```

### 2. 建立自動更新 [wsl to windows] Port Forwarding 的批次檔(解決 WSL IP 會變動的問題)

在 Windows 建立 (如 <WIN_BAT_PATH>)

```bat
@echo off
echo ========================================
echo WSL SSH Port Forwarding Updater
echo ========================================

:: 取得 WSL 的 IP(只取第一個)
for /f "tokens=1" %%i in ('wsl hostname -I') do (
    set WSL_IP=%%i
)

if "%WSL_IP%"=="" (
    echo Unable to obtain *WSL* IP. Please check if *WSL* is functioning correctly.
    exit /b 1
)

echo Found WSL IP: %WSL_IP%
echo ====== 處理 ssh 2222
:: 刪除舊的 portproxy(忽略錯誤)-> 新增 port forwarding(監聽 Windows 所有介面,轉發到 WSL)
netsh interface portproxy delete v4tov4 listenport=2222 >nul 2>&1

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=%WSL_IP% connectport=2222

if %errorlevel% equ 0 (
    echo V Port forwarding: Done! Internal network connection is available: Windows_IP:2222
) else (
    echo X Port forwarding: Failed. Please run this bat file as a system administrator.
)

echo.
echo Current settings:
netsh interface portproxy show v4tov4 | findstr 2222
echo.
```

### 3. 新增 `.wslconfig`

* 請在 PowerShell 執行:

```bat
notepad $env:USERPROFILE\.wslconfig
```

* `.wslconfig` 內容:

```yaml
[wsl2]
# Win10 不支援 mirrored 及 autoMemoryReclaim
localhostForwarding=true
```

**儲存時請注意:** 在記事本點「檔案」>「另存新檔」,右下角的 **編碼 (Encoding)** 請務必選擇 **UTF-8**(不要選帶 BOM 的)。

---

## WSL2開機啟動/持續背景運行(Win10)

### 在 WSL 內啟用 systemd

* 開啟你的 Ubuntu(直接輸入 `wsl` 或點 Ubuntu 捷徑)。

* 執行以下指令建立/編輯設定檔:

```bash
sudo nano /etc/wsl.conf
```

* `/etc/wsl.conf` 在檔案最下方加入以下內容(如果檔案是空的就直接貼上):

```yaml
[boot]
systemd=true
```

* 按 `Ctrl + O` → Enter 儲存,再 `Ctrl + X` 離開。

* 回到 Windows PowerShell,執行:

```bat
wsl --shutdown
```

* 重新開啟 Ubuntu, 並在 ubuntu 中 執行以下命令來確認 systemd 已啟動:

```bash
systemctl status
```

### 設定 Windows 開機自動啟動 WSL(最核心)

* 按 `Win + R`,輸入 `taskschd.msc` 開啟 **工作排程器**。

* 點擊右側 **「建立工作」**(不是基本工作)。

* **一般** 標籤:

  - 名稱:`WSL2 Auto Start Ubuntu`

  - 勾選「不管使用者是否登入都要執行」(Run whether user is logged on or not)

  - 勾選「以最高權限執行」(Run with highest privileges)

  - 設定對象:Windows 10。

* **觸發程序** 分頁:

  - 新增 -> 開始工作:**「啟動時」**。

* **觸發器** 分頁:

  - 新增 → 選擇「在啟動時」(At startup)→ 確定。

  - 建議:勾選「延遲的工作時間」→ 30 秒,避免開機太早衝突

* **動作** 分頁:

  - 新增 → 程式或指令碼:`<WIN_BAT_PATH>`; 

  - 新增 → 程式或指令碼:`C:\Windows\System32\wsl.exe`;新增引數:`-d Ubuntu-24.04 -u root sleep infinity`

  (`Ubuntu-24.04` 是你的 ubuntu 機器名稱, 可在 powershell 執行 `wsl -l` 查看正確名稱)

* **條件** 分頁:

  - **取消勾選** 「只有在電腦使用 AC 電源時才啟動」(避免筆電問題)

* **設定** 分頁:

  - 勾選「允許依需求執行工作」

  - 勾選「如果工作失敗,每隔以下時間重新啟動」 → 1分鐘→ 次數 3 次

  - 取消勾選「如果工作執行時間大於以下值即停止」

* 點擊「確定」→ 輸入 Windows 帳號密碼(如果有要求)。

### 徹底重啟與驗證

* 在 PowerShell 執行 `wsl --shutdown` 關閉所有實例。

* 重新開機 或是 執行排程

* 輸入 `wsl -l -v`,確認狀態為 **Running**。

### 如何連線?

* **本機連線**:`ssh cyadmin@127.0.0.1 -p 2222`

* **內網連線**:`ssh cyadmin@<WIN_IP> -p 2222`

留言

這個網誌中的熱門文章

出國旅遊 基本配備一: 轉接頭+變壓器 (避免燒掉 吹風機/電棒)

出國旅遊 基本配備四: 壓縮袋 (避免 「空間不足」)

出國旅遊 基本配備二: 延長線 (避免 「搶插座」)