如何在 Docker 容器中使用 lsusb 获取 USB 设备描述?

如何在 Docker 容器中使用 lsusb 获取 USB 设备描述?

在 Docker 容器中:

docker run --rm -it --privileged debian bash
root@fe612fde137f:/# apt-get update && apt-get install -y usbutils && lsusb
... snip ...
Bus 001 Device 001: ID 1d6b:0002  
Bus 002 Device 012: ID 1a86:5512  
Bus 002 Device 003: ID 0e0f:0002  
Bus 002 Device 002: ID 0e0f:0003  
Bus 002 Device 001: ID 1d6b:0001  
root@fe612fde137f:/# 

在主机上:

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 012: ID 1a86:5512 QinHeng Electronics CH341 in EPP/MEM/I2C mode, EPP/I2C adapter
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
$

知道如何从 Docker 容器内部获取 USB 设备描述吗?


解决方案:usb.ids存在,但不存在hwdb.bin(硬件数据库)。

docker run --rm -it --privileged debian bash
root@fe612fde137f:/# apt-get update && apt-get install -y usbutils && find / -type f \( -name "usb.ids" -o -name "hwdb.bin" \)
/var/lib/usbutils/usb.ids
root@fe612fde137f:/# 

这说明udev没有安装。要修复,apt install udev在 debian 上。

答案1

存在于容器内/usr/share/usb.ids(和/或[/usr]/lib/udev/hwdb.bin如果您的发行版具有)。

如果您的容器运行良好,否则似乎您只需要这些文件lsusb。虽然添加udev要包含到容器构建过程中的包是可能的,但在这种情况下可能有点矫枉过正。

hwdb.bin文件是由命令动态创建的,从文件systemd-hwdb update中获取信息。为了使容器尽可能轻量,您可能需要创建容器外部(或使用容器构建器主机中的文件)并将最终产品注入实际容器中。/lib/udev/hwdb.d/*.hwdb/etc/udev/hwdb.d/*.hwdbhwdb.binhwdb.bin

我跑lsusb过去strace找出它试图hwdb.bin从中查找文件的所有位置:

openat(AT_FDCWD, "/etc/systemd/hwdb/hwdb.bin", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/udev/hwdb.bin", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/systemd/hwdb/hwdb.bin", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/systemd/hwdb/hwdb.bin", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/udev/hwdb.bin", O_RDONLY|O_CLOEXEC) = 3

在容器内,您可以将hwdb.bin文件放入对您最有意义的位置。

相关内容