Windows WSL串接 USB-RS422 與 PPP

因眾所週知的原因,公司裡面的電腦不能連到外面的網路,導至在 AI 的時代裡慢人一拍。由於網線對接太明顯,就想到了一招用 RS422 對接,這樣可能比較不起眼,就可以連到網路。

由於 Windows11 已經不支援 RS232 直接對接的 ppp 網路,所以直能透過 WSL 來完成,藉著 chatgpt 的幫助,搞了一整天終於可以了,特地把這個流程給記下來,給那些身陷井底的同胞們一點幫助。

主旨

本文說明如何在兩台 Windows 11 主機上,透過 WSL2、usbipd 與 USB-RS422 轉接器,建立 WSL ↔ WSL 的 PPP 連線,並由 PPP Server 進行 NAT 轉送,提供 PPP Client 對外上網能力。並且也解說穩定的 Mass Storage 使用方法。

主要重點如下:

  1. usbipd (USB passthrough to WSL) 操作流程(含 USB Mass Storage 掛載與安全移除)。
  2. WSL ↔ WSL 之間的 PPP 設定方式。
  3. RS422 情境下出現 URB 錯誤之觀察與改善方式。
  4. 重新編譯 WSL Kernel 並啟用 PPP / USB-Serial / USB Storage / USB/IP 相關選項的步驟。

 

系統架構與環境

系統架構

  1. 兩台 Windows 11 主機,各自安裝 WSL2(Ubuntu)。
  2. 每台主機各接一顆 USB-RS422 或 RS232 介面(Prolific pl2303 類型)。
  3. 兩顆 USB-RS422 透過 RS422 對接(TX+/TX- ↔ RX+/RX-,共地)。RS232 則透過 NULL Modem 轉接頭對接。
  4. 使用 usbipd 將實體 USB 裝置轉交給 WSL,使其在 WSL 內以 /dev/ttyUSB0 或 /dev/sdX 形式出現。
  5. 使用 pppd 在兩個 WSL 間建立 PPP 連線:10.0.0.1(Server) ↔ 10.0.0.2(Client)。
  6. PPP Server 開啟 IPv4 轉送與 iptables MASQUERADE,供 Client 透過其對外上網。

 

軟體環境

  1. Windows 11 + WSL2(Ubuntu)。
  2. usbipd-win,USB Passthrough 用途。可至 https://github.com/dorssel/usbipd-win 下載,用於與 Kernel USB/IP 互動。
  3. 自編譯 WSL Kernel(啟用 PPP、USB-Serial、USB Storage、USB/IP 等功能)。
  4. pppd、iptables、sysctl 等標準 Linux 工具。

重新編譯 WSL Kernel 與必要選項

由於 WSL 內建的 Linux kernel 很多功能都不包含,如 driver, ppp, mass storage 等。使得就算 USB passthrough 給 WSL 了,也無法驅動使用,所以要編 kernel 來開啟這些功能。

取得原始碼與分支切換

先執行 uname -r 以看目前的 kernel 版本為核

接著將 kernel 下載下來

接著列出可用的 branch 然後再切換過去

再依實際較近的分支,切換過去

安裝編譯依賴套件

以現行 WSL Kernel 設定為基礎

將目前 kernel 設定存下來,作為等一下自行編譯 kernel 的基礎

menuconfig 重要選項

執行

建議確認或啟用之項目:

  1. PPP 支援:CONFIG_PPP、CONFIG_PPP_ASYNC 等。
  2. USB-Serial / PL2303:CONFIG_USB_SERIAL、CONFIG_USB_SERIAL_PL2303。
  3. USB Mass Storage:CONFIG_USB_STORAGE。
  4. USB/IP 與 VHCI:CONFIG_USBIP_CORE、CONFIG_USBIP_VHCI_HCD、CONFIG_USBIP_HOST 及對應 debug 選項
  5. iptables 相關: CONFIG_NETFILTER, CONFIG_IP_NF_IPTABLES , CONFIG_IP_NF_MANGLE, CONFIG_IP_NF_NAT, CONFIG_IP_NF_TARGET_MASQUERADE

