WSL2에서 웹캠 연결하기 (커널 빌드 필요)

WSL2에서 usb-ipd를 이용해서 디바이스를 연결할 수 있었습니다만, 현재의 WSL2 기본 커널에선 웹캠을 지원하지 않습니다. 따라서 웹캠을 WSL2에서 사용하기 위해선 커널을 재빌드해줘야 합니다.

Ubuntu를 실행하고, 먼저 빌드에 필요한 패키지를 설치해줍니다.

$ sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev bc libncurses-dev

다음으로, 커널 소스를 가져옵니다. 현재 릴리즈된 최신 버전은 5.15.90.1입니다. 관련된 Repository는 https://github.com/microsoft/WSL2-Linux-Kernel 에서 확인할 수 있습니다.

$ mkdir ~/tmp
$ cd ~/tmp
$ wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/tags/linux-msft-wsl-5.15.90.1.tar.gz
$ tar zxf linux-msft-wsl-5.15.90.1.tar.gz
$ cd WSL2-Linux-Kernel-linux-msft-wsl-5.15.90.1

기존 커널 옵션을 가져와서 복사해놓습니다.

$ cp /proc/config.gz
$ gunzip config.gz
$ mv config .config

커널 빌드 옵션을 조정하기 위해서 다음의 명령어를 입력해줍니다.

$ make menuconfig

카메라에 관련한 몇가지 옵션을 조정해줍니다. 옵션은 Space Bar를 누르면 조정가능합니다. 하위 메뉴를 찾아서 다음과 같이 설정해줍니다.

Device Driver --> <*>  Multimedia Support
Multimedia Support --> [*] Filter media drivers
Multimedia Support --> Media device types --> [*] Cameras and video grabbers
Multimedia Support --> Video4Linux options -> [*] V4L2 sub-device userspace API
Multimedia Support --> Media drivers --> [*] Media USB Adapters
Media USB Adapters --> <*> USB Video Class (UVC)
Media USB Adapters --> <*> GSPCA based webcams

설정이 완료되면, 저장한 후 다시 터미널로 나와 다음과 같이 입력하여 빌드를 진행해줍니다.

$ make -j8

빌드가 완료되었습니다.

  GZIP    arch/x86/boot/compressed/vmlinux.bin.gz
  MKPIGGY arch/x86/boot/compressed/piggy.S
  AS      arch/x86/boot/compressed/piggy.o
  LD      arch/x86/boot/compressed/vmlinux
  ZOFFSET arch/x86/boot/zoffset.h
  OBJCOPY arch/x86/boot/vmlinux.bin
  AS      arch/x86/boot/header.o
  LD      arch/x86/boot/setup.elf
  OBJCOPY arch/x86/boot/setup.bin
  BUILD   arch/x86/boot/bzImage
