WSL usb webcam사용

안상훈·2023년 7월 19일
1

WSL설정

목록 보기
3/19
post-thumbnail

이번 포스트는 WSL-우분투 환경에서 usb webcam을 사용하는 포스트를 올린다.
참고 포스트 및 유투브 영상은
https://www.youtube.com/watch?v=t_YnACEPmrM&t=307s&ab_channel=AgileDevArt

https://learn.microsoft.com/en-us/windows/wsl/connect-usb

https://velog.io/@swooeun/WSL2-USB-%EC%97%B0%EA%B2%B0-with-USB-Camera

https://lucidmaj7.tistory.com/388

https://m.blog.naver.com/chandong83/221262714615

이다.

이번 포스트의 경우 여러 포스트를 보면서 webcam활성화를 시도했으나 구동이 되지 않는 경우가 꽤 많았다.

하여 참고 포스트 외에도 더 많은 자료를 찾아봤고 그러다 얻어걸린 느낌으로 webcam동작을 성공시켜서 포스트를 작성한다.
즉, 정보가 파편화 되어 있어서 이것저것 포스트를 다 보고 설정해야 한다.


1. Windows PowerShall로 usbipd-win 설치

그냥 usbipd-win 최신버전을
https://learn.microsoft.com/ko-kr/windows/wsl/connect-usb
에 접속해서


다운받아서 설치해도 되나, PowerShell에서 명령어를 통해 설치를 진행하고자 한다


📒참고로 이번 포스트에서 Windows PowerShell은 무조건 관리자 권한으로 실행으로 실행한다.
USB Webcam을 WSL-우분투에서 사용하게 하려면 윈도우 상에서도 관리자 권한으로 Windows에 연결된 디바이스를 WSL-우분투로 제어권한을 넘겨줘야 한다

📒본격적인 설치 전에 아래 명령어를 통해 wsl 업데이트 및 wsl-우분투 Kernal버전 정보를 확인해보자

wsl --update
wsl -> 이 명령어를 통해 PowerShell에서 우분투 실행
$ uname -a -> 커널 정보 확인

📒여기서 PowerShell에서 wsl명령어로 우분투에 접속하는 거랑 우분투 아이콘 실행으로 WSL-우분투 켜는 거랑 초기 터미널 실행 시 경로가 살짝 다르다

우분투 아이콘을 통해 실행하면 home디렉토리로 실행되는데
Powershell로 실행하면 /mnt/c/Users/[윈도우계정이름]/이 default 폴더로 실행된다.
이게 처음 실행되는 default 폴더가 꼬이면 나중에 피곤해지는 경우가 있으니
편하게 PowerShell에서 wsl명령어로 실행한다.
만약 우분투 아이콘으로 실행하면 위 이미지처럼 경로를 변경해준다.


Powershell에서 아래 명령어를 통해서 usbipd 최신버전을 다운받아 설치한다

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


usbipd-win을 msi 로 다운받거나 위 명령어를 치던가 상관없지만 이렇게도 다운받을 수 있다.
물론 명령어를 통해 프로그램 다운받는데 좀 익숙해져야 한다. 우분투에서 대부분의 패키지 관리는 다 CLI명령어를 통해서 진행된다.


1-1.Linux에서 USBIP 도구 및 하드웨어 데이터베이스 설치

이거는 해야 된다는 포스트도 있고 넘어가는 포스트도 있는데
설치를 해주자...
설명은 사용자 공간 도구와 USB 하드웨어 식별자의 데이터베이스를 설치가 필요하다 하는데 무슨 뜻인지 잘 모르겠다
아무튼 WSL-우분투에서 아래 명령어를 쳐서 설치를 수행한다

$ sudo apt install linux-tools-generic hwdata
$ sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20


2.WSL2-Linux-Kernel 설치

다음으로 리눅스 커널을 수정해야 하는데
이때 커널 수정을 GUI로 할 수 있도록 도와주는 menuconfig를 구동할 수 있도록
WSL2-Linux-Kernel을 설치한다.