編譯與安裝

由於編譯成 modules 的話,會變成每份 Ubuntu 都要一份,所以需要的東西都要儘量編成 built-in 的

設定 .wslconfig 使用自訂 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 裝置:

將指定 USB 裝置 bind到 usbipd 控管

將指定 USB 裝置 attach 至預設 WSL distro,WSL Ubuntu 要至少先執行一次

將 USB 裝置從 WSL detach 回 Windows

一次 detach 所有裝置

在 WSL 內確認裝置狀態

RS422 轉接器

USB Mass Storage

USB Mass Storage 掛載與安全移除流程

以 /dev/sdb1 為例,在 WSL 內掛載 USB 隨身碟(建議使用 sync 提高資料安全性)

建議檔案複製與卸載流程

以上流程可確保資料已完整寫入 USB,降低 CRC Error 與檔案毀損風險。

WSL ↔ WSL PPP over USB-RS422 設定

RS422 基本連線測試

  1. 實體接線:

– A.TX+ → B.RX+,A.TX- → B.RX-。

– B.TX+ → A.RX+,B.TX- → A.RX-。

– 兩端共地(GND)。

  1. WSL 內基本測試,驗正 Passthrough / 接線正常。

可以先在其它 2 台windows, 用 teraterm 打開敲一些字,確定資料可正常傳輸,再進 WSL 測試。

兩端先將 port 設定一致

兩端交互用echo / cat 傳訊息

若僅單向通,可使用 stty -g 複製設定

PPP Server 端設定(10.0.0.1)

在 Server 端 WSL

關鍵選項說明:

  • 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

下面是不一樣client端不一樣的地方,如果想介由令一端上網,需要加上下列選項,改變default route

  • defaultroute:建立以 PPP 為預設路由。
  • replacedefaultroute:覆寫原有預設路由。

PPP 連線驗證

兩端確認介面與路由

預期結果:

  • 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 測試

PPP Client 透過 Server 上網設定

開啟 IPv4 轉送與NAT

在 PPP Server 端 WSL

Client 端 DNS 設定

手動指定 /etc/resolv.conf

上網測試

RS422 URB Error 問題與 USB/IP Debug

在高頻率、大量小封包的 RS422 通訊情境下,WSL dmesg 可能出現

其中 -104 對應 ECONNRESET,表示該 URB 在 USB/IP 層被重置或取消,易導致通訊中斷或不穩定。

實務觀察:於 Kernel 中啟用 USB/IP 相關 debug 訊息後,URB -104 錯誤消失,RS422 連線較穩定。

此現象顯示:在 WSL + usbipd + vhci_hcd 的虛擬化架構下,對於「大量小封包」情境,適當開啟 debug 能改善行為,值得在相似專案中沿用。

實務建議與注意事項

  1. usbipd 適合作為開發與除錯工具,對高速、大量小封包的串列應用(例如 RS422 PPP)需特別注意穩定性。
  2. 若需長時間、穩定的串列通訊,可考慮改由
    1. 原生 Linux 主機或 VM 做 USB pass-through;或
    2. 於 Windows 完成 PPP,WSL 僅透過 IP 與其互動。
    3. 由於我原本在Windows使用 ZModem RS422 傳檔就會有 error, SecureCRT 傳大檔最後還會中斷,所以不確定究竟是何原因。
  3. USB Mass Storage 建議一律採用「cp → sync → umount → usbipd detach → 實體拔除」流程,降低檔案毀損風險
  4. 本文件所列 PPP / NAT / Kernel 編譯流程已實測可行,可作為後續專案與團隊成員之技術參考依據。

附件

我用的 Kernel 設定檔

Leave a Reply(Name請以user_開頭,否則會被判定會垃圾息)

請輸入答案 8 × = 72