WSL에서 USB 사용하기 (ft. usbipd)

WSL2에서 USB 장치 직접 연결하기 (feat. usbipd-win)

WSL2는 정말 훌륭한 개발 환경이지만, 하드웨어 개발자나 임베디드 개발자에게는 치명적인 단점이 하나 있었습니다. 바로 USB 장치에 직접 접근할 수 없다는 점입니다. 하지만 마이크로소프트가 공식적으로 지원하는 오픈소스 프로젝트인 usbipd-win을 사용하면 이 문제를 해결할 수 있습니다.

이번 글에서는 Windows에 연결된 USB Serial Converter를 WSL2(Ubuntu)에 연결하여 /dev/ttyUSB0로 인식시키는 과정을 정리해 봅니다.

image-5

1. WSL 커널 버전 확인

USBIP를 사용하기 위해서는 WSL 커널 버전이 5.10.60.1 이상이어야 합니다. WSL 터미널에서 아래 명령어로 버전을 확인합니다.

Bash

$ uname -a
Linux TP-P14s-G4 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

만약 버전이 낮다면, Windows PowerShell(관리자)에서 업데이트를 진행해야 합니다. wsl --update

2. WSL(Linux) 측 필수 패키지 설치

WSL Ubuntu 내부에서 USB 하드웨어 식별자와 USBIP 도구를 사용하기 위해 패키지를 설치해야 합니다.

Bash

$ sudo apt install linux-tools-virtual hwdata
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  linux-tools-5.15.0-119 linux-tools-5.15.0-119-generic linux-tools-common
The following NEW packages will be installed:
  hwdata linux-tools-5.15.0-119 linux-tools-5.15.0-119-generic linux-tools-common linux-tools-virtual
...

설치가 완료되면 update-alternatives를 통해 usbip 명령어 경로를 설정해 줍니다.

Bash

$ sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20

3. Windows 측 usbipd-win 설치

이제 Windows 호스트에 드라이버 역할을 할 usbipd-win을 설치합니다. PowerShell을 관리자 권한으로 실행하거나 일반 창에서 winget을 사용합니다.

PowerShell

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

4. USB 장치 확인 및 바인딩 (Windows)

설치가 끝났다면 PowerShell에서 현재 연결된 USB 장치 목록을 확인합니다.

PowerShell

PS> usbipd list
Connected:
BUSID   VID:PID     DEVICE                                                    STATE
2-2     17ef:30b0   ThinkPad USB-C Dock Audio, USB 입력 장치                      Not shared
2-3     17ef:30a9   Billboard Device, Vendor Interface                            Not shared
4-1     0403:6001   USB Serial Converter                                          Not shared
4-3     27c6:6594   Goodix MOC Fingerprint                                        Not shared
...

목록 중에서 내가 WSL로 넘겨줄 장치를 찾습니다. 저는 **4-1 0403:6001 USB Serial Converter**를 연결할 예정입니다. 여기서 **BUSID (4-1)**를 기억해야 합니다.

먼저 해당 장치를 공유 가능하도록 bind 해줍니다. (최초 1회 필요, 관리자 권한 창에서 실행 권장)

PowerShell

PS> usbipd bind --busid 4-1

5. WSL로 장치 연결 (Attach)

바인딩이 되었다면, 이제 WSL에 해당 장치를 붙여줍니다(Attach). 이 명령어는 WSL을 사용할 때마다(장치를 뺐다 낄 때마다) 실행해 주어야 합니다.

PowerShell

PS> usbipd attach --wsl --busid 4-1
usbipd: info: Using WSL distribution 'Ubuntu' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Using IP address 172.27.240.1 to reach the host.

6. WSL에서 인식 확인

이제 WSL 터미널로 돌아와서 장치가 정상적으로 올라왔는지 확인합니다.

USB 장치 목록 확인 (lsusb)

Bash

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

ID 0403:6001 장치가 정상적으로 보입니다.

TTY 장치 확인 시리얼 통신을 위해 /dev/ttyUSB* 장치가 생성되었는지 확인합니다.

Bash

$ ls -al /dev/tty*
...
crw-rw---- 1 root dialout 188, 0 Apr  2 10:00 /dev/ttyUSB0

/dev/ttyUSB0가 생성된 것을 확인할 수 있습니다. 이제 리눅스 환경에서 시리얼 통신 프로그램을 개발하거나 터미널을 열 수 있습니다.

요약

  1. Windows: usbipd-win 설치 (winget install ...)

  2. WSL: 리눅스 툴 설치 (apt install linux-tools-virtual hwdata)

  3. Windows PowerShell:

    • usbipd list (BUSID 확인)

    • usbipd bind --busid <BUSID> (공유 설정)

    • usbipd attach --wsl --busid <BUSID> (WSL로 연결)

  4. WSL: lsusb 또는 ls /dev/ttyUSB* 확인