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 권한으로만 접근이 가능한 점도 뭔가 설정이 더 필요한듯 합니다.
Leave a Reply