How do I figure out which /dev is a USB flash drive?

161

51

I want to mount a USB drive, two of them and I need two different mount points. Unfortunately, the Linux kernel underwent a name change and I can't figure out which /dev location is the right one. Is there a way to look through dmesg or /proc or somewhere else to find out which device node is a USB drive.

(I'm using ArchLinux if that helps any.../dev/sda is the first hard drive, /dev/sr0 is a dvd drive, etc.)

edit: The USB drive is connected to a USB hub. I looked through dmesg and it says the hub was connected and it scanned for the 3 devices connected to it. Still can't see where my USB drive is though.

Rudolf Olah

Posted 2008-09-16T03:51:40.293

Reputation: 1 754

1Can't see it? Maybe wait for a bit. Or try another USB port. See what differences there is in 'lsusb' – Nick Devereaux – 2009-03-10T23:02:16.497

Might want to rephrase the question somewhat - not all usb devices are disks, after all. – Arafangion – 2009-03-10T23:23:34.697

3The df command shows you where it was mounted – Will Sheppard – 2013-08-28T14:09:21.850

Answers

83

Easiest way: Look at the output of dmesg after connecting the USB device. It should show you what /dev node was assigned to it.

zigdon

Posted 2008-09-16T03:51:40.293

Reputation: 1 481

2dmesg works great, but I have a case where dmesg does not show the /dev node: [421963.864281] usb 3-6: new high-speed USB device number 32 using xhci_hcd What does this mean? How can I mount this device? The device shows up on lsusb... – modulitos – 2016-04-25T05:58:49.267

1Actually, I figured it out. There was a kernel update since my last reboot that was causing this problem. After a reboot, my usb mounts just fine. Hopefully this helps someone! – modulitos – 2016-04-25T06:39:34.860

55

As long as you are running udev, you can do this easily by referencing /dev/disk/by-id/usb-manufacturername_serialnumber. These appear as symbolic links which you can either directly reference within your fstab, or which you can dereference using readlink -e to determine the associated block device.

Here's a real world example. On my machine, I have 3 USB hard drives connected. These each show up in /dev/disk/by-id with unique serial numbers (although they share a common manufacturer string). I have created symbolic links to each of these three unique entries, and can now quickly determine which drive is which (and which device is associated with each drive) by running readlink -e linkname. For example, running readlink -e /root/disk2 on my machine currently displays "/dev/sde", while readlink -e /root/disk3 produces no output whatsoever.

stormlash

Posted 2008-09-16T03:51:40.293

Reputation:

15Short and simply: for devlink in /dev/disk/by-id/usb*; do readlink -f ${devlink}; done – Felipe Alcacibar – 2015-11-25T14:02:35.190

54

All of these are good suggestions, but the quickest and least verbose method is to just type the following in the terminal:

mount

which will give a list of all the mounted devices (this assumes the USB drive is mounted, which is usually the case with modern Linux distros).

AnotherLongUsername

Posted 2008-09-16T03:51:40.293

Reputation: 665

5No, it doesn't magically mount your device. You have to specify it with mount /dev/id /mount/point, so that doesn't work. – polym – 2014-07-22T14:02:50.363

10My answer addresses the user's question 'Is there a way to look through dmesg or /proc or somewhere else to find out which device node is a USB drive.', and is not intended to provide guidance on the practicality of mounting a drive under Linux. – AnotherLongUsername – 2014-07-23T14:43:12.200

This answer solved an almost identical question for me. – Matthew Brown aka Lord Matt – 2014-10-10T11:04:52.160

1I think automount behavior depends alot on the distro type. – jiggunjer – 2016-02-02T02:08:18.997

1df too, i suppose. – Alexey – 2016-05-26T16:11:18.963

25

Try the command udevinfo -q all -n /dev/sda, where /dev/sda is the path to your disk. This gives you a boatload of info about the disk you're looking at - there's an entry that tells you about the bus it's connected to.

This of course saves you from having to grep through dmesg and/or logs.

Update

udevadm info --query=all -n /dev/sda 

From at least Jul 2010 [1] udevinfo was substituted in Debian (and derived) by udevadm info with a little transient with which there were symlinks soon deprecated and removed (you can still found them in old not updated machine). Always from [1] we can read:

In udev 117, udevadm was introduced and udevinfo and other programs turned into compatibility symlinks. The symlinks were deprecated in udev 128 and removed for good in udev 147.

Eltariel

Posted 2008-09-16T03:51:40.293

Reputation: 397

8In Debian, udevinfo is renamed udevadm. – Steve Pomeroy – 2011-08-23T14:44:12.657

8On Ubuntu, the command seems to be "udevadm info --query=all -n /dev/sda" – machineghost – 2011-12-13T06:06:32.870

I suppose they renamed the command at some point - when I wrote the answer (ages ago) the command worked on the ubuntu system that I posted it from ;) – Eltariel – 2011-12-15T05:08:22.043

