Reputation: 1058
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
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
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
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
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:
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.
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 :
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