https://github.com/microsoft/WSL2-Linux-Kernel
WSL2-Linux-Kernel 다운로드는 위에서 진행하며, 릴리즈 리스트에서
WSL-우분투의 커널버전과 맞는 버전을 찾는다

필자는 $ uname -a 명령으로 커널 정보를 확인했으며, 필자의 WSL-우분투 커널 버전은 5.15.90.1이다.

그리고 아래의 명령어를 수행한다.

$ cd
$ cd /usr/src -> 우분투의 컴파일 되지 않는 소스코드만 관리하는 폴더인 src폴더로 이동

$ VERSION=5.15.90.1
$ git clone -b linux-msft-wsl-${VERSION} https://github.com/microsoft/WSL2-Linux-Kernel.git ${VERSION}-microsoft-standard && cd ${VERSION}-microsoft-standard

여기서부터 조금 알기 힘든 내용이 있는데
하나는 VERSION=5.15.90.1 이고 또다른 하나는 git clone -b linux-msft-wsl-${VERSION} https://github.com/microsoft/WSL2-Linux-Kernel.git ${VERSION}-microsoft-standard && cd ${VERSION}-microsoft-standard
이라는 긴 한줄짜리 명령어이다

하나하나 뜯어보자면

VERSION=5.15.90.1는 그냥 매크로로 VERSION이라는 단어는 5.15.90.1와 같은 내용이다 라는 뜻이다. 이거를 수행한 이유는 다음 명령어가 길어지는걸 좀 가독성 있게 바꾸려고 한 것이다.

git clone -b linux-msft-wsl-${VERSION} https://github.com/microsoft/WSL2-Linux-Kernel.git ${VERSION}-microsoft-standard && cd ${VERSION}-microsoft-standard

여기서 첫번째
git clone -b는 git에 업로드 되어 있는 소스코드를 클론(복사)하는데 특정 브랜치의 소스코드만 복사할 때 쓰는 명령어이다.
위 명령의 Fullname는 git cloen --branch이다.
그리고 그 다음에 들어가 있는 linux-msft-wsl-${VERSION}
특정 브랜치의 소스코드를 클론하겠다는 명령어이니 '브랜치명'에 해당하는 것이다.
즉, git clone -b [브랜치 이름] 이다. 여기서 ${VERSION}은 앞서 WSL2-Linux-Kernel이 깃에 올라가 있고 이게 릴리즈 버전이 여러개가 있는데 각 릴리즈 버전의 버전명을 매크로로 지정한 변수명으로 쓴다는 뜻이다

git clone -b [브랜치(릴리즈) ${버전명}] 이렇게 이해하면 될 듯하다.

다음의 ${VERSION}-microsoft-standard는 git clone을 수행한 소스코드를
특정 폴더에 저장하고 싶은데 해당 폴더명을 지정하는 방식이다.

이게 유투브에서 명령어를 퍼와서 저렇게 적은건데 풀어 적자면

git clone -b [브랜치(릴리즈) ${버전명}] {clone한 파일 저장 폴더명} 이렇게 된다.
마지막 && cd ${VERSION}-microsoft-standard는 위 클론 과정을 수행 한 후 해당 폴더로 이동하라는 뜻이다.

필자의 경우 git을 사용할 줄 모르는 상황에서 위 코드를 그냥 갖다 붙여쓰다보니
내용을 하나도 몰라서 철자 하나하나 타자치고 헤멨는데
이제야 좀 이해가 간다..


그림은 잘 보이지는 않지만 아무튼 git 클론을 특정 브랜치(릴리즈 버전)을 하고, 폴더명 지정과 동시에 해당 폴더로 이동한다 보면 된다.

아무튼 클론 과정 & 폴더명 생성과정 & 폴더 이동과정 까지 끝났으면 아래 명령을 수행한다.

