WSL xbox controller 사용하기

안상훈·2024년 11월 28일
0

WSL설정

목록 보기
7/19
post-thumbnail

이전에 작성한 포스트 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

https://learn.microsoft.com/ko-kr/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package

1. USBIPD 설치 및 USB연결

먼저 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



2. WSL 아키텍쳐에 관한 이해

WSL(Windows Sybsystem for Linux)는 버전1과 버전 2가 있으며, 현재는 모든 WSL은 버전2로 동작을 한다 보면 된다.

WSL1과 WSL2의 주요 차이점을 설명하자면

WSL2은 실존하는 리눅스 커널 위에 리눅스 배포판이 동작을 하고, 모든 리눅스 배포판은 공통의 리눅스 커널을 공유한다

사실 WSL1은 윈도우 위에서 돌아가는 응용프로그램 정도로 생각해도 되고

WSL2는 윈도우와 거의 동등한 레벨의 커널도 갖고 있는 아키텍쳐 구조를 취한다 보면 된다.

따라서 이제 수행해야 할 내용은 WSL-Linux-Kernel을 조정하여 Xbox controller 드라이버를 잡아주는 과정을 진행해야 하는 것이다.

2.1 WSL-Linux 커널 업데이트

먼저 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/install-manual#step-4---download-the-linux-kernel-update-package

커널 업데이트는 위 자료를 참조하면 되고

https://learn.microsoft.com/ko-kr/windows/wsl/connect-usb

윈도우에 연결한 USB장치는 위 사이트의 USBipd를 다운받아 설치하기만 하면 된다.

최신 WSL 리눅스 커널, USBIPD 설치파일
모두 *.msi파일로 딸깍 설치를 하고

괜히 PowerShell을 켜서 설치하는 과정을 할 필요가 없다.

이상한짓 하지말고 이거 두개만 설치하고 끝내면 된다

그 다움부터 진짜 이상한 일을 해야하기때문이다...

참고로 포스트 작성 기준
wsl_update_x64.msiWSL-Linux-Kernel 버전은

5.15.167.4이다.

이쯤하면 눈치챘겠지만 현재 필자의 PC에 설치된 WSL-Linux-Kernel의 버전은 5.15.167.4로
버전이 동일하니 궂이 설치할 필요가 없다.



3. WSL2의 고급설정

이제 본격적으로 수행해야 할 항목은
.wslconfig 혹은 wsl.conf를 생성해
WSL-Ubuntu가 USB장치들을 온전하게 인식 할 수 있는 드라이버 세팅을 수행하고자 한다.

과정은 아래와 같다.

1) menuconfig 를 사용하여 커스텀 커널을 구성 \rightarrow 이때 생성하는 커스텀 커널은 목표하는 USB 드라이버 정보를 추가함 (ex: USB Webcam, Xbox controller, etc...)

2) 생성한 커스텀 커널을 vmlinux라는 이름으로 저장
(이름은 아무렇게나 해도 되나 경로는 꼭 기억해둬야함)
\rightarrow 즉, 커스텀버전의 리눅스 커널파일을 만드는 것이다.

3) 전역 WSL 설정파일 : .wslconfig 파일을 생성하여 vmlinux (커스텀 커널)을 불러와서 WSL2가 실행될 때 해당 커스텀 커널의 위치를 참조 및 불러오기를 수행

위 1~3) 과정을 수행하는 이유는
챕터 2에서 수행한 최신 WSL-Linux-Kernel
통상적으로 USB 드라이버에 대한 정보가 빠져있는 경우가 많기 때문이다.

따라서 리눅스 커널 원본 버전을 수정하지 않으면서 커스텀 버전의 커널을 생성하고

이를 .wslconfig파일로 WSL이 구동할 때 설정정보를 불러와서 커스텀 커널로 WSL-Ubuntu를 실행하는 것이다.

이렇게 진행하는 이유는
혹시나 커스텀 빌드한 리눅스 커널이 문제가 발생했을 때 안전하게 순정 버전 커널로 복귀가 가능하니
위와 같은 과정을 밟아간다... 이렇게 보면 된다.

3.1 원본 커널 다운받기

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만 더 추가했다.


3.2 menuconfig로 커스텀 커널 만들기

이제 커스텀 커널 만드는 작업을 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 \rightarrow OK \rightarrow Exit
순으로 저장 후 종료를 완료하면 된다.

이제 make를 진행해주자

sudo make KCONFIG_CONFIG=Microsoft/config-wsl

딱 봐도 몇분 소요되는 작업이니 여유를 갖자

작업이 완료된 후 ls 명령어를 입력하면

vmlinux 파일이 생성됨음 확인할 수 있다.

커스텀 커널 파일 만들기 참 힘들다


3.3 커스텀 커널을 WSL설정파일에 참조하기

위 사진처럼 수행하면 되는데 그냥 폴더 들어가서 복사 붙여넣기를 해도 되고

WSL-Ubuntu에서 아래 명령어를 통해 붙여넣기를 진행해도 된다

sudo cp -rf vmlinux /mnt/c/WSL_Kernel

복사완료를 수행했으면 wsl을 종료한다

wsl Ubuntu

exit

PowerShell

wsl --shutdown

이제 위 사진처럼 .wslconfig 파일을 생성하고 아래의 설정값을 기입하자

[wsl2]
kernel=C:\\WSL_Kernel\\vmlinux

이제 마지막으로 검증해보자

위 사진처럼 뜨면 정상이다


4. Xbox Controller WSL에서 사용해보기

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 기기의 버스아이디]
profile
자율차 공부중

0개의 댓글