在 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/*.hwdb
hwdb.bin
hwdb.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
文件放入对您最有意义的位置。