$ sudo cp /proc/config.gz config.gz
클론한 폴더의 하위 디렉토리 중 proc 폴더 안에 있는 config.gz 라는 파일을 메인 디렉토리 폴더에 복사
$ sudo gunzip config.gz
config.gz파일은 압축되어 있는 파일인데 이를 압축해제 하기 위하여 gunzip 명령어로 압축 해제
$ sudo mv config .config
위에서 압축을 해제하면 config 라는 파일이 발생하는데 이를 실행파일인 .config 파일로 이름 변경

위 명령까지 수행 후 $ ls -al 명령을 수행해서 .config파일이 있는지 확인한다.


3.menuconfig 설정

WSL2-Linux-Kernel를 빌드하기 위한 설정을 위에서 다 마쳤으면 make명령어를 통해 menuconfig를 실행한다.

$ sudo make menuconfig
위 명령어를 실행하면 make를 진행한 후 menuconfig GUI창이 열려야 하는데 안 열리고 에러가 뜨는 경우가 있다. 에러가 뜨면 구글링 할 시 대체로 '어떤 패키지'가 설치되어 있지 않음 이라고 뜰 것이다.
해당 패키지를 찾아서 설치하면 된다
필자는 libncurses5-dev랑 libcursesw5-dev패키지가 설치안되어 있어서 아래 명령어를 통해 설치했다.

make가 재대로 되면 아래와 같은 화면이 팝업될 것이다.

여기서 몇가지 기능을 활성화(y버튼을 누르면 활성화) 해줘야 한다.

활성화 리스트는 아래의 그림과 같다.

대분류 -> 중분류 -> 소분류 -> 소소분류 -> 소소소분류 식으로 메뉴를 타고 들어가서
활성화 해야 할 리스트를 찾아서 Y버튼을 눌러서 활성화(활성화 되면 * 표시로 바뀐다) 해줘야 하는데 메뉴를 타고 들어가는 키는 'SPACE'버튼이다.


활성화를 다 하고 나면 config가 변경되었다고 변경된 config정보를 save할 것이냐는 물음이 뜨는데 여기서 YES를 선택한다

config 저장한 후에는 아래 명령어를 쳐준다.

$ sudo make -j$(nproc) make를 수행하는데 가용 가능한 모든 CPU프로세스를 사용해 make를 수행한다는 뜻
이때 -j 8 이렇게 치면 CPU프로세스 8개만 사용한다는 뜻이다.
$ sudo make module install -j$(nproc)
$ sudo make install -j$(nproc)

여기까지 수행후 ls -al을 하면 vmlinux라는 파일이 생성될 것이다.

이 파일을 아래의 명령어를 통해 복사를 한다

$ sudo cp -rf vmlinux /mnt/c/Sources/
위 명령어는 vmlinux란 파일을 윈도우 C드라이브의 Sources폴더에 복사한다는 뜻으로 복사가 잘 됬으면 아래와 같이 C드라이브에 해당 파일이 생성될 것이다

이제 윈도우의 C:\Users\[사용자 계정]으로 가서 .wslconfig를 만들고 해당 파일을 메모장 열어서 위 코드를 쳐준다

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


위 .wslconfig 파일은 WSL2에 설치한 모든 배포판(우분투버전)에 전역적으로 설정을 수행하는 config파일이며, 해당파일은 설정이 완료된 vmlinux를 참조한다는 뜻으로 보면 된다.


4.usbipd로 webcam을 wsl-우분투에 붙이기

여기서는 Powershell창이랑 우분투 창 2개를 띄워서 웹캠을 wsl-우분투로 붙이는 작업을 수행한다.

우선 Powershell에서 붙이고자 하는 usb webcam의 버스 리스트를 확인한다

usbipd wsl list


필자가 WSL-우분투로 제어권한을 넘기고 싶은 웹캠은 로지텍 C270으로 해당 디바이스의 버전ID는 4-2이기에
아래 명령을 실행한다

usbipd wsl attach --busid 4-2

이때 해당 디바이스가
usbipd: error: Failed to attach device with busid
에러메세지를 낸다면 아래의 명령어를 통해 강제로 제어권한을 넘겨준다

