USB/IP로 USB 장치 공유하기

USB/IP로 USB 장치 공유하기

USB/IP를 쓰면 네트워크로 USB 장치를 공유하고, Docker 컨테이너 안에서 그 장치에 접근할 수 있어요. 이 페이지는 Docker Desktop을 실행하는 머신에 연결된 USB 장치를 공유하는 방법에 초점을 맞춰요. Docker Desktop for Mac, Linux, 그리고 Hyper-V 백엔드의 Windows에서 사용할 수 있어요.

출처: Share USB devices with USB/IP

본문

참고: Docker Desktop은 많은 일반 USB 장치용 드라이버를 내장하고 있지만, 모든 USB 장치가 이 설정에서 동작한다고 보장할 수는 없어요.

설정 및 사용

USB 장치를 더 추가해서 사용하려면 다음 과정을 반복하면 돼요.

1단계: USB/IP 서버 실행하기

USB/IP를 쓰려면 USB/IP 서버를 실행해야 해요. 이 가이드에서는 jiegec/usbip이 제공하는 구현을 사용해요.

$ git clone https://github.com/jiegec/usbip
$ cd usbip

에뮬레이션된 HID(휴먼 인터페이스 장치) 예제를 실행해요.

$ env RUST_LOG=info cargo run --example hid_keyboard

2단계: Privileged Docker 컨테이너 시작하기

USB 장치를 붙이려면 PID 네임스페이스를 host로 설정한 privileged Docker 컨테이너를 시작해요.

$ docker run --rm -it --privileged --pid=host alpine

--privileged는 컨테이너에 호스트에 대한 완전한 접근을 주고, --pid=host는 호스트의 프로세스 네임스페이스를 공유하게 해줘요.

3단계: PID 1의 마운트 네임스페이스에 들어가기

컨테이너 안에서 init 프로세스의 마운트 네임스페이스에 들어가서 미리 설치된 USB/IP 도구에 접근해요.

$ nsenter -t 1 -m

4단계: USB/IP 도구 사용하기

이제 다른 시스템에서처럼 USB/IP 도구를 사용할 수 있어요.

호스트에서 내보낼 수 있는 USB 장치를 나열하려면:

$ usbip list -r host.docker.internal

예상 출력:

Exportable USB devices
======================
 - host.docker.internal
      0-0-0: unknown vendor : unknown product (0000:0000)
           : /sys/bus/0/0/0
           : (Defined at Interface level) (00/00/00)
           :  0 - unknown class / unknown subclass / unknown protocol (03/00/00)

특정 USB 장치(여기선 에뮬레이션된 키보드)를 붙이려면:

$ usbip attach -r host.docker.internal -d 0-0-0

에뮬레이션된 키보드를 붙인 후 /dev/input 디렉터리에서 장치 노드를 확인해요.

$ ls /dev/input/

더 알아보기