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`
留言
張貼留言