Conexión de dispositivos host USB a WSL o Hyper-V VM
Puede usar el proyecto usbipd-win de código abierto para acceder a los dispositivos USB físicos de una computadora desde el subsistema de Windows para Linux (WSL2) o la máquina virtual Hyper-V. Esta herramienta le permite pasar un dispositivo USB externo conectado al host de Windows a cualquier distribución de Linux (ejecutándose como WSL) o a una máquina virtual. Esto permite realizar cualquier acción con dispositivos USB desde máquinas virtuales o entorno Linux (flashear dispositivos Android, usar ADB y Fastboot, acceder a tarjetas inteligentes, trabajar con hardware Arduino, etc.).
Usbipd-win utiliza el protocolo TCP/IP para reenviar el tráfico del dispositivo USB a través de una interfaz de red virtual entre la VM/WSL y el sistema operativo host de Windows. Primero, mostraremos cómo instalar el servidor usbipd-win en un host de Windows, luego instalaremos un cliente USB/IP en Linux (WSL) y conectaremos un dispositivo USB compartido a la VM de Linux (WSL).
Usbipd-win es compatible con Windows 8.1 x64 y Windows Server 2012 R2 (y versiones posteriores) y permite compartir dispositivos USB locales en Windows con otras máquinas virtuales (incluidos los sistemas operativos invitados WSL2 y Linux en Hyper-V). Anteriormente, en Hyper-V, solo era posible redirigir unidades USB a máquinas virtuales u otros tipos de dispositivos USB a través del modo de sesión mejorado bastante limitado.
El proyecto Usbipd-win está disponible en GitHub (https://github.com/dorssel/usbipd-win). Puede descargarlo e instalarlo manualmente (hay un archivo de instalación MSI disponible), pero es mucho más rápido instalarlo usando el administrador de paquetes Winget incorporado.
winget install --interactive --exact dorssel.usbipd-win
El programa creará un servicio usbipd (USBIP Device Host) separado en Windows:
"C:\Program Files\usbipd-win\usbipd.exe"que escucha en el puerto TCP 3240
Se ha creado una regla adicional en el Firewall de Windows Defender para que usbipd.exe permita el acceso al puerto TCP 3240 desde computadoras en la red local.
Ahora configuremos la compatibilidad con USBIP en el subsistema de Windows para el entorno Linux. Asegúrese de que la versión del kernel en su imagen sea al menos 5.10.60.1 (nuestro ejemplo de demostración usa WSL 2 con una imagen de Ubuntu 22.04 LTS):
$ uname -aAhora necesita instalar las herramientas USB/IP y la base de ID de hardware 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` 20Utilice el siguiente comando en la imagen WSL de Debian:
$ sudo apt-get install usbip hwdata usbutilsInstale herramientas USB/IP en una imagen WSL basada en 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 hwdataAhora abra un símbolo del sistema elevado en la computadora host con Windows y enumere los dispositivos USB:
usbipd wsl list
Como puede ver, ninguno de los dispositivos USB son compartidos (Not shared). Puede compartir el dispositivo USB por su BUSID. En mi ejemplo, me gustaría pasar el dispositivo de almacenamiento masivo USB con BUISID 4-2 a WSL.
usbipd wsl attach --busid 4-2Si está utilizando WSL 1 (no compatible con usbip), obtendrá un error.
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.Si aparece un error:
usbipd: error: WSL kernel is not USBIP capable, actualice el sistema WSL con el siguiente comando:
wsl --update
Verifique que su unidad flash USB esté conectada a WSL:
$ dmesg | tail
$ lsusbSi desea compartir su dispositivo USB con otra computadora que ejecute Linux a través de la red (puede ser una máquina virtual con un invitado de Linux en Hyper-V o cualquier otro hipervisor), primero enumere los dispositivos USB disponibles en un host remoto de Windows:
$ usbip list --remote=192.168.13.21Ahora puede montar el dispositivo USB requerido por su ID:
$ sudo usbip attach -remote=192.168.13.21 --busid=4-2En este ejemplo, se especifica la dirección IP del host de Windows en el que se ejecuta el servidor usbipd-win.
El dispositivo USB compartido ahora debería estar visible para sus herramientas de Linux.
Para deshabilitar el uso compartido de dispositivos USB en Windows:
usbipd wsl detach --busid 4-2Tenga en cuenta que las unidades USB conectadas de esta manera no se reconocen como dispositivos de bloque en WSL. Verifique esto usando el comando lsblk. El hecho es que el kernel WSL no tiene un controlador para unidades USB (para agregarlas, deberá reconstruir el kernel).
Podrá montar el sistema de archivos de las unidades USB compartidas de forma estándar en las distribuciones de Linux.
Por lo tanto, debe usar los siguientes comandos para montar una unidad flash USB externa, un disquete o una tarjeta SD en WSL:
$ sudo mkdir /mnt/f
$ sudo mount -t drvfs f: /mnt/fWSL monta unidades FAT, ExFAT, ReFs o NTFS, así como imágenes VHD.
Por lo tanto, usbipd-win se puede usar para pasar dispositivos USB físicos desde un host físico de Windows a WSL, una máquina virtual o computadoras Linux a través de una red que usa el protocolo USBOverIP.
También puede resultarle útil leer el artículo sobre cómo mover WSL a una unidad diferente.





