确定USB设备文件路径

问题描述 投票:0回答:4

如何在 Linux 中正确获取 USB 设备文件路径。 我使用命令:find / -iname "usb" 并得到如下结果:

/dev/bus/usb
/sys/bus/usb
/sys/bus/usb/drivers/usb
/sys/kernel/debug/usb

在 /dev/bus/usb 下我看到:

001  002  003  004  005  006

但我认为它们不是我需要的文件。

在/sys/bus/usb/devices/下:

sh-3.2# ls /sys/bus/usb/devices/
1-0:1.0  1-1:1.0  3-0:1.0  5-0:1.0  usb1     usb3     usb5
1-1      2-0:1.0  4-0:1.0  6-0:1.0  usb2     usb4     usb6

在 /sys/bus/scsi/devices/ 下,当我插入 USB 时,我看到:

2:0:0:0      host0        host2        target2:0:0

当我移除 USB 时,我看到:

sh-3.2# ls
host0

那么USB使用的是哪个设备文件呢?我怎样才能识别它?我需要用 USB 设备文件制作一个 C 程序...

另外,你能给我解释一下数字1-1:1.0吗?是什么意思?

谢谢你。

linux linux-kernel usb libusb
4个回答
32
投票

那么USB使用的是哪个设备文件呢?怎么辨别呢?

/sys/
后面看到的主要是设备的配置/信息。
/dev/bus/usb
就是您正在寻找的。我想下面的文章可以帮助到你

http://www.linuxjournal.com/article/7466?page=0,0

虽然很老了,但仍然可以帮助你。 (在文章中他们谈到

/proc/bus/usb
,今天我们有
/dev/bus/usb

另外,你能给我解释一下数字1-1:1.0吗?是什么意思?

通用形式是

X-Y.Z:A.B

每个字段都标识您设备的连接点。前两个字段是必填字段:

  • X 是主板的 USB 总线,连接 USB 系统。
  • Y 是总线系统上正在使用的端口

因此,用字符串

3-3
标识的 USB 设备是连接在总线 3 的端口 3 上的设备。

如果连接 USB 集线器,则可以扩展单个 USB 端口的连接能力。 Linux 内核通过附加 Z 字段来识别这种情况。

  • Z 是集线器上使用的端口

因此,用字符串

1-2.5
标识的 USB 设备是连接到总线 1 的端口 2 上的集线器端口 5 上的设备。

USB 规范允许您级联连接多个 USB 集线器,因此 Linux 内核会继续附加不同集线器上正在使用的端口。因此,用字符串

1-2.1.1
标识的 USB 设备是连接在集线器端口 1 上的设备,连接在连接到总线 1 端口 2 的集线器端口 1 上。

检索这些信息的快速方法是读取内核消息(如果可以的话)。

$ dmesg | grep usb
[... snip ...]
[ 2.047950] usb 4-1: new full-speed USB device number 2 using ohci_hcd
[ 2.202628] usb 4-1: New USB device found, idVendor=046d, idProduct=c318
[ 2.202638] usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 2.202643] usb 4-1: Product: Logitech Illuminated Keyboard
[ 2.202648] usb 4-1: Manufacturer: Logitech
[... snip ...]

然后,模式的最后两个字段(冒号之后)标识 USB 设备的内部部分:

  • A为设备的配置号
  • B 是配置的接口号

因此,字符串

4-1:1.1
表示:配置 1 上的接口 1,连接到总线 4 的端口 1。

您可以使用命令

lsusb
检索这些信息。


0
投票

我知道这是一个很久以前就已经回答过的老问题了,但是在寻找下面的命令时我总是偶然发现它。这可能不是OP所要求的,但我可能不是唯一在寻找此页面时被定向到此页面的人:

ls -l /dev/serial/by-id/

我是一名 Linux 菜鸟,找不到任何其他命令可以为我提供带有设备名称和路径的串行设备列表(例如

/dev/ttyUSB0
)。例如
dmesg | grep usb
没有给我我需要的路径。


0
投票

使用

ls /sys/bus/usb/devices/2*
cat /sys/bus/usb/devices/2*/manufacturer
并逐渐向
2*
部分添加数字.. 如
2-3:*
2-3:2.*
,直到您可以匹配
lsusb
中的名称,或使用
idProduct
idVendor
代替
manufacturer


0
投票

下面的 Python3 代码在 Ubuntu 22.04 上对我有用:


import os
import glob

def get_last_inserted_usb():

    # Directory containing symlinks to USB devices
    disk_by_id_path = '/dev/disk/by-id'

    # Find all USB device symlinks
    usb_devices = glob.glob(os.path.join(disk_by_id_path, 'usb-*'))

    if not usb_devices:
        return None

    # Create a list to hold device details
    devices = []

    for usb_device in usb_devices:
        # Resolve the symlink to the actual device node path
        device_node = os.path.realpath(usb_device)

        # Get the symlink creation time
        dev_stat = os.stat(usb_device)
        dev_time = dev_stat.st_ctime

        devices.append((device_node, dev_time))

    # Sort devices by time (most recent first)
    devices.sort(key=lambda x: x[1], reverse=True)

    # Return the most recently added device node path
    if devices:
        return devices[0][0]
    else:
        return None


if __name__ == "__main__":
    last_usb_device = get_last_inserted_usb()
    if last_usb_device:
        print(f"Device node path of the last inserted USB drive: {last_usb_device}")
    else:
        print("No USB devices found.")

© www.soinside.com 2019 - 2024. All rights reserved.