Command works still in ubuntu, udevadm info --query=all -n /dev/ttyUSB1 – Siddharth – 2013-06-04T08:43:53.993

1udevadm info --query=all -n /dev/ttyUSB in Fedora too. – slm – 2013-10-26T14:50:13.720

23

the simplest method to see what's going on is just typing (as root of course):

blkid -c /dev/null

this gives you a complete overview about all block devices even if not mounted

toh

Posted 2008-09-16T03:51:40.293

Reputation: 427

Not all distro have this. Which were you using? – New Alexandria – 2015-09-19T17:26:31.917

This outputs nothing on my Raspbian distro. – IgorGanapolsky – 2016-08-08T06:17:08.550

Command not found: blkid – IgorGanapolsky – 2016-09-28T17:13:30.167

No output from this command on Ubuntu 14.04 64-bit. – gbmhunter – 2017-04-17T18:15:11.657

11

/dev/disk/by-* is the easiest way in this case, if for some reason you want to make life more interesting you can use HAL.

To list all devices you use:

hal-device

To get a specific property you use (this will return /dev/sd* on a USB storage device):

hal-get-property --udi $UDI --key block.device

There is also:

hal-find-by-capability
hal-find-by-property

If you want to make it even more complicated you can relatively easy write yourself a HAL based auto mounter, which can be quite handy if you want to automate things completly.

And just for completeness there are also:

lsusb -v
lshw

Which provides some general information about USB and your hardware in general.

Grumbel

Posted 2008-09-16T03:51:40.293

Reputation: 3 100

2/dev/disk/by-id/usb is very helpful. – Rob – 2011-12-12T18:56:28.930

/dev/disk/by-label ftw. Thanks :) – Triptych – 2013-06-17T13:25:09.663

10

sudo fdisk -l

And just analyse the result.

Felipe

Posted 2008-09-16T03:51:40.293

Reputation: 921

1fdisk man page "If no devices are given, those mentioned in /proc/partitions (if that exists) are used." Running fdisk may not be an option... Based on one Debian system that I know doesn't have it installed, my guess is that some GPT systems might not install the unneeded software. Still, checking /proc/partitions ought to be an option. – TOOGAM – 2015-11-10T07:33:35.763

This was the only option that worked fine for me. I am sorry if it didn't work for you! – Felipe – 2015-11-10T21:52:57.470

8

Use

ls -l /dev/disk/by-id/usb*

Under the default udev rules, that will show you most usb devices and it will show you the symlink to their block-device name on the system.

If that doesn't work, look at /dev/disk/by-id/ directly.

DJ Capelis

Posted 2008-09-16T03:51:40.293

Reputation: 181

7

For USB devices you can simply do

REMOVABLE_DRIVES=""
for _device in /sys/block/*/device; do
    if echo $(readlink -f "$_device")|egrep -q "usb"; then
        _disk=$(echo "$_device" | cut -f4 -d/)
        REMOVABLE_DRIVES="$REMOVABLE_DRIVES $_disk"
    fi
done
echo Removable drives found: "$REMOVABLE_DRIVES"

lemsx1

Posted 2008-09-16T03:51:40.293

Reputation: 79

1+1. Simple and concise script to do the task automatically. – leesei – 2015-11-18T14:28:07.303

2

Take a look at the tree under /dev/disk. It lists disks and their partitions (file systems) by various schemes.

Ted Percival

Posted 2008-09-16T03:51:40.293

Reputation: 229

2

/var/log/message if dmesg no longer has the information.

Allan Wind

Posted 2008-09-16T03:51:40.293

Reputation:

0

Based on the excellent answer from stormlash and with a dependency on udev to populate the "/dev/disk/by-id/usb" device tree, you could define a predicate (Bash) as follows:

is_usb_device() {
    local device_path=$1        # such as /dev/sdc
    for devlink in /dev/disk/by-id/usb*; do
        if [ "$(readlink -f "$devlink")" = "$device_path" ]; then
            return 0
        fi
    done
    return 1
}

And then use it:

if is_usb_device "/dev/sdg"; then
    echo "/dev/sdg is a usb device"
else
    echo "/dev/sdg is not a usb device"
fi

user30747

Posted 2008-09-16T03:51:40.293

Reputation: 280

0

If you unplug the USB drive and plug it back in, you should see it initialize from the kernel (dmesg)

Howler

Posted 2008-09-16T03:51:40.293

Reputation: 137