usbipd bind --force --busid 4-2

제어권한을 강제로 넘겨주고 재부팅 한 후에

usbipd wsl attach --busid 4-2

를 수행하면 재대로 WSL-우분투에 권한이 이동한 것을 확인할 수 있다.

권한이 이동되었으면 WSL-우분투에서 아래 명령어로 재대로 웹캠이 붙었는지 확인하자

$ lsusb -> 디바이스 리스트를 통해 웹캠이 붙었는지 확인
$ ll /dev/video* -> 붙은 디바이스는 dev폴더에 video리스트로 디바이스 정보가 뜨는데 해당 폴더가 재대로 만들어졌는지 확인

여기서 끝이 아니다
마지막으로 생성된 video0, video1 폴더의 권한을 모든 사용자가 접근 가능한 권한으로 설정해준다

$ sudo chmod 777 /dev/video0
$ sudo chmod 777 /dev/video1


5. 웹캠 실행

웹캠의 정보 확인 및 실행(데모)는 아래의 패키지를 설치하여 확인해본다

$ sudo apt install v4l-utils -> 카메라 정보 확인 및 조정을 하기 위한 패키지
$ v4l2-ctl -d /dev/video0 --all -> 웹캠 정보 출력

v4l2-ctl 패키지는 카메라 정보 확인 밎 제어용 패키지인데 해당 패키지로 WSL-우분투로 권한이 넘어온 웹캠 정보를 확인한다.

다음으로 웹캠을 구동해보자

$ sudo apt-get install guvcview -> 리눅스용 카메라 앱 guvcview설치
$ guvcview -d /dev/video0 -> 카매라 앱 guvcview로 실행
세부 파라미터 -d는 --device [디바이스 경로] 를 의미함



이것으로 wsl-우분투에 웹캠을 붙여서 실행하는 데모까지 수행을 완료했다.
이 웹캠 wsl로 붙이는데 이것저것 설정해야 할 것이 많은데
포스트된 자료가 많이 파편화되어 있고 PC마다 설정이 달라서 조금 헤맨 감이 있다...

이렇게 까지 했는데 안되는 분은 차분하게 구글링으로 더 찾아보길 바란다...


6. 오류 포스팅

오랜만에 다시 USB Webcam을 Ubuntu에서 실행하려 하니 아래의 구문이 떠서 난감한 경우가 발생하였다.

usbipd: error: WSL 'usbip' client not correctly installed. See https://github.com/dorssel/usbipd-win/wiki/WSL-support for the latest instructions.

대략 버전이 맞지않아서 USBIP 에러가 발생한다는 것인데
앞에 포스팅 한 내용 중 1-1.Linux에서 USBIP 도구 및 하드웨어 데이터베이스 설치
부분을 반복하면 된다.

우선 첫번째로
PowerShell에서 Ubuntu 게스트 리눅스 콘솔로 접속

wsl

PowerShell에서 위 wsl 명령어로 우분투 리눅스에 접속하라는 뜻이다.
그낭 우분투 아이콘 클릭해서 하면 안된다.

두번째로 1.1 포스트 그냥 따라하기

$ sudo apt install linux-tools-generic hwdata
$ sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20

그대로 따라하면 linux-tools-generic is already the newest version (5.4.0.156.152) 라고 버전이 업데이트 되었다니 업데이트 하라는 말이 뜨면서
모든 명령어를 수행하면 업데이트가 정상적으로 됨을 확인할 수 있다.
가끔 버전업이 될 때마다 위 명령어를 수행해줘야 하는 것으로 생각된다.

위 과정을 수행하면 아래와 같이 재대로 동작함을 확인할 수 있다.

usbipd wsl attach --busid [장치 버스아이디]
usbipd wsl list

위 사진처럼 재대로 Attached됨을 확인하였다.

profile
자율차 공부중

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

글 잘 봤습니다, 많은 도움이 되었습니다.

답글 달기