我正在尝试让 USB 网络摄像头与 Ubuntu 配合使用。当我插入网络摄像头时,我短暂地看到网络摄像头上亮起蓝灯。
lsusb
显示以下内容:
Bus 002 Device 063: ID 045e:0723 Microsoft Corp. LifeCam VX-7000 (UVC-compliant)
dmesg
显示以下内容:
[2723272.317364] usb 2-1.2: new high-speed USB device number 63 using ehci-pci
[2723272.453639] usb 2-1.2: New USB device found, idVendor=045e, idProduct=0723, bcdDevice= 1.00
[2723272.453647] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[2723272.453651] usb 2-1.2: Product: Microsoft® LifeCam VX-7000
[2723272.453655] usb 2-1.2: Manufacturer: Microsoft
[2723272.455421] uvcvideo: Found UVC 1.00 device Microsoft® LifeCam VX-7000 (045e:0723)
[2723272.459065] uvcvideo: UVC non compliance - GET_DEF(PROBE) not supported. Enabling workaround.
[2723272.459442] uvcvideo: Failed to query (129) UVC probe control : -32 (exp. 26).
[2723272.459450] uvcvideo: Failed to initialize the device (-5).
我看不到目录/dev/video*
,并且没有相机应用程序可以运行(Cheese、guvcview、VLC、Facebook Messenger)。
v4l2-ctl --list-devices
返回以下内容:
Cannot open device /dev/video0, exiting.
对于下一步该尝试什么有什么想法吗?
答案1
首先,我要说的是,我对 Linux 一窍不通。我正在学习,多亏了 WSL2,学习起来容易一些。话虽如此,以下步骤在您阅读时可能正确,也可能不正确。我在 Windows 10 WSL2 系统上安装了同样的摄像头和 Linux 发行版。我无法让这个摄像头工作,因为虽然计算机可以看到它,Linux 发行版也可以看到它,但我的发行版中没有安装正确的驱动程序。我从来没有得到过/dev/video0设备,但我可以在所有正常的 Linux 设备位置看到该设备。我用来修复此问题的两个来源是:
- https://github.com/dorssel/usbipd-win/wiki/WSL-support#building-your-own-usbip-enabled-wsl-2-kernel
- https://zenn.dev/pinto0309/articles/0723ae46501beb
- https://zenn.dev/pinto0309/articles/c3014043502245
在继续之前,请确保您已在 Windows 10 操作系统上安装了以下应用程序:
以下是我所采用的步骤,结合了上述来源:
- 通过运行 确保 WSL 完全是最新的
wsl --update
。如果有任何可用更新并已安装,请确保在wsl --shutdown
继续之前使用 关闭 WSL。 - 如果您已经设置了 WSL 发行版,请运行
wsl --list --verbose
以查看它们的列表及其状态。 - 如果你已经有了想要使用的 WSL 发行版,请执行以下命令来备份当前内核,其中当前发行版是你想要使用的 Linux 发行版(WSL 的默认发行版是 Ubuntu,在上一步中找到),临时路径是保存 TAR 备份的位置,以及 TAR 的名称(显示默认名称),
wsl --export <current-distro> <temporary-path>\wsl2-usbip.tar
- 现在导入相同的 TAR 文件作为新内核的基础,
wsl --import wsl2-usbip <install-path> <temporary-path>\wsl2-usbip.tar
其中安装路径是您希望保存新发行版的位置,临时路径是您刚刚创建的位置和 TAR。 - 通过运行来运行新导入的发行版
wsl --distribution wsl2-usbip --user <user>
,其中用户是您想要用于此发行版的用户名(您不会长时间使用此发行版,不用担心) - 当你的新 WSL2 发行版启动并运行后,你可能需要重新启动之前使用的命令或终端窗口。Windows 终端是一个很好的例子,说明您需要在导入步骤之后执行此操作。
- 重新启动控制台或终端后,按顺序执行以下步骤,并确保在新的 wsl2-usbip 发行版中执行它们:
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential flex bison libgtk2.0-dev libelf-dev libncurses-dev autoconf libudev-dev libtool zip unzip v4l-utils libssl-dev python3-pip cmake git iputils-ping net-tools -y
sudo apt install dwarves -y
这将安装完成内核构建所需的所有依赖项。矮人被添加作为对此处指出的潜在问题的答案StackOverflow 问题。这对您来说可能是可选的。
现在,从现在开始,您需要更加注意发出的命令,因为许多命令都需要您提供特定于发行版和设备组件的参数。以下步骤均在 Linux 发行版中完成。
- 运行
uname -r
以获取当前内核。在撰写本文时,我正在使用5.10.102.1-微软-标准-WSL2所以我会在命令中使用它。你需要知道这一点,所以请准备好它。 - 您最终可能会收到一条警告,提示您需要其他工具才能完成以下过程。如果是这样,请执行 usbipd-win WSL 设置部分顶部的 linux-tool 和 update-alternatives 步骤:
sudo apt install linux-tools-virtual hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*/usbip 20
- 在您的新发行版中,发出以下命令,
git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
- 其次是,
cd WSL2-Linux-Kernel
- 最后,
git checkout <current-kernel>
- 完成后,运行
cp /proc/config.gz config.gz
复制配置。 - 下一个,
gunzip config.gz
- 最后,运行
mv config .config
下一步将重点介绍内核的配置菜单。配置菜单非常难导航,因为有很多项目,有些是嵌套的,而且没有按字母顺序排列。我会尝试引导您找到某个项目的位置。我知道有一个搜索选项,但我无法让它工作。
- 所有菜单选项均使用上下箭头键浏览列表
- 左右箭头可更改底行选择
- 空格键进行选择。
< Exit >
并不意味着退出整个配置,除非您位于内核配置主页上。退出二级菜单将使您返回上一级。- 任何带有 的选择都
--->
代表二级菜单选项。 - 如果
--->
前面有一个选择框 ([ ]
),则该项目的二级菜单将不会出现,直到您选择该项目。
- 在你的发行版中,仍在 WSL2-Linux-Kernel 文件夹中,输入
sudo make menuconfig
- 选择
Device Drivers --->
靠近底部的位置。 - 选择
[*] USB support
并进入其二级菜单。 - 向下滚动
USB Physical Layer drivers
并进入其二级菜单。 - 选择
< > NOP USB Transceiver Driver
-><M> NOP USB Transceiver Driver
- 返回
Device Drivers --->
菜单,您将能够通过配置窗口顶部的蓝色标题知道您已退出。 - 向下滚动并选择
[ ] Multimedia support
->[M] Multimedia support
并进入其二级菜单。 - 选择
[ ] Media USB Adapters
->[*] Media USB Adapters
,进入其二级菜单。 - 选择
< > USB Video Class (UVC)
-><M> USB Video Class (UVC)
并进入其二级菜单(如果我没记错的话)。 - 选择
[*] UVC input events device support
- 使用右箭头键将底部选择移动到
< Save >
按钮并将其保留为.配置
如果你还想在内核中启用其他项目,请立即启用。我尝试了此页的第 4-4 节,但注意到许多条目已经内置。因此这些文章被弃用。但它们填补了此过程中的一些缺失空白,至少对于此网络摄像头而言,我希望这可以节省您和其他人的时间。我们现在快完成了。
通过选择退出配置文件直到< Exit >
返回到您的发行版。
- 输入
getconf _NPROCESSORS_ONLN
即可打印出可用的核心数。 - 输入以下行,将
#
上一步中的 3 替换为处理器的数量:sudo make -j # && sudo make modules_install -j # && sudo make install -j #
- 现在去做个三明治或者看场节目吧,因为这可能需要一段时间(前提是它不会失败)。
- “make” 过程完成后,我们仍然需要从菜单中运行以下命令
WSL2-Linux-Kernel
,#
字符应该替换为步骤 1 中的数字:
cd tools/usb/usbip
sudo ./autogen.sh
sudo ./configure
sudo make install -j #
运行以下命令复制工具,
sudo cp libsrc/.libs/libusbip.so.0 /lib/libusbip.so.0
sudo apt-get install hwdata
如果还没有安装usb.ids,请安装它。将图像复制到我们的 Windows 机器上的一个位置,
cp arch/x86/boot/bzImage /mnt/c/Users/<user>/usbip-bzImage
确保<user>
用 Windows 10 配置文件的根目录替换(必须保存在那里但不记得为什么)。最后,在与新内核相同的目录中创建一个名为
.wslconfig
or 的新文件wsl.config
并编辑它在里面添加以下内容,
<user>
再次替换为您的 Windows 用户名。所有斜线都应为双斜线。[wsl2]
kernel=c:\\users\\<user>\\usbip-bzImage
只要配置和内核都位于您的配置文件文件夹的根目录中,您的发行版就应该使用该内核而不是原始内核来启动。
要确认它是否正常工作,请uname -r
从发行版内部再次运行。现在您应该会看到+
内核末尾添加了一个。您可能会注意到您的计算机有点迟缓。这是由于 make 进程将内容存储在系统内存中。您可能会看到进程 vmmem 以接近 5GB 的速度运行。要解决此问题,请重新启动终端窗口或重新启动计算机。
我希望这对你有用。请原谅我对答案过程、Linux 过程或英语过程的任何无知。我在搜索这个问题时发现了这一点,我希望这个答案虽然迟了,但可以帮助某人继续前进。