이전에 작성한 포스트 WSL usb webcam사용
에서 내용이 많이 업데이트 된 부분이 있어 정리가 필요하기에 이를 다시 기록한다.
관련 자료 출처 :
https://learn.microsoft.com/ko-kr/windows/wsl/connect-usb#attach-a-usb-device
https://learn.microsoft.com/ko-kr/windows/wsl/wsl-config
https://learn.microsoft.com/ko-kr/windows/wsl/wsl-config
먼저 usbipd-win
을 설치한다 해당파일은 Windows 운영체제에서 USB장치를 WSL2(Windows Subsystem for Linux)에 공유&사용을 가능케 하는 도구이다.
https://github.com/dorssel/usbipd-win/releases
설치를 완료한 후 PowerShell
을 관리자 권한으로 실행을 수행한다
연결 대상 Xbox controller은 사진상의 제품으로 해당 제품은 Bluetooth로도 연결이 가능하나 동봉된 USB케이블을 통해 직접연결을 수행한다.
아무튼 PowerShell
을 관리자 권한으로 실행했다면 아래의 명령어를 입력하자
관리자 권한 PowerShell
usbipd list
위 명령어를 수행하면 Windows 환경에서 연결된 USB 리스트를 전부 확인할 수 있다.
이제 목표하는 Xbox One 컨트롤러를 WSL과 공유하도록 하자
관리자 권한 PowerShell
usbipd bind --busid [공유대상 USB 버스아이디]
위 사진처럼 Windows -- WSL 간의 USB공유를 완료한 뒤에는 또다른 PowerShell
창이나 아니면 WSL-Ubuntu
를 구동하자
일반 버전 Powershell 혹은 WSL-Ubuntu
wsl -d [실행시키고자 하는 우분투 버전]
일반버전 Powershell 혹은 관리자버전 Powershell
usbipd attach --wsl --busid [연결 대상 USB 버스아이디]
WSL-Ubuntu
lsusb
위 사진처럼 1번 창PowerShell
, 2번 창WSL-Ubuntu
에서 각각의 명령어를 수행해
공유중인 USB가 WSL-Ubuntu
에 올바르게 연결되었는지 확인한다.
여기까지 수행했다면 Ubuntu에서 xbox Wireless Controller 장치를 사용하기 위한 패키지를 설치한다.
WSL-Ubunut
sudo apt-get install xboxdrv
# 실행한되는 상황을 상세확인
sudo xboxdrv
sudo xboxdrv --detach-kernel-driver
위 과정을 통해서 연결된 Xbox controller이 온전하게 작동하지 않음을 확인하자
이제 해당 USB드라이버를 WSL-Ubuntu 커널에 삽입 및 WSL 설정파일 구성 등을 수행해야 한다..
그전에 실행중인 Ubuntu의 WSL-Ubuntu
커널 버전을 확인하고 wsl을 기능종료하자
WSL-Ubuntu
uname -a
PowerShell
wsl --shutdown
WSL(Windows Sybsystem for Linux)는 버전1과 버전 2가 있으며, 현재는 모든 WSL은 버전2로 동작을 한다 보면 된다.
WSL1과 WSL2의 주요 차이점을 설명하자면
WSL2은 실존하는 리눅스 커널 위에 리눅스 배포판이 동작을 하고, 모든 리눅스 배포판은 공통의 리눅스 커널을 공유한다
사실 WSL1은 윈도우 위에서 돌아가는 응용프로그램 정도로 생각해도 되고
WSL2는 윈도우와 거의 동등한 레벨의 커널도 갖고 있는 아키텍쳐 구조를 취한다 보면 된다.
따라서 이제 수행해야 할 내용은 WSL-Linux-Kernel을 조정하여 Xbox controller 드라이버를 잡아주는 과정을 진행해야 하는 것이다.
먼저 WSL2 Linux 커널을 최신 버전으로 업데이트 해주는 것이 여러모로 편하긴 하다.
이전 포스트 WSL usb webcam사용
의
2. WSL-Linux-Kernel 설치는 github 홈페이지 가서 터미널 명령어 형식으로 커널 업데이트를 진행했는데
머리아프게 그러지 말자...
뭐.. 예를들어
sudo apt install -y linux-tools-5.4.0-77-generic hwdata
이렇게 특정 버전의 리눅스 커널 설치 하고
sudo update-alternatives --install /usr/local/bin/usbip usbip $(ls /usr/lib/linux-tools/*/usbip) 20
이렇게 USBIPD 설치를 CLI형식으로 진행하는 과정이 있는데...
커널 업데이트는 위 자료를 참조하면 되고
https://learn.microsoft.com/ko-kr/windows/wsl/connect-usb
윈도우에 연결한 USB장치는 위 사이트의 USBipd를 다운받아 설치하기만 하면 된다.
최신 WSL 리눅스 커널, USBIPD 설치파일
모두 *.msi
파일로 딸깍 설치를 하고
괜히 PowerShell을 켜서 설치하는 과정을 할 필요가 없다.
이상한짓 하지말고 이거 두개만 설치하고 끝내면 된다
그 다움부터 진짜 이상한 일을 해야하기때문이다...
참고로 포스트 작성 기준
wsl_update_x64.msi
의 WSL-Linux-Kernel 버전은
5.15.167.4이다.
이쯤하면 눈치챘겠지만 현재 필자의 PC에 설치된 WSL-Linux-Kernel의 버전은 5.15.167.4로
버전이 동일하니 궂이 설치할 필요가 없다.
이제 본격적으로 수행해야 할 항목은
.wslconfig
혹은 wsl.conf
를 생성해
WSL-Ubuntu
가 USB장치들을 온전하게 인식 할 수 있는 드라이버 세팅을 수행하고자 한다.
과정은 아래와 같다.
1) menuconfig
를 사용하여 커스텀 커널을 구성 이때 생성하는 커스텀 커널은 목표하는 USB 드라이버 정보를 추가함 (ex: USB Webcam, Xbox controller, etc...)
2) 생성한 커스텀 커널을 vmlinux
라는 이름으로 저장
(이름은 아무렇게나 해도 되나 경로는 꼭 기억해둬야함)
즉, 커스텀버전의 리눅스 커널파일을 만드는 것이다.
3) 전역 WSL 설정파일 : .wslconfig
파일을 생성하여 vmlinux
(커스텀 커널)을 불러와서 WSL2가 실행될 때 해당 커스텀 커널의 위치를 참조 및 불러오기를 수행
위 1~3) 과정을 수행하는 이유는
챕터 2에서 수행한 최신 WSL-Linux-Kernel는
통상적으로 USB 드라이버에 대한 정보가 빠져있는 경우가 많기 때문이다.
따라서 리눅스 커널 원본 버전을 수정하지 않으면서 커스텀 버전의 커널을 생성하고
이를 .wslconfig
파일로 WSL이 구동할 때 설정정보를 불러와서 커스텀 커널로 WSL-Ubuntu를 실행하는 것이다.
이렇게 진행하는 이유는
혹시나 커스텀 빌드한 리눅스 커널이 문제가 발생했을 때 안전하게 순정 버전 커널로 복귀가 가능하니
위와 같은 과정을 밟아간다... 이렇게 보면 된다.
WSL-Linux-Kernel을 수정하기 위해
먼저 PC에 설치한 WSL-Linux-Kernel과 동일한 버전의 Kernel 소스파일을 다운받아야 한다.
https://github.com/microsoft/WSL2-Linux-Kernel
현재 해당 페이지에서 제공하는 가장 최신의 WSL-Linux-Kernel로 업데이트를 진행했으니
PowerShell을 열어서 아래의 명령어를 순차적으로 수행한다.
PowerShell
wsl
참고로 wsl
명령어로 대표 WSL-Ubuntu를 실행하면
경로가 /mnt/c/Users/[윈도우 사용자명]
으로 초기화 되는데
/mnt/c/Users/[윈도우 사용자명]
== C:\Users\[윈도우 사용자명]
이다.
여기가 WSL-Ubuntu가 실행시 가장 먼저 접근하는 경로이기에 이 폴더에 .wslconfig
파일이 위치해 잇어야 한다.
그래야 WSL이 처음 시작하는 디렉토리에서 설정파일을 온전하게 읽어서
WSL-Ubuntu의 사전 설정 내역들을 수행할 수 있다.
여기까지는 경로 설정에 대한 설명이니
이제 실습을 진행하도록 하자
먼저 wsl
명령어를 수행하면 설치한 WSL-Ubuntu 중 하나가 실행되는데 대체로 가장 최신버전의 대표 우분투 버전이 실행된다.
이때 /mmt/c/Users/[윈도우 사용자명]
에 원본 커널을 다운받고 빌드를 실행하면 C:\Users\[윈도우 사용자명]
폴더가 상당히 지저분해지니 임의의 폴더로 이동 후 커널 소스 파일 clone을 수행하자
WSL-Ubuntu
VER=[최신버전] #최신버전을 네임태그
cd # 홈 경로로 이동
mkdir ~/src # git파일 저장을 위한 폴더 생성
cd ~/src
git clone -b linux-msft-wsl-${VER} https://github.com/microsoft/WSL2-Linux-Kernel.git
파일 다운로드를 마쳣다면 https://github.com/microsoft/WSL2-Linux-Kernel 에서 언급중인
Build Instructions의 1번 과정 : 빌드 의존성 설치를 진행하자
WSL-Ubuntu
sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev cpio
다음으로 선택사항인데 생성하는 커스텀 커널의 이름을 변경하고자 한다.
WSL-Ubuntu
cd ~/src/WSL2-Linux-Kernel/Microsoft/
# config-wsl 파일의 편집
code config-wsl
파일의 편집은 CONFIG_LOCALVERSION
항목에 커널이름이 기재되어 있는데 여기다 -USB
만 더 추가했다.
이제 커스텀 커널 만드는 작업을 menuconfig
를 통해 진행해보자
그 전에 추가로 패키지 설치를 진행하자
(몇개 설치할게 더 있다...)
WSL-Ubuntu
sudo apt update
sudo apt install -y build-essential libncurses-dev libncurses5-dev pkg-config
설치를 완료한 뒤에 폴더 이동 후 menuconfig
명령을 실행하여 커널 수정을 진행하도록 하자
cd ~/src/WSL2-Linux-Kernel
make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl
이왕 커스텀 커널을 만드는 거 WSL usb webcam사용
에서 진행한 usb webcam도 같이 활성화 되게끔 커널 빌드를 진행하도록 하겠다.
위 사진처럼 *
별표 표시를 각 항목마다 채워넣는 작업을 진행해야 한다.
확인해야 할 항목이 많고, 수행해야 할 항목도 많으니 주의를 기울여서 비활성화된 드라이버 리스트들을 활성화 하도록 하자
위 사진에서 알 수 있듯이 Device Driver 챕터쪽에서 Disabled 되어 있는 항목들은 y
버튼을 눌러서 Enable 해주도록 하자
활성화 할 항목들 전부 다 활성화 한 뒤에는
Save OK Exit
순으로 저장 후 종료를 완료하면 된다.
이제 make
를 진행해주자
sudo make KCONFIG_CONFIG=Microsoft/config-wsl
딱 봐도 몇분 소요되는 작업이니 여유를 갖자
작업이 완료된 후 ls
명령어를 입력하면
vmlinux 파일이 생성됨음 확인할 수 있다.
커스텀 커널 파일 만들기 참 힘들다
위 사진처럼 수행하면 되는데 그냥 폴더 들어가서 복사 붙여넣기를 해도 되고
WSL-Ubuntu에서 아래 명령어를 통해 붙여넣기를 진행해도 된다
sudo cp -rf vmlinux /mnt/c/WSL_Kernel
복사완료를 수행했으면 wsl
을 종료한다
wsl Ubuntu
exit
PowerShell
wsl --shutdown
이제 위 사진처럼 .wslconfig
파일을 생성하고 아래의 설정값을 기입하자
[wsl2]
kernel=C:\\WSL_Kernel\\vmlinux
이제 마지막으로 검증해보자
위 사진처럼 뜨면 정상이다
WSL-Linux-Kernel 커널도 생성했고, 해당 커널이 WSL-Ubuntu을 구동하는 Default커널이 되고 있음을 확인했다
이제 진짜로 Xbox Controller을 붙여서 동작을 원할하게 하는지 확인해보자
①③번 명령어는 관리자권한의 PowerShell에서
②④번 명령어는 일반 PowerShell에서 차례대로 순서에 맞게 실행하면 된다.
usbipd list # 1번 관리자 권한 PowerShell명령
wsl -d [실행하고자 하는 우분투 버전] # 2번 일반 PowerShell
usbipd attach --wsl --busid [우분투에서 실행하고자 하는 USB장치] # 3번 관리자 권한 PowerShell명령
lsusb # 4번 PowerShell에서 WSL-우분투 터미널로 변한 창
추가로 좀 더 확인해보자
uname -r #커스텀 WSL-Linux-Kernel인지 확인
ls -l /dev/input # 조이스틱이 잡혀있는지 확인
이제 xbox controller 테스트를 위한 패키지 xboxdrv
를 실행시켜보자
하 ㅋㅋㅋ... 왜안되지;;;
여기서 좌절하지는 말자...
원래 목표가 WSL-Ubuntu 환경에서 조이스틱으로 ROS joy_node를 구동하는 거였으니
그건 되는지 일단 확인해보자...
음.. rosrun joy joy_node
로 실행하니까
조이스틱 노드가 동작은 하네...
어쨋든 동작하잖아 한잔해~
참고로 WSL-Ubuntu에서 구동 중인 USB기기를 탈거하고 싶다면
관리자 권한으로 실행중에 있는 PowerShell에 아래의 명령어를 기입하면 된다
usbipd detach --busid [현재 WSL-Ubuntu에 붙어있는 USB 기기의 버스아이디]