Kernel: arch/x86/boot/bzImage is ready  (#1)

다음으로 모듈을 빌드하고 설치해줍니다.

$ sudo make modules_install

arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support
  DEPMOD  /lib/modules/5.15.90.1-microsoft-standard-WSL2

또, 빌드된 커널을 설치해줍니다.

$ sudo make install

arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support
sh ./arch/x86/boot/install.sh 5.15.90.1-microsoft-standard-WSL2 \
        arch/x86/boot/bzImage System.map "/boot"
run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 5.15.90.1-microsoft-standard-WSL2 /boot/vmlinuz-5.15.90.1-microsoft-standard-WSL2

또, 빌드된 커널 이미지 vmlinux를 C:\의 임의의 디렉토리로 복사해줍니다.

$ sudo cp -rf vmlinux /mnt/c/Kernels

이제 Ubuntu에서의 작업은 모두 완료되었습니다.


먼저 WSL2를 종료합니다.

> wsl2 --shutdown

윈도우에서 홈디렉토리의 .wslconfig 파일을 다음과 같이 수정해줍니다.

[WSL2]
networkingMode = bridged
vmSwitch = wsl2-external
kernel = C:\\Kernels\\vmlinux

이제 다시 Ubuntu를 실행합니다.


커널이 잘 로딩되었는지 빌드 번호 확인

$ uname -a
Linux DESKTOP-HFMFSCL 5.15.90.1-microsoft-standard-WSL2 #1 SMP Tue Feb 14 09:51:42 KST 2023 x86_64 x86_64 x86_64 GNU/Linux

이제 웹캠이 잘 연결되는지 확인해봅니다.

먼저 윈도우의 커맨드 창에서 usbipd를 이용해 웹캠을 attach 해줍니다.

> usbipd wsl list 
BUSID  VID:PID    DEVICE                                                        STATE   
2-1    27c6:533c  Goodix fingerprint                                            Not attached  
2-2    1a86:7523  USB-SERIAL CH340 (COM6)                                       Not attached
2-5    0c45:6a0c  Integrated Webcam                                             Not attached 
2-14   8087:0026  Intel(R) Wireless Bluetooth(R)                                Not attached 
6-2    0bda:8153  Realtek USB GbE Family Controller                             Not attached 
7-1    05ac:024f  USB Input Device                                              Not attached 
7-3    046d:c539  USB Input Device                                              Not attached 
7-4    0bda:49a7  Realtek USB2.0 Audio, USB Input Device                        Not attached

> usbipd wsl attach -b 2-5

Ubuntu를 실행하고 커널 메시지를 확인해봅니다.

$ sudo dmesg
...
[  120.428941] vhci_hcd vhci_hcd.0: pdev(0) rhport(0) sockfd(3)
[  120.430636] vhci_hcd vhci_hcd.0: devid(131077) speed(3) speed_str(high-speed)
[  120.431905] vhci_hcd vhci_hcd.0: Device attached
[  120.781071] usb 1-1: new high-speed USB device number 2 using vhci_hcd
[  120.931358] usb 1-1: SetAddress Request (2) to port 0
[  120.985548] usb 1-1: New USB device found, idVendor=0c45, idProduct=6a0c, bcdDevice= 1.30
[  120.986274] usb 1-1: New USB device strings: Mfr=2, Product=1, SerialNumber=0
[  120.986647] usb 1-1: Product: Integrated_Webcam_HD
[  120.986898] usb 1-1: Manufacturer: CKFJH67N3010300037T0
[  121.004725] usb 1-1: Found UVC 1.00 device Integrated_Webcam_HD (0c45:6a0c)
[  121.023621] input: Integrated_Webcam_HD: Integrate as /devices/platform/vhci_hcd.0/usb1/1-1/1-1:1.0/input/input0
[  121.026970] usb 1-1: Found UVC 1.00 device Integrated_Webcam_HD (0c45:6a0c)
[  121.038030] input: Integrated_Webcam_HD: Integrate as /devices/platform/vhci_hcd.0/usb1/1-1/1-1:1.2/input/input1

/dev 디렉토리에 video0가 생성되었는지 확인합니다.

$ ll /dev/video*
crw------- 1 root root 81, 0 Feb 14 10:31 /dev/video0
crw------- 1 root root 81, 1 Feb 14 10:31 /dev/video1
crw------- 1 root root 81, 2 Feb 14 10:31 /dev/video2
crw------- 1 root root 81, 3 Feb 14 10:31 /dev/video3

v4l2-ctrl 명령어로 디바이스 확인

$ sudo v4l2-ctl --list-devices
Integrated_Webcam_HD: Integrate (usb-vhci_hcd.0-1):
        /dev/video0
        /dev/video1
        /dev/video2
        /dev/video3
        /dev/media0
        /dev/media1

영상은… 제 경우엔 검은색 화면만 나오고 있는데, 이 부분은 다시 확인해봐야겠습니다. 또 sudo 권한으로만 접근이 가능한 점도 뭔가 설정이 더 필요한듯 합니다.


Comments

5 responses to “WSL2에서 웹캠 연결하기 (커널 빌드 필요)”

  1. jw_kong Avatar
    jw_kong

    안녕하세요.

    검은색 화면만 나오는 영상은 어떻게 해결하셨을까요?

  2. 공지원 Avatar
    공지원

    안녕하세요
    검정색 화면 어떻게 해결하셨나요?

    1. WSL2는 이때 이후론 사용하지 않아서요..^^;; 현재 버전도 마찬가지인가요??

  3. 공대생 Avatar
    공대생

    제 블로그에 해결방법 있습니다. 오셔서 확인하세요
    https://m.blog.naver.com/dlcndgusgnss?fbclid=PAAaZ3jtDvMfpgZ_gbDGJ6Y3GL4-kavNuCD01r0lcnNKFA0zj3kPsSLMNF4ls

    1. 넵. 감사합니다.^^

Leave a Reply

Your email address will not be published. Required fields are marked *