を経て、再度、wsl で USBのWebカメラを使うに、挑戦中。
ちなみにターゲットのカメラはこちら(ロジクール Webカメラ C270n HD 720P)です。
ちなみに前提として、https://github.com/dorssel/usbipd-win/releases から、usbipd-win_3.0.0.msiをダウンードしてWIndows10に入れています。
とりあえずWindows10(×11)の、powershell(管理者モード)で、以下を確認
PS C:\WINDOWS\system32> wsl --list --all --verbose
NAME STATE VERSION
* docker-desktop-data Stopped 2
Ubuntu-20.04 Running 2
docker-desktop Stopped 2
という、いわゆる「オール2」をなんとか実現。
PS C:\WINDOWS\system32> usbipd wsl list
BUSID VID:PID DEVICE STATE
4-1 1058:25a2 USB 大容量記憶装置 Not attached
4-2 04bb:011c USB 大容量記憶装置 Not attached
5-3 04d9:1400 USB 入力デバイス Not attached
6-1 0d8a:0103 USB 印刷サポート Not attached
6-3 093a:2510 USB 入力デバイス Not attached
7-2 04f9:02c0 USB 印刷サポート, Brother DCP-J940N, USB 大容量記憶装置 Not attached
8-1 0a12:0001 Generic Bluetooth Radio Not attached
8-2 0d8c:0139 USB PnP Sound Device, USB 入力デバイス Not attached
8-3 046d:0825 Logi C270 HD WebCam Not attached
8-4 04e6:511a SCR3310-NTTCom USB SmartCard Reader Not attached
までは、なんとか出てくるのだけど、
PS C:\WINDOWS\system32> usbipd wsl attach --busid 8-3
usbipd: info: Using default WSL distribution 'docker-desktop-data'; specify the '--distribution' option to select a different one.
usbipd: error: The selected WSL distribution is not running; keep a command prompt to the distribution open to leave it running.
このエラーが取れない(いまいましい)。
https://github.com/dorssel/usbipd-win/issues/136 のページを読んでいたら、ちょっと気になった一節があったので、これを試してみました。
PS C:\WINDOWS\system32> usbipd wsl attach --distribution Ubuntu-20.04 --busid 8-3
としたら、何も言わずに、「通し」ました。
通らない場合もありました。
usbipd: error: The service is currently not running; a reboot should fix that.
というエラーがでてきて困りました。
この場合、管理者モードで立ち上げたpowershellから、
usbipd server
を投入しつつ、別の管理者モードでpowershellから、"usbipd wsl attach --distribution Ubuntu-20.04 --busid 8-3" を実施すると上手くみたいです(powershellが2つも上がっている状態はうっとうしですが)
BUSID VID:PID DEVICE STATE
4-1 1058:25a2 USB 大容量記憶装置 Not attached
4-2 04bb:011c USB 大容量記憶装置 Not attached
5-3 04d9:1400 USB 入力デバイス Not attached
6-1 0d8a:0103 USB 印刷サポート Not attached
6-3 093a:2510 USB 入力デバイス Not attached
7-2 04f9:02c0 USB 印刷サポート, Brother DCP-J940N, USB 大容量記憶装置 Not attached
8-1 0a12:0001 Generic Bluetooth Radio Not attached
8-2 0d8c:0139 USB PnP Sound Device, USB 入力デバイス Not attached
8-3 046d:0825 Logi C270 HD WebCam Attached - Ubuntu-20.04
8-4 04e6:511a SCR3310-NTTCom USB SmartCard Reader Not attached
おお、通ったようだ ―― では、ここからどうすればいいだっけ?
WSLからlsusbを実行し、接続されているUSBデバイスをリストアップすると、ッデバイスが見えるようになっていました。
ebata@DESKTOP-P6KREM0:/dev$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
ここから先は、
WSL2 USBカメラ+他のUSB機器 2022年09月06日版
を参照。
私の環境でも、
ebata@DESKTOP-P6KREM0:/dev$ ls -l /dev/video
ls: cannot access '/dev/video': No such file or directory
となったので、Linuxカーネルをカスタムビルド に入る準備が整ったのだろう。憂鬱だ。カーネルのビルドと聞くだけで、おぞましい記憶が蘇えってくるから。
と、泣き言をいってもしかたがないので、
https://github.com/PINTO0309/wsl2_linux_kernel_usbcam_enable_conf
に突っ込むこととする。
On WSL2.
ebata@DESKTOP-P6KREM0:~$ uname -r -v
5.15.90.1-microsoft-standard-WSL2 #1 SMP Fri Jan 27 02:56:13 UTC 2023
幸い、ページの内容と同じのようだ。
On Windows Terminal.
PS C:\WINDOWS\system32> wsl --update
更新プログラムを確認しています。
Linux 用 Windows サブシステムの最新バージョンは既にインストールされています。
PS C:\WINDOWS\system32> wsl --shutdown
で、
PS C:\WINDOWS\system32> wsl --install -d Ubuntu-20.04
Ubuntu 20.04 LTS は既にインストールされています。
Ubuntu 20.04 LTS を起動しています...で、
On WSL2ebata@DESKTOP-P6KREM0:/mnt/c/Users/ebata$ uname -r -v
5.15.90.1-microsoft-standard-WSL2 #1 SMP Fri Jan 27 02:56:13 UTC 2023
で、
ebata@DESKTOP-P6KREM0:/mnt/c/Users/ebata$ sudo apt update && sudo apt upgrade -y
[sudo] password for ebata:
Hit:1 http://ppa.launchpad.net/longsleep/golang-backports/ubuntu focal InRelease
(中略)
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
で、
ebata@DESKTOP-P6KREM0:/mnt/c/Users/ebata$ sudo apt install -y build-essential flex bison libgtk-3-dev libelf-dev libncurses-dev autoconf libudev-dev libtool zip unzip v4l-utils libssl-dev python3-pip cmake git iputils-ping net-tools dwarves guvcview python-is-python3 bc
Reading package lists... Done(中略)
Processing triggers for install-info (6.7.0.dfsg.2-5) ...
Processing triggers for desktop-file-utils (0.24-1ubuntu3) ...
で、
ebata@DESKTOP-P6KREM0:/mnt/c/Users/ebata$ cd /usr/src
ebata@DESKTOP-P6KREM0:/usr/src$ TAGVERNUM=5.15.90.1 && TAGVER=linux-msft-wsl-${TAGVERNUM} && WINUSERNAME=ebata
ebata@DESKTOP-P6KREM0:/usr/src$ sudo git clone --depth 1 -b ${TAGVER} https://github.com/microsoft/WSL2-Linux-Kernel.git ${TAGVERNUM}-microsoft-standard && cd ${TAGVERNUM}-microsoft-standard
Cloning into '5.15.90.1-microsoft-standard'...(中略)
Updating files: 100% (73704/73704), done.
で、
ebata@DESKTOP-P6KREM0:/usr/src/5.15.90.1-microsoft-standard$ sudo wget -O .config https://github.com/PINTO0309/wsl2_linux_kernel_usbcam_enable_conf/raw/main/${TAGVER}/config-${WSL_DISTRO_NAME} && sudo chmod 777 .config && sudo make clean
--2023-06-08 23:52:43-- https://github.com/PINTO0309/wsl2_linux_kernel_usbcam_enable_conf/raw/main/linux-msft-wsl-5.15.90.1/config-Ubuntu-20.04
(中略)2023-06-08 23:52:44 (11.3 MB/s) - ‘.config’ saved [123800/123800]
で、ここからが、本格的なカーネルコンパイルのようで、相当時間がかかった。パスワードを1回聞かれました
ebata@DESKTOP-P6KREM0:/usr/src/5.15.90.1-microsoft-standard$ sudo make -j$(nproc) KCONFIG_CONFIG=.config && sudo make modules_install -j$(nproc) && sudo make install -j$(nproc)
SYNC include/config/auto.conf.cmd(中略)
BUILD arch/x86/boot/bzImage
Kernel: arch/x86/boot/bzImage is ready (#1)
[sudo] password for ebata:
arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support(中略)
I: /boot/initrd.img is now a symlink to initrd.img-5.15.90.1-microsoft-standard-WSL2+
で、
ebata@DESKTOP-P6KREM0:/usr/src/5.15.90.1-microsoft-standard$ sudo rm /mnt/c/Users/${WINUSERNAME}/vmlinux
rm: cannot remove '/mnt/c/Users/ebata/vmlinux': No such file or directory
(ここで初めてエラーになった。で、実際に、vmlinuxがなかったので、このままにして次に進んだ)
で
ebata@DESKTOP-P6KREM0:/usr/src/5.15.90.1-microsoft-standard$ sudo cp /usr/src/${TAGVERNUM}-microsoft-standard/vmlinux /mnt/c/Users/${WINUSERNAME}/
で、
ebata@DESKTOP-P6KREM0:/usr/src/5.15.90.1-microsoft-standard$ cat << 'EOT' > /mnt/c/Users/${WINUSERNAME}/.wslconfig
> [wsl2]
> kernel=C:\\Users\\ebata\\vmlinux
> EOT
で、
On Windows Terminal. (新しいターミナルから)
PS C:\WINDOWS\system32> wsl --shutdown
On WSL2。ビルドされたカーネルが正常にロードされた場合、カーネル名の末尾に+が表示されます。#nはカーネルがビルドされた回数です。
ebata@DESKTOP-P6KREM0:/mnt/c/Users/ebata$ uname -r -v
5.15.90.1-microsoft-standard-WSL2+ #1 SMP Thu Jun 8 23:54:50 JST 2023
で、 On WSL2.で
ebata@DESKTOP-P6KREM0:/mnt/c/Users/ebata$ cd /usr/src
ebata@DESKTOP-P6KREM0:/usr/src$ TAGVERNUM=6.1.21.2
ここの6.1.21.2は、
https://github.com/microsoft/WSL2-Linux-Kernel/tags
にあった最新のものを適当に入れた(知らん)。
On WSL2.
ebata@DESKTOP-P6KREM0:/usr/src$ sudo git clone -b ${TAGVER} https://github.com/microsoft/WSL2-Linux-Kernel.git ${TAGVERNUM}-microsoft-standard && cd ${TAGVERNUM}-microsoft-standard
で、これが結構長かった。
で、
ebata@DESKTOP-P6KREM0:/usr/src/6.1.21.2-microsoft-standard$ sudo cp /proc/config.gz config.gz && sudo gunzip config.gz && sudo mv config .config
ebata@DESKTOP-P6KREM0:/usr/src/6.1.21.2-microsoft-standard$ sudo make menuconfig
HOSTCC scripts/basic/fixdep(中略)
HOSTLD scripts/kconfig/mconf
(ここで、GUIが突然登場してビビったが、"save"を選んで、".config"を選んで終了させる)
*** End of the configuration.
*** Execute 'make' to start the build or try 'make help'.
で、On Windows Terminal.で
$ wsl --shutdown
$wsl -d Ubuntu-20.04
で、
PS C:\WINDOWS\system32> usbipd wsl attach --busid 8-3
usbipd: info: Using default WSL distribution 'docker-desktop-data'; specify the '--distribution' option to select a different one.
usbipd: error: The selected WSL distribution is not running; keep a command prompt to the distribution open to leave it running.
とあいもかわらず、このエラーがでるので、
PS C:\WINDOWS\system32> usbipd wsl attach --distribution Ubuntu-20.04 --busid 8-3
で、対処。
で、WSLからどーなったか見てみる。
ebata@DESKTOP-P6KREM0:/mnt/c/Users/ebata$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
ebata@DESKTOP-P6KREM0:/mnt/c/Users/ebata$ ls -l /dev/video*
crw------- 1 root root 81, 0 Jun 9 00:57 /dev/video0
crw------- 1 root root 81, 1 Jun 9 00:57 /dev/video1
あ、ようやくデバイスがきた。この2行の為に、これまでの苦労があった。
で、後は、https://zenn.dev/pinto0309/articles/e1432253d29e30に記載されているpythonのプログラムをそのまま使わせて頂き、カメラから映像がでることを確認しました。
Corrupt JPEG data: 2 extraneous bytes before marker 0xd6
Corrupt JPEG data: 6 extraneous bytes before marker 0xd2
Corrupt JPEG data: 1 extraneous bytes before marker 0xd0
Corrupt JPEG data: 2 extraneous bytes before marker 0xd0
Corrupt JPEG data: 1 extraneous bytes before marker 0xd4
Corrupt JPEG data: 2 extraneous bytes before marker 0xd3
Corrupt JPEG data: 1 extraneous bytes before marker 0xd0
Corrupt JPEG data: 11 extraneous bytes before marker 0xd3
が出てきていますが、気にしません。
ちなみに、画像が出てこなかったので、XWinrcを起動したところ、表示ができたようです。https://dev.classmethod.jp/articles/wsl-x-window/
と、/dev/videoを作るためだけに、何時間かが溶けました。
ところが、
ebata@DESKTOP-P6KREM0:/dev$ gst-launch-1.0 videotestsrc ! v4l2sink device=/dev/video0
Setting pipeline to PAUSED ...
ERROR: Pipeline doesn't want to pause.
ERROR: from element /GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0: Could not open device '/dev/video0' for reading and writing.
Additional debug info:
v4l2_calls.c(621): gst_v4l2_open (): /GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0:
system error: Permission denied
Setting pipeline to NULL ...
Freeing pipeline ...
って、何だ、これ?
で、やっと分かったんですが。
ebata@DESKTOP-P6KREM0:/dev$ ls -la video*
crw------- 1 root root 81, 0 Jun 9 23:35 video0
crw------- 1 root root 81, 1 Jun 9 23:35 video1
となっていて、
オープンするには
root
ユーザvideo
グループに所属
である必要があるらしいのです。
だた、どーしてもGstreamerでは表示できないのですよ
(以下に続く)
WIndows10のWSL Ubuntu-20.04に仮想の/dev/video*を作って、Webカメラ C270n をGstreamer で表示できるようにするまでの軌跡