Tìm kiếm trang web

Gắn các thiết bị USB chủ vào WSL hoặc Hyper-V VM


Bạn có thể sử dụng dự án usbipd-win mã nguồn mở để truy cập thiết bị USB vật lý của máy tính từ Hệ thống con Windows dành cho Linux (WSL2) hoặc máy ảo Hyper-V. Công cụ này cho phép bạn chuyển thiết bị USB bên ngoài được kết nối với máy chủ Windows tới bất kỳ bản phân phối Linux nào (chạy dưới dạng WSL) hoặc tới một máy ảo. Điều này cho phép thực hiện bất kỳ hành động nào với thiết bị USB từ máy ảo hoặc môi trường Linux (thiết bị Android flash, sử dụng ADB và Fastboot, truy cập thẻ thông minh, làm việc với phần cứng Arduino, v.v.).

Usbipd-win sử dụng giao thức TCP/IP để chuyển tiếp lưu lượng thiết bị USB qua giao diện mạng ảo giữa VM/WSL và hệ điều hành Windows máy chủ. Trước tiên, chúng tôi sẽ trình bày cách cài đặt máy chủ usbipd-win trên máy chủ Windows, sau đó chúng tôi sẽ cài đặt ứng dụng khách USB/IP trên Linux (WSL) và gắn thiết bị USB dùng chung vào máy ảo Linux (WSL).

Usbipd-win hỗ trợ Windows 8.1 x64 và Windows Server 2012 R2 (và mới hơn) và cho phép chia sẻ các thiết bị USB cục bộ trên Windows với các máy ảo khác (bao gồm cả hệ điều hành khách WSL2 và Linux trên Hyper-V). Trước đây trên Hyper-V, chỉ có thể chuyển hướng ổ USB sang máy ảo hoặc các loại thiết bị USB khác thông qua Chế độ phiên nâng cao khá hạn chế.

Dự án Usbipd-win hiện có trên GitHub (https://github.com/dorssel/usbipd-win). Bạn có thể tải xuống và cài đặt thủ công (có sẵn tệp cài đặt MSI), nhưng cài đặt bằng trình quản lý gói Winget tích hợp sẽ nhanh hơn nhiều.

winget install --interactive --exact dorssel.usbipd-win

Chương trình sẽ tạo một dịch vụ usbipd (USBIP Device Host) riêng biệt trên Windows:

"C:\Program Files\usbipd-win\usbipd.exe"

nghe trên cổng TCP 3240

Một quy tắc bổ sung đã được tạo trong Tường lửa của Bộ bảo vệ Windows cho usbipd.exe để cho phép truy cập vào cổng TCP 3240 từ các máy tính trên mạng cục bộ.

Bây giờ, hãy định cấu hình hỗ trợ USBIP trong Hệ thống con Windows cho môi trường Linux. Đảm bảo rằng phiên bản kernel trong hình ảnh của bạn ít nhất là 5.10.60.1 (ví dụ demo của chúng tôi sử dụng WSL 2 với hình ảnh Ubuntu 22.04 LTS):

$ uname -a

Bây giờ bạn cần cài đặt các công cụ USB/IP và cơ sở ID phần cứng USB.

$ 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

Sử dụng lệnh sau trong hình ảnh Debian WSL:

$ sudo apt-get install usbip hwdata usbutils

Cài đặt các công cụ USB/IP trong hình ảnh WSL dựa trên rpm (CentOS/Oracle Linux):

$ sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
$ sudo rpm -ivh http://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

Bây giờ hãy mở một dấu nhắc lệnh nâng cao trên máy tính Windows chủ và liệt kê các thiết bị USB:

usbipd wsl list

Như bạn có thể thấy, không có thiết bị USB nào được chia sẻ (Không được chia sẻ). Bạn có thể chia sẻ thiết bị USB bằng BUSID của nó. Trong ví dụ của tôi, tôi muốn chuyển Thiết bị lưu trữ dung lượng lớn USB có BUISID 4-2 vào WSL.

usbipd wsl attach --busid 4-2

  • Nếu bạn đang sử dụng WSL 1 (không được hỗ trợ bởi usbip), bạn sẽ gặp lỗi.

    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.
  • Nếu một lỗi xuất hiện:

    usbipd: error: WSL kernel is not USBIP capable

    , cập nhật hệ thống WSL bằng lệnh sau:

    wsl --update

Kiểm tra xem ổ flash USB của bạn có được kết nối với WSL không:

$ dmesg | tail
$ lsusb

Nếu bạn muốn chia sẻ thiết bị USB của mình với một máy tính khác chạy Linux qua mạng (đó có thể là máy ảo có máy khách Linux trên Hyper-V hoặc bất kỳ trình ảo hóa nào khác), trước tiên hãy liệt kê các thiết bị USB khả dụng trên máy chủ Windows từ xa:

$ usbip list --remote=192.168.13.21

Bây giờ bạn có thể gắn thiết bị USB được yêu cầu bằng ID của nó:

$ sudo usbip attach -remote=192.168.13.21 --busid=4-2

Trong ví dụ này, địa chỉ IP của máy chủ Windows mà máy chủ usbipd-win đang chạy được chỉ định.

Giờ đây, thiết bị USB được chia sẻ sẽ hiển thị với các công cụ Linux của bạn.

Để tắt tính năng chia sẻ thiết bị USB trong Windows:

usbipd wsl detach --busid 4-2

Xin lưu ý rằng các ổ USB được kết nối theo cách này không được nhận dạng là thiết bị khối trong WSL. Kiểm tra điều này bằng cách sử dụng lệnh lsblk. Thực tế là nhân WSL không có trình điều khiển cho ổ USB (để thêm chúng, bạn sẽ phải xây dựng lại nhân).

Bạn sẽ có thể gắn hệ thống tệp của các ổ USB được chia sẻ theo cách tiêu chuẩn trên các bản phân phối Linux.

Do đó, bạn phải sử dụng các lệnh sau để gắn ổ flash USB ngoài, đĩa mềm hoặc thẻ SD trong WSL:

$ sudo mkdir /mnt/f
$ sudo mount -t drvfs f: /mnt/f

WSL gắn ổ đĩa FAT, ExFAT, ReFs hoặc NTFS, cũng như hình ảnh VHD.

Do đó, usbipd-win có thể được sử dụng để truyền các thiết bị USB vật lý từ máy chủ Windows vật lý sang WSL, máy ảo hoặc máy tính Linux qua mạng bằng giao thức USBOverIP.

Bạn cũng có thể thấy hữu ích khi đọc bài viết về cách di chuyển WSL sang một ổ đĩa khác.

Bài viết liên quan