Debian

如何在 Docker 容器中使用 lsusb 來獲取 USB 設備描述?

  • November 24, 2020

在 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 上。

/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文件放入對您最有意義的任何位置。

引用自:https://unix.stackexchange.com/questions/621265