因眾所週知的原因,公司裡面的電腦不能連到外面的網路,導至在 AI 的時代裡慢人一拍。由於網線對接太明顯,就想到了一招用 RS422 對接,這樣可能比較不起眼,就可以連到網路。
由於 Windows11 已經不支援 RS232 直接對接的 ppp 網路,所以直能透過 WSL 來完成,藉著 chatgpt 的幫助,搞了一整天終於可以了,特地把這個流程給記下來,給那些身陷井底的同胞們一點幫助。
主旨
本文說明如何在兩台 Windows 11 主機上,透過 WSL2、usbipd 與 USB-RS422 轉接器,建立 WSL ↔ WSL 的 PPP 連線,並由 PPP Server 進行 NAT 轉送,提供 PPP Client 對外上網能力。並且也解說穩定的 Mass Storage 使用方法。
主要重點如下:
- usbipd (USB passthrough to WSL) 操作流程(含 USB Mass Storage 掛載與安全移除)。
- WSL ↔ WSL 之間的 PPP 設定方式。
- RS422 情境下出現 URB 錯誤之觀察與改善方式。
- 重新編譯 WSL Kernel 並啟用 PPP / USB-Serial / USB Storage / USB/IP 相關選項的步驟。
系統架構與環境
系統架構
- 兩台 Windows 11 主機,各自安裝 WSL2(Ubuntu)。
- 每台主機各接一顆 USB-RS422 或 RS232 介面(Prolific pl2303 類型)。
- 兩顆 USB-RS422 透過 RS422 對接(TX+/TX- ↔ RX+/RX-,共地)。RS232 則透過 NULL Modem 轉接頭對接。
- 使用 usbipd 將實體 USB 裝置轉交給 WSL,使其在 WSL 內以 /dev/ttyUSB0 或 /dev/sdX 形式出現。
- 使用 pppd 在兩個 WSL 間建立 PPP 連線:10.0.0.1(Server) ↔ 10.0.0.2(Client)。
- PPP Server 開啟 IPv4 轉送與 iptables MASQUERADE,供 Client 透過其對外上網。
軟體環境
- Windows 11 + WSL2(Ubuntu)。
- usbipd-win,USB Passthrough 用途。可至 https://github.com/dorssel/usbipd-win 下載,用於與 Kernel USB/IP 互動。
- 自編譯 WSL Kernel(啟用 PPP、USB-Serial、USB Storage、USB/IP 等功能)。
- pppd、iptables、sysctl 等標準 Linux 工具。
重新編譯 WSL Kernel 與必要選項
由於 WSL 內建的 Linux kernel 很多功能都不包含,如 driver, ppp, mass storage 等。使得就算 USB passthrough 給 WSL 了,也無法驅動使用,所以要編 kernel 來開啟這些功能。
取得原始碼與分支切換
先執行 uname -r 以看目前的 kernel 版本為核
接著將 kernel 下載下來
|
1 2 3 |
cd ~ git clone https://github.com/microsoft/WSL2-Linux-Kernel.git cd WSL2-Linux-Kernel |
接著列出可用的 branch 然後再切換過去
再依實際較近的分支,切換過去
|
1 2 |
# 依實際需求選擇分支,例如: git checkout linux-msft-wsl-6.6.y |
安裝編譯依賴套件
|
1 2 3 |
sudo apt update sudo apt install -y build-essential flex bison libssl-dev libelf-dev \ libncurses-dev dwarves |
以現行 WSL Kernel 設定為基礎
將目前 kernel 設定存下來,作為等一下自行編譯 kernel 的基礎
|
1 |
zcat /proc/config.gz > .config |
menuconfig 重要選項
執行
|
1 |
make menuconfig |
建議確認或啟用之項目:
- PPP 支援:CONFIG_PPP、CONFIG_PPP_ASYNC 等。
- USB-Serial / PL2303:CONFIG_USB_SERIAL、CONFIG_USB_SERIAL_PL2303。
- USB Mass Storage:CONFIG_USB_STORAGE。
- USB/IP 與 VHCI:CONFIG_USBIP_CORE、CONFIG_USBIP_VHCI_HCD、CONFIG_USBIP_HOST 及對應 debug 選項
- iptables 相關: CONFIG_NETFILTER, CONFIG_IP_NF_IPTABLES , CONFIG_IP_NF_MANGLE, CONFIG_IP_NF_NAT, CONFIG_IP_NF_TARGET_MASQUERADE
編譯與安裝
|
1 2 |
make -j"$(nproc)" bzImage cp arch/x86/boot/bzImage /mnt/d/ |
由於編譯成 modules 的話,會變成每份 Ubuntu 都要一份,所以需要的東西都要儘量編成 built-in 的
設定 .wslconfig 使用自訂 Kernel
|
1 2 3 |
# 編輯 C:\Users\<帳號>\.wslconfig [wsl2] kernel=D:\\Users\\<帳號>\\wsl_kernel |
|
1 2 3 4 5 6 |
# 套用新 Kernel wsl --shutdown wsl --shutdown copy d:\bzImage d:\wsl_kernel # 重新啟動任何 WSL2 distro 即會使用新 Kernel |
因為如果還有 WSL 啟動中,會無法更新 kernel ,所以要先執行 wsl –shutdown, 多執行幾次,確保真的中斷。如果複製失敗,再多下幾次,最後再用 bzImage 將 wsl_kernel 覆蓋。之後再運行新的 ubuntu, 就會套用新的 kernel。不同的 WSL ubuntu 間,kernel 是共用的,只有檔案系統不同。
這個 kernel 可以直接拿去別台用,設置方法同上。
usbipd 操作與 USB 裝置管理
請先下載並安裝 usbipd-win 後,在開始進行這一步
查詢與 attach / detach
在 Windows cmd 裡 ,使用 usbipd 管理 USB 裝置與 WSL 間的關聯。
查詢目前可用的 USB 裝置:
|
1 |
usbipd list |
將指定 USB 裝置 bind到 usbipd 控管
|
1 2 3 4 |
usbipd bind --busid <BUSID> # 例:2-1 Prolific PL232 usbipd bind --busid 2-1 |
將指定 USB 裝置 attach 至預設 WSL distro,WSL Ubuntu 要至少先執行一次
|
1 2 3 4 |
usbipd attach --wsl --busid <BUSID> # 例: usbipd attach --wsl --busid 2-1 |
將 USB 裝置從 WSL detach 回 Windows
|
1 2 |
usbipd unbind --busid <BUSID> usbipd detach --busid <BUSID> |
一次 detach 所有裝置
|
1 2 |
usbipd unbind --all usbipd detach --all |
在 WSL 內確認裝置狀態
RS422 轉接器
|
1 2 |
dmesg | tail ls -l /dev/ttyUSB* |
USB Mass Storage
|
1 2 |
lsblk dmesg | grep sd |
USB Mass Storage 掛載與安全移除流程
以 /dev/sdb1 為例,在 WSL 內掛載 USB 隨身碟(建議使用 sync 提高資料安全性)
|
1 2 |
sudo mkdir -p /usb sudo mount -o sync /dev/sdb1 /usb/ |
建議檔案複製與卸載流程
|
1 2 3 |
cp bigfile.iso /usb/ sync sudo umount /usb/ |
以上流程可確保資料已完整寫入 USB,降低 CRC Error 與檔案毀損風險。
WSL ↔ WSL PPP over USB-RS422 設定
RS422 基本連線測試
- 實體接線:
– A.TX+ → B.RX+,A.TX- → B.RX-。
– B.TX+ → A.RX+,B.TX- → A.RX-。
– 兩端共地(GND)。
- WSL 內基本測試,驗正 Passthrough / 接線正常。
可以先在其它 2 台windows, 用 teraterm 打開敲一些字,確定資料可正常傳輸,再進 WSL 測試。
兩端先將 port 設定一致
|
1 |
stty -F /dev/ttyUSB0 500:5:1cb2:8a3b:3:1c:7f:15:4:0:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 |
兩端交互用echo / cat 傳訊息
|
1 2 3 4 5 |
# A 端: sudo cat /dev/ttyUSB0 # B 端: echo "HELLO" > /dev/ttyUSB0 |
若僅單向通,可使用 stty -g 複製設定
|
1 2 3 4 5 |
# 匯出良好設定 stty -g -F /dev/ttyUSB0 # 在另一個埠套用 stty -F /dev/ttyUSBy <上述字串> |
PPP Server 端設定(10.0.0.1)
在 Server 端 WSL
|
1 2 3 4 |
sudo pppd /dev/ttyUSB0 115200 \ 10.0.0.1:10.0.0.2 \ noauth local nocrtscts proxyarp persist \ debug nodetach silent & |
關鍵選項說明:
- noauth:暫時關閉認證,便於測試。
- local:忽略 modem 控制訊號(適合 RS422)。
- nocrtscts:關閉硬體 Flow Control(RS422 無 CTS/RTS)。
- proxyarp:由 Server 代理 Client 的 ARP。
- persist:連線中斷時自動重試。
- debug nodetach:於前景輸出詳細 PPP log,便於除錯。
- silent:等候 client 來連線,不主動發啟連線
待測試成功後,可將 nodetach 拿掉,放進背景,以免太吵。
PPP Client 端設定(10.0.0.2)
在 Client 端 WSL
|
1 2 3 4 |
sudo pppd /dev/ttyUSB0 115200 \ 10.0.0.2:10.0.0.1 \ noauth local nocrtscts defaultroute replacedefaultroute \ debug nodetach & |
下面是不一樣client端不一樣的地方,如果想介由令一端上網,需要加上下列選項,改變default route
- defaultroute:建立以 PPP 為預設路由。
- replacedefaultroute:覆寫原有預設路由。
PPP 連線驗證
兩端確認介面與路由
|
1 2 |
ip addr show ppp0 ip route |
預期結果:
- Server:ppp0 inet 10.0.0.1 peer 10.0.0.2。
- Client:ppp0 inet 10.0.0.2 peer 10.0.0.1,且 default dev ppp0。
互 ping 測試
|
1 2 3 4 5 |
# Client 端 ping 10.0.0.1 # Server 端 ping 10.0.0.2 |
PPP Client 透過 Server 上網設定
開啟 IPv4 轉送與NAT
在 PPP Server 端 WSL
|
1 2 3 |
echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
Client 端 DNS 設定
手動指定 /etc/resolv.conf
|
1 |
nameserver 8.8.8.8 |
上網測試
|
1 2 |
ping 8.8.8.8 # 測試 IP 連通性 ping google.com # 測試 DNS 解析 |
RS422 URB Error 問題與 USB/IP Debug
在高頻率、大量小封包的 RS422 通訊情境下,WSL dmesg 可能出現
|
1 2 |
vhci_hcd: unlink->seqnum XX vhci_hcd: urb->status -104 |
其中 -104 對應 ECONNRESET,表示該 URB 在 USB/IP 層被重置或取消,易導致通訊中斷或不穩定。
實務觀察:於 Kernel 中啟用 USB/IP 相關 debug 訊息後,URB -104 錯誤消失,RS422 連線較穩定。
此現象顯示:在 WSL + usbipd + vhci_hcd 的虛擬化架構下,對於「大量小封包」情境,適當開啟 debug 能改善行為,值得在相似專案中沿用。
|
1 2 3 4 5 6 7 8 |
Device Driver [*] USB Support [*] USB Mass Storage Support [*] USB Mass Storage verbose debug [*] USB/IP support [*] VHCI hcd [*] Host driver [*] Debug messages for USB/IP |
實務建議與注意事項
- usbipd 適合作為開發與除錯工具,對高速、大量小封包的串列應用(例如 RS422 PPP)需特別注意穩定性。
- 若需長時間、穩定的串列通訊,可考慮改由
- 原生 Linux 主機或 VM 做 USB pass-through;或
- 於 Windows 完成 PPP,WSL 僅透過 IP 與其互動。
- 由於我原本在Windows使用 ZModem RS422 傳檔就會有 error, SecureCRT 傳大檔最後還會中斷,所以不確定究竟是何原因。
- USB Mass Storage 建議一律採用「cp → sync → umount → usbipd detach → 實體拔除」流程,降低檔案毀損風險
- 本文件所列 PPP / NAT / Kernel 編譯流程已實測可行,可作為後續專案與團隊成員之技術參考依據。





