Tiktac
Tiktac

Reputation: 1058

Determine USB device file Path

How can i get USB device file path correctly in Linux. I used command: find / -iname "usb" and got the result as below:

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

Under /dev/bus/usb i see:

001  002  003  004  005  006

But I think they aren't files as i need.

Under /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

And Under /sys/bus/scsi/devices/ when i pluged an USB i see:

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

And when i removed USB i see:

sh-3.2# ls
host0

So which device file is used for USB? How can i indentify it? I need to make a C program with USB device file...

Further more, could you explain to me the number 1-1:1.0? What does it mean?

Thank you.

Upvotes: 20

Views: 51038

Answers (4)

Martijn
Martijn

Reputation: 858

I know this is an old question that has been answered a long time ago, but I keep stumbling upon it when looking for the command below. It might not be what OP asked for, but its possible that I'm not the only one who gets directed to this page when looking for this:

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

As a Linux noob this is the only command I could find that gives me a list of serial devices with device names and paths.

Upvotes: 1

omidh2007
omidh2007

Reputation: 51

The code in Python3 below worked for me on 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.")

Upvotes: 1

alchemy
alchemy

Reputation: 982

Use ls /sys/bus/usb/devices/2* and cat /sys/bus/usb/devices/2*/manufacturer and progressively add numbers to the 2* part.. like 2-3:*, 2-3:2.* until you can match the name from lsusb, or use idProduct or idVendor instead of manufacturer.

Upvotes: 0

Federico
Federico

Reputation: 3892

So which device file is used for USB? How can i indentify it?

What you see behind /sys/ is mainly configuration/information about devices. /dev/bus/usb is what you are looking for. I think that the following article can help you

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

Is quite old, but still it can help you. (In the article they speak about /proc/bus/usb, today we have /dev/bus/usb)

Further more, could you explain to me the number 1-1:1.0? What does it mean?

The generic form is

X-Y.Z:A.B

Each field identify the connection point of your device. The first two field are mandatory:

  • X is the USB bus of your motherboard where is connected the USB system.
  • Y is the port in use on the bus system

So the USB device identified with the string 3-3 is the device connected on the port 3 of the bus 3.

If you connect an USB hub, you are extending the connection capability of a single USB port. The Linux kernel identify this situation by appending the Z field.

  • Z is the port is use on an hub

So, the USB device identified with the string 1-2.5 is the device connected on the port 5 of the hub connected on the port 2 of the bus 1.

USB specification allow you to connect in cascade more then one USB hub, so the Linux kernel continue to append the port in use on the different hubs. So, the USB device identified with the string 1-2.1.1 is the device connected on the port 1 of the hub connected on the port 1 of the hub connected to the port 2 of the bus 1.

A fast way to retrieve these information is to read the kernel messages (if you can).

$ 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 ...]

Then, the last two fields of the pattern (after colon) identify an internal section of an USB device :

  • A is the configuration number of the device
  • B is the interface number of a configuration

So, the string 4-1:1.1 means: the interface 1, on configuration 1 that is connected on the port 1 of the bus 4.

You can retrieve these information with the command lsusb.

Upvotes: 35

Related Questions