การเชื่อมต่ออุปกรณ์โฮสต์ USB กับ WSL หรือ Hyper-V VM
คุณสามารถใช้โครงการ usbipd-win แบบโอเพ่นซอร์สเพื่อเข้าถึงอุปกรณ์ USB จริงของคอมพิวเตอร์จากระบบย่อย Windows สำหรับ Linux (WSL2) หรือเครื่องเสมือน Hyper-V เครื่องมือนี้ช่วยให้คุณส่งผ่านอุปกรณ์ USB ภายนอกที่เชื่อมต่อกับโฮสต์ Windows ไปยังการกระจาย Linux (ทำงานเป็น WSL) หรือไปยังเครื่องเสมือน ซึ่งช่วยให้สามารถดำเนินการใดๆ กับอุปกรณ์ USB จากเครื่องเสมือนหรือสภาพแวดล้อม Linux (การแฟลชอุปกรณ์ Android, การใช้ ADB และ Fastboot, การเข้าถึงสมาร์ทการ์ด, การทำงานกับฮาร์ดแวร์ Arduino เป็นต้น)
Usbipd-win ใช้โปรโตคอล TCP/IP เพื่อส่งต่อการรับส่งข้อมูลอุปกรณ์ USB ผ่านอินเทอร์เฟซเครือข่ายเสมือนระหว่าง VM/WSL และระบบปฏิบัติการ Windows โฮสต์ อันดับแรก เราจะแสดงวิธีการติดตั้งเซิร์ฟเวอร์ usbipd-win บนโฮสต์ Windows จากนั้นเราจะติดตั้งไคลเอนต์ USB/IP บน Linux (WSL) และแนบอุปกรณ์ USB ที่ใช้ร่วมกันกับ Linux VM (WSL)
Usbipd-win รองรับ Windows 8.1 x64 และ Windows Server 2012 R2 (และใหม่กว่า) และอนุญาตให้แชร์อุปกรณ์ USB ในเครื่องบน Windows กับเครื่องเสมือนอื่นๆ (รวมถึง WSL2 และระบบปฏิบัติการแขก Linux บน Hyper-V) ก่อนหน้านี้ Hyper-V สามารถเปลี่ยนเส้นทางไดรฟ์ USB ไปยัง VM หรืออุปกรณ์ USB ประเภทอื่นๆ ผ่านโหมดเซสชันขั้นสูงที่ค่อนข้างจำกัดเท่านั้น
โครงการ Usbipd-win มีอยู่ใน GitHub (https://github.com/dorssel/usbipd-win) คุณสามารถดาวน์โหลดและติดตั้งด้วยตนเอง (มีไฟล์ติดตั้ง MSI) แต่จะติดตั้งได้เร็วกว่ามากโดยใช้ตัวจัดการแพ็คเกจ Winget ในตัว
winget install --interactive --exact dorssel.usbipd-win
โปรแกรมจะสร้างบริการ usbipd (โฮสต์อุปกรณ์ USBIP) แยกต่างหากบน Windows:
"C:\Program Files\usbipd-win\usbipd.exe"ซึ่งฟังบนพอร์ต TCP 3240
มีการสร้างกฎเพิ่มเติมในไฟร์วอลล์ Windows Defender สำหรับ usbipd.exe เพื่ออนุญาตการเข้าถึงพอร์ต TCP 3240 จากคอมพิวเตอร์บนเครือข่ายท้องถิ่น
ตอนนี้มากำหนดค่าการสนับสนุน USBIP ในระบบย่อย Windows สำหรับสภาพแวดล้อม Linux ตรวจสอบให้แน่ใจว่าเวอร์ชันเคอร์เนลในอิมเมจของคุณเป็นอย่างน้อย 5.10.60.1 (ตัวอย่างการสาธิตของเราใช้ WSL 2 กับอิมเมจ Ubuntu 22.04 LTS):
$ uname -aตอนนี้คุณต้องติดตั้งเครื่องมือ USB/IP และฐานรหัสฮาร์ดแวร์ 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ใช้คำสั่งต่อไปนี้ในอิมเมจ Debian WSL:
$ sudo apt-get install usbip hwdata usbutilsติดตั้งเครื่องมือ USB/IP ในอิมเมจ WSL แบบ 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ตอนนี้เปิดพรอมต์คำสั่งบนคอมพิวเตอร์โฮสต์ Windows และแสดงรายการอุปกรณ์ USB:
usbipd wsl list
อย่างที่คุณเห็น ไม่มีอุปกรณ์ USB ใดที่แชร์ (ไม่แชร์) คุณสามารถแบ่งปันอุปกรณ์ USB ด้วย BUSID ในตัวอย่างของฉัน ฉันต้องการส่งผ่าน USB Mass Storage Device ที่มี 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หากคุณต้องการแชร์อุปกรณ์ USB ของคุณกับคอมพิวเตอร์เครื่องอื่นที่ใช้ Linux ผ่านเครือข่าย (อาจเป็นเครื่องเสมือนกับแขก Linux บน Hyper-V หรือไฮเปอร์ไวเซอร์อื่นๆ) อันดับแรกให้ระบุอุปกรณ์ USB ที่มีอยู่บนโฮสต์ Windows ระยะไกล:
$ usbip list --remote=192.168.13.21ตอนนี้คุณสามารถเมานต์อุปกรณ์ USB ที่ต้องการได้ด้วย ID ของมัน:
$ sudo usbip attach -remote=192.168.13.21 --busid=4-2ในตัวอย่างนี้ มีการระบุที่อยู่ IP ของโฮสต์ Windows ที่เซิร์ฟเวอร์ usbipd-win ทำงานอยู่
เครื่องมือ Linux ของคุณควรจะมองเห็นอุปกรณ์ USB ที่ใช้ร่วมกัน
หากต้องการปิดใช้งานการแชร์อุปกรณ์ USB ใน Windows:
usbipd wsl detach --busid 4-2โปรดทราบว่าไดรฟ์ USB ที่เชื่อมต่อด้วยวิธีนี้ไม่ได้รับการยอมรับว่าเป็นอุปกรณ์บล็อกใน WSL ตรวจสอบโดยใช้คำสั่ง lsblk ความจริงก็คือเคอร์เนล WSL ไม่มีไดรเวอร์สำหรับไดรฟ์ USB (หากต้องการเพิ่มคุณจะต้องสร้างเคอร์เนลใหม่)
คุณจะสามารถติดตั้งระบบไฟล์ของไดรฟ์ USB ที่ใช้ร่วมกันได้ด้วยวิธีมาตรฐานบน Linux distros
ดังนั้น คุณต้องใช้คำสั่งต่อไปนี้เพื่อต่อเชื่อมแฟลชไดรฟ์ USB ภายนอก ฟล็อปปี้ดิสก์ หรือการ์ด SD ใน WSL:
$ sudo mkdir /mnt/f
$ sudo mount -t drvfs f: /mnt/fWSL ติดตั้งไดรฟ์ FAT, ExFAT, ReFs หรือ NTFS รวมถึงภาพ VHD
ดังนั้นจึงสามารถใช้ usbipd-win เพื่อส่งผ่านอุปกรณ์ USB จริงจากโฮสต์ Windows จริงไปยัง WSL, เครื่องเสมือนหรือคอมพิวเตอร์ Linux ผ่านเครือข่ายโดยใช้โปรโตคอล USBOverIP
นอกจากนี้ คุณยังอาจพบว่าการอ่านบทความเกี่ยวกับวิธีย้าย WSL ไปยังไดรฟ์อื่นอาจมีประโยชน์





