將主機 USB 設備連接到 WSL 或 Hyper-V VM
您可以使用開源的usbipd-win項目從 Windows Linux 子系統 (WSL2) 或 Hyper-V 虛擬機訪問計算機的物理 USB 設備。此工具允許您將連接到 Windows 主機的外部 USB 設備傳遞到任何 Linux 發行版(作為 WSL 運行)或虛擬機。這允許從虛擬機或 Linux 環境中使用 USB 設備執行任何操作(刷新 Android 設備、使用 ADB 和 Fastboot、訪問智能卡、使用 Arduino 硬件等)。
Usbipd-win 使用 TCP/IP 協議通過 VM/WSL 和主機 Windows 操作系統之間的虛擬網絡接口轉發 USB 設備流量。首先,我們將展示如何在 Windows 主機上安裝 usbipd-win 服務器,然後我們將在 Linux (WSL) 上安裝 USB/IP 客戶端並將共享 USB 設備連接到 Linux VM (WSL)。
Usbipd-win 支持 Windows 8.1 x64 和 Windows Server 2012 R2(及更高版本),並允許與其他虛擬機(包括 Hyper-V 上的 WSL2 和 Linux 來賓操作系統)共享 Windows 上的本地 USB 設備。以前在 Hyper-V 上,只能通過相當有限的增強會話模式將 USB 驅動器重定向到 VM 或其他 USB 設備類型。
Usbipd-win 項目可在 GitHub 上獲取(https://github.com/dorssel/usbipd-win)。您可以手動下載並安裝它(有 MSI 安裝文件可用),但使用內置 Winget 包管理器安裝要快得多。
另請閱讀:如何修復 Windows 中的“目標主機無法訪問”Ping 錯誤
winget install --interactive --exact dorssel.usbipd-win

該程序將創建一個單獨的usbipd(USBIP 設備主機)Windows 上的服務:"C:Program Filesusbipd-winusbipd.exe"它監聽 TCP 端口 3240


Windows Defender 防火牆中已為 usbipd.exe 創建了一條附加規則,以允許本地網絡上的計算機訪問 TCP 端口 3240。
現在讓我們在 Linux 環境的 Windows 子系統中配置 USBIP 支持。確保映像中的內核版本至少為 5.10.60.1(我們的演示示例使用 WSL 2 和 Ubuntu 22.04 LTS 映像):
$ uname -a
現在您需要安裝USB/IP工具和USB硬件ID庫。
$ sudo apt install linux-tools-virtual hwdata
$ sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20


在 Debian WSL 映像中使用以下命令:
$ sudo apt-get install usbip hwdata usbutils
在基於 rpm 的 WSL 映像中安裝 USB/IP 工具 (CentOS/Oracle Linux):
$ sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
$ sudo rpm -ivh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
$ sudo yum install kmod-usbip
$ sudo yum install usbip-utils
$ sudo yum install hwdata
現在在 Windows 主機上打開提升的命令提示符並列出 USB 設備:
usbipd wsl list
如您所見,所有 USB 設備均未共享(Not Shared)。您可以通過 USB 設備的 BUSID 來共享該 USB 設備。在我的示例中,我想通過USB 大容量存儲設備將 BUISID 4-2 寫入 WSL。
usbipd wsl attach --busid 4-2


- 如果您使用 WSL 1(usbip 不支持),您將收到錯誤消息。
sbipd: error: The specified WSL distribution is using WSL 1, but WSL 2 is required. Learn how to upgrade at https://docs.microsoft.com/windows/wsl/basic-commands#set-wsl-version-to-1-or-2.
- 如果出現錯誤:
usbipd: error: WSL kernel is not USBIP capable,使用以下命令更新 WSL 系統:
wsl --update
檢查您的 USB 閃存驅動器是否已連接到 WSL:
$ dmesg | tail
$ lsusb


如果您想通過網絡與另一台運行 Linux 的計算機共享您的 USB 設備(它可以是 Hyper-V 或任何其他虛擬機管理程序上具有 Linux 來賓的虛擬機),請首先列出遠程 Windows 主機上的可用 USB 設備:
$ usbip list --remote=192.168.13.21
您現在可以通過 ID 掛載所需的 USB 設備:
$ sudo usbip attach -remote=192.168.13.21 --busid=4-2
在此示例中,指定了運行 usbipd-win 服務器的 Windows 主機的 IP 地址。
現在,您的 Linux 工具應該可以看到共享 USB 設備。
要在 Windows 中禁用 USB 設備共享:
usbipd wsl detach --busid 4-2
請注意,以這種方式連接的 USB 驅動器在 WSL 中不會被識別為塊設備。使用以下命令檢查這一點LSBLK命令。事實上,WSL 內核沒有 USB 驅動器的驅動程序(要添加它們,您必須重建內核)。
您將能夠在 Linux 發行版上以標準方式掛載共享 USB 驅動器的文件系統。
因此,您必須使用以下命令在 WSL 中掛載外部 USB 閃存驅動器、軟盤或 SD 卡:
$ sudo mkdir /mnt/f
$ sudo mount -t drvfs f: /mnt/f


WSL 掛載 FAT、ExFAT、Refs 或 NTFS 驅動器以及 VHD 映像。
因此,usbipd-win 可用於使用 USBOverIP 協議通過網絡將物理 USB 設備從物理 Windows 主機傳遞到 WSL、虛擬機或 Linux 計算機。
您可能還會發現閱讀有關如何將 WSL 移動到其他驅動器的文章很有用。
