USB 연결을 중계하기 위해 윈도우 10 호스트와 우분투2004 @ WSL2에 USBIP 서버-호스트 구축 방법
WSL2에 USB 지원 추가하기
이 기록의 방법은 WSL2 + 우분투 20.04와 윈도우 10 빌드 2004 환경에서 실시했습니다. WSL2의 리눅스 커널은 윈도우 10 호스트 위에서 USB 장치 연결을 지원하지 않습니다. (저장소로 마운트되는 경우 제외) 이런 경우 USBIP를 통해 호스트의 USB 연결을 TCP/IP를 통해 WSL로 중계하는 방법을 사용합니다.
WSL1을 WSL2로 변환
USBIP 설치
윈도우에 USBIP 서버 구성
usbip-win 릴리즈 페이지에서 0.1.0 버전의 Asset 중 usb.ids
, usbip.exe
, usbipd.exe
, usbip_stub.sys
, usbip_stub.inx
총 5개의 파일들을 다운로드합니다. 그리고 터미널로 접근이 용이한 임의의 경로에 다운로드한 파일을 위치시키면 됩니다. 저는 C:\usbip\
하위에서 작업하겠습니다. 정한 경로에 소스코드의 드라이버를 설치하기 위해 usbip 깃 저장소도 복제해줍니다.
cd C:\usbip
git clone https://github.com/cezuni/usbip-win.git
복제한 깃 저장소 하위에 driver/usbip_test.pfx
파일을 찾아 설치합니다. (대부분 윈도우에서 더블클릭하면 됩니다.) 대화상자에서 로컬컴퓨터 → 비밀번호 입력 (usbip) → 모든 인증서를 다음 저장소에 저장 → 찾아보기 → 신뢰할 수 있는 게시자 순으로 따라가면 됩니다.
그 후, 테스트 인증서 사용을 활성화하기 위해 관리자 권한으로 실행한 cmd에서 bcdedit.exe /set TESTSIGNING ON
를 입력하고 재부팅합니다.
WSL에 USBIP 클라이언트 구성
이제 우리가 필요한 USB 드라이버들을 포함해 WSL 커널을 재빌드해야합니다. 먼저 필요한 패키지들을 설치합니다.
sudo apt update
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool
그후 WSL 리눅스 커널을 재빌드하기 위해 자신의 리눅스 커널 이름을 알아냅니다.
uname -r
제 경우엔 4.19.128-microsoft-standard
입니다. 복사해둡니다. 그후 커널 소스를 커널 이름을 이용하여 복제합니다. (소스 내용이 매우 많아 복제에만 수 분이 소요됩니다.)
# use your kernel name below /usr/src!
sudo git clone https://github.com/microsoft/WSL2-Linux-Kernel.git /usr/src/4.19.128-microsoft-standard
cd /usr/src/4.19.128-microsoft-standard
본인의 커널 버전에 맞는 tag로 checkout합니다. 제 경우 4.19.128
버전이지만 v4.19.128
태그는 없어서 4.19.128-microsoft-standard
태그로 이동했습니다.
sudo git checkout 4.19.128-microsoft-standard
현재 WSL 커널의 설정을 커널 소스에도 복사해줍시다.
sudo cp /proc/config.gz config.gz
sudo gunzip config.gz
sudo mv config .config
포함할 드라이버를 설치하기 위해 menuconfig
를 실행해줍니다. 이때 터미널의 크기가 일정 수준이하라면 오류가 발생하니 창을 키워주세요.
sudo make menuconfig
menuconfig
화면이 표시됬으면 방향키를 이용해 Device Drivers --->
를 선택하고 엔터를 눌러주세요. 다시 USB Support --->
를 선택하고 Y
키를 눌러 선택해줍니다. ([*]
) 엔터를 눌러 하위 메뉴로 들어가서 필요한 장치를 Y
키를 이용해 선택해줍니다. 저는 Support for Host-side USB
, USB/IP support[M] 및 모든 하위 항목
, USB Serial Converter support 및 모든 하위 항목
정도 선택했습니다. 모두 선택했다면 E
연타하여 최상위로 나온 후 방향키로 Save
선택 후 엔터 쳐서 .config
그대로 저장하고 나옵니다.
선택이 끝났다면 커널을 빌드하고 설치합니다. -j
옵션 뒤의 정수는 자신의 CPU 코어 갯수로 세팅하시면 됩니다. 저의 경우 4입니다.
sudo make -j 4 && sudo make modules_install -j 4 && sudo make install -j 4
결론
다만 저의 경우 위 방법으로 커널 빌드에 실패했고 (usbip 드라이버의 makefile 옵션 내 Werror 플래그 문제) 결국 Windows + WSL 조합은 포기하고 native GCC 위에서 빌드하고 타겟에 프로그래밍하는 방법으로 선회하기로 했습니다.