WSL 是一個能在 windows 撰寫 linux 程式並測試的優秀平台,搭配 VsCode 能夠在 Windows 和 Linux 來回切換,然而 WSL 預設是不會將掛載於 Windows 的外部設備直接掛載到 Linux 的內核之中,例如 USB 就需要透過 usbipd-win 這個專案來協助將外部設備掛載到 WSL 之中。
該軟體可以透過 winget 進行安裝
安裝完成後 Windows 系統中將多出一個名為 usbipd 的 service
到此 Windows 作業系統上的操作完成
接下來切換到 WSL 中,以 Ubuntu 作業系統為例
安裝完成後依循下列步驟:
usbipd wsl list
找出你要掛載到 WSL 的 USB budid以下是相關 issue
lsusb
指令應該就能看到被掛載的 USB 裝置當我們結束上述動作後,欣喜的嘗試讀寫 USB 就會發現 permission denied 出現在 terminal 中,但可以用 sudo 讀寫…
於是我們開始檢查使用者是否在 dialout 之中,發現我們已經存在於該群組之中,理論上應該不用 sudo 即可讀寫 tty 設備
最後我們會發現,所有 tty 相關設備的權限都是 600,而且所屬都不是 dialout,只有 root 可以讀寫,似乎是一個 bug QQ
但好在我們可以通過 udev 修復,以下修復請搭配
WSL2 中是沒有 udev 的,需要手動調用 sudo service udev start
,當然可以將其設置為開啟 WSL 時調用,參考 How to enable a service to start with WSL2?
之後用 sudo service udev status
檢測是否開啟
設定 udev 規則在 /etc/udev/rules.d
a. 文件名 <0~99>-<some_name_you_want>.rules
,數字低表優先級高
例如: 10-tty-usb.rules
b. 在文件裡寫入
這樣修改完,/dev 下的 USB/ACM (where libserial open) 和 /dev/bus/usb/xxx (where libusb open) 都會被修改成 group dialout
確認目前使用者在 dialout 裡面
重新開啟 WSL (wsl --shutdown
in powershell),注意-八秒規則
就可以得到 (group from root -> dialout):
usbipd: error: WSL 'usbip' client not correctly installed. See https://github.com/dorssel/usbipd-win/wiki/WSL-support for the latest instructions.
請重開 WSL 之後重開 windows terminal