이번 포스트는 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동작을 성공시켜서 포스트를 작성한다.
즉, 정보가 파편화 되어 있어서 이것저것 포스트를 다 보고 설정해야 한다.
그냥 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명령어를 통해서 진행된다.
이거는 해야 된다는 포스트도 있고 넘어가는 포스트도 있는데
설치를 해주자...
설명은 사용자 공간 도구와 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
다음으로 리눅스 커널을 수정해야 하는데
이때 커널 수정을 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파일이 있는지 확인한다.
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를 참조한다는 뜻으로 보면 된다.
여기서는 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
웹캠의 정보 확인 및 실행(데모)는 아래의 패키지를 설치하여 확인해본다
$ 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마다 설정이 달라서 조금 헤맨 감이 있다...
이렇게 까지 했는데 안되는 분은 차분하게 구글링으로 더 찾아보길 바란다...
오랜만에 다시 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됨을 확인하였다.
글 잘 봤습니다, 많은 도움이 되었습니다.