USB devices provide expandable functionality for modern computers. Linux users frequently utilize peripherals like storage drives, webcams, controllers, printers and more via USB ports. But effective usage requires identifying attached USB devices. This comprehensive guide will delve into the various methods for listing USB devices in Linux.
I‘ll cover listing basics like lsusb and the Linux sysfs pseudo file system. Then explore advanced troubleshooting, security implications, automated handling of USB devices and more. Even experienced Linux users should find helpful tips and command options here for managing peripherals via Universal Serial Bus connections.
A Brief History of USB
Understanding how Linux interacts with USB requires some background on the USB standard itself.
The Universal Serial Bus protocol was created in the mid 1990s to provide plug-and-play ports for connecting devices externally to computers. This succeeded earlier RS-232 serial ports and parallel ports which required opening the computer case for internal peripheral attachments.
The original USB 1.0 standard in 1996 operated at just 1.5Mbit/s. This enabled low bandwidth devices like keyboards, mice and printers. USB 1.1 followed in 1998, still at just 12Mbit/s speeds.
So early USB devices used simplistic control transfer methods. But in 2000 the much faster USB 2.0 specification arrived. With rates up to 480Mbit/s, this enabled more complex peripherals requiring high data throughput.
USB usage greatly expanded in the 2000s with USB flash drive usage becoming ubiquitous by 2005. Digital cameras also switched from legacy interfaces to USB connections. And the 2007 USB 3.0 update pushed speeds to 5Gbit/s as HDDs transitioned from Firewire and eSATA to USB interfaces.
USB Version | Max Speed | Year Released |
---|---|---|
USB 1.0 | 1.5 Mbit/s | 1996 |
USB 1.1 | 12 Mbit/s | 1998 |
USB 2.0 | 480 Mbit/s | 2000 |
USB 3.0 | 5 Gbit/s | 2007 |
USB 3.1 | 10 Gbit/s | 2013 |
USB 3.2 | 20 Gbit/s | 2017 |
USB4 | 40 Gbit/s | 2019 |
The latest USB 3.2 specification in 2017 ushered speeds up to 20Gbit/s. And USB4 in 2019 further increased throughput to 40Gbit/s. This evolution has led towards convergence with the Thunderbolt interface.
As USB speeds and device usage grew over decades, Linux kernel support increased too. Modern Linux has advanced handling for USB stability, security and an array of peripherals. Next we‘ll explore interacting with connected USB devices.
Listing USB Devices via lsusb
The most common command for listing USB devices on Linux is lsusb. This works on essentially all distros since the usbutils package provides it.
Simply executing lsusb queries your Linux system for USB hosts, displays attached USB devices, and prints device details including:
- Bus number
- Device number
- Vendor/product ID
- Manufacturer name
- Device name/description
For example:
$ lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 005: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 003 Device 004: ID 058f:9540 Alcor Micro Corp. AU9540 Smartcard Reader
Bus 003 Device 003: ID 04f2:b593 Chicony Electronics Co., Ltd
Bus 003 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Here we see the root USB hubs, an optical mouse, a smart card reader, webcam, and USB hub attached. Useful for identifying USB devices and gathering details.
You can also use:
lsusb -v
for expanded verbose device descriptorslsusb -s [[bus]:[dev]]
to query a single specific devicelsusb -d [vendor]:[device]
querying by vendor/product ID
So lsusb is your starting point for listing USB devices on a Linux system. But device names may remain vague. And more advanced questions around handling USB devices persist. Read on!
View USB Device Details via Sysfs in Linux
The Linux sysfs virtual filesystem exposes a structured hierarchy of attributes for kernel objects. USB devices accordingly appear under:
/sys/bus/usb/devices/
Here you‘ll find numbered directories representing each connected USB device. Within them lie attributes with extensive device details you can freely access.
For example, listing files for my USB hub at /sys/bus/usb/devices/3-2
reveals:
$ ls /sys/bus/usb/devices/3-2
authorized avoid_reset_quirk bcdDevice bConfigurationValue bmAttributes bMaxPacketSize0 busnum configuration devnum devpath idProduct idVendor ltm_capable manufacturer maxchild product removable remove serial speed subsystem version
Viewing manufacturer
here would show "GenesysLogic". And product
contains the device name: "USB2.0 4-Port HUB".
So whenever lsusb lacks sufficient device details, poke around in sysfs. The attributes there expose the full data known to the Linux kernel concerning connected USB peripherals.
Note unprivileged users normally cannot access serial numbers. And USB device names may change on reconnect without consistent device symlinks. But overall sysfs answers many USB device questions.
Handling USB Storage Devices
USB flash drives and external hard drives connected over USB often mount automatically on Linux. But viewing removable storage devices and configuring automounting still proves useful.
Finding USB Storage via lsblk
The lsblk command lists information on block devices. This covers locally attached storage volumes – including those connected via USB.
For example, after inserting my 16GB USB flash drive, lsblk prints:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.8T 0 disk
|-sda1 8:1 0 512M 0 part /boot/efi
|-sda2 8:2 0 138.7G 0 part /
`-sda3 8:3 0 1.7T 0 part
`-crypt1 254:0 0 1.7T 0 crypt
`-data0 254:1 0 1.7T 0 lvm /home
sdb 8:32 1 14.9G 0 disk
|-sdb1 8:33 1 14.9G 0 part
We see the internal sda drive, partitions, and LVM logical volume for /home. Plus the newly attached USB flash drive sdb with a 14.9GB partition on it.
Using the -m
argument for lsblk also prints filesystem info:
$ lsblk -m
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda
|-sda1 vfat 2B85-8C37 510M 0% /boot/efi
|-sda2 ext4 143af066-c9e9-4600-9536-57149eb9667c 55.4G 42% /
`-sda3
`-crypt1 crypto_LUKS 773b8ef4-a172-489b-a880-3f5fa9dda2ba
`-data0 LVM2_member H3MJnc-FRof-eyCO-B4Gg-8YJN-UZ1C-x33Jwk
`-home ext4 3b1024ec-968b-4297-ba0b-61330dd2c1a5 1.4T 86% /home
sdb
|-sdb1 vfat FIREFLY FIREFLY_20160820 14.9G 0%
Now the filesystem type and mountpoint are shown. This verifies sdb1 as an unmounted vfat partitioned flash drive attached via USB.
So lsblk combined with fdisk, blkid, findmnt and the /proc/partitions file covers most scenarios involving USB storage devices.
USB Storage Configuration Tricks
Simple usage of USB storage works automatically as we‘ve verified. But more advanced setup options exist as well:
- The usbmount package automounts inserted USB drives
- Udev rules initiate custom scripts reacting to new storage devices
- autofs automounts on first access instead of insertion
- inotify-tools watches directories like /dev for USB drive addition
For example, you can create Udev rules to automatically mount sanctioned flash drives under /mnt/external_disks. And unmount them on removal.
Matching Linux groups for ownership enables smooth sharing of approved USB storage volumes. This avoids exposures which we consider next.
USB Security, Privacy and Access Control
The physical nature of USB gadget connections raises security issues. External devices by definition originate outside your system, with arbitrary internal capabilities once attached.
Malware like the notorious Stuxnet worm relied on infected flash drives to traverse air-gapped networks. And hardware key-loggers or "USB dead drops" can exfiltrate data without network traces.
So consider threat models carefully with USB devices. Ensure you safely wipe and check removable media when moving across trust boundaries.
And limit USB usage appropriately in restricted systems. For example ChromeOS by defaults only allows input devices over USB to mitigate risks.
If your Linux desktops support USB drives, best practices still apply:
- Mount USB storage read-only initially
- Scan new volumes for malware automatically
- Restrict autoplay or autoexecution of content
- Enforce permissions limiting data leakage potential
Checking dmesg
output on device insertion can uncover USB issues too. And monitoring authorization requests under /sys/bus/usb
reveals usage attempts.
For example:
cat /sys/bus/usb/devices/1-1.4/authorized
Shows whether a USB device currently has authorized access to the system. This attribute flips from 0 to 1 when a user approves new USB devices via the desktop notification prompt in GNOME/KDE etc.
So while USB offers useful expansion functionality, keep in mind the security angle.
Advanced Access Control with Udev Rules
We‘ve covered the basics of viewing USB device status in Linux. Now let‘s take a deeper look at dynamically managing access through udev event handlers.
Udev is the device manager for the Linux kernel, handling hotplug events as hardware like USB devices attach and detach. Upon changes seen, udev can invoke custom rules triggering scripts to handle those events.
This enables advanced USB device access control. For example, creating meticulous rules matching on USB peripheral attributes.
Here is a simple udev script to invoke on any new USB storage insertion:
/etc/udev/rules.d/10-local-usbstorage.rules
ACTION=="add", ENV{ID_USB_DRIVER}=="usb-storage", TAG+="systemd", ENV{SYSTEMD_WANTS}="mount-usb-storage@.service"
This runtime directive will run the systemd service unit "mount-usb-storage@.service" – passing the device node being added.
We can leverage this to check devices before auto-mounting them read/write. For example:
/etc/systemd/system/mount-usb-storage@.service
[Unit]
Description=Mount USB external storage device
Before=local-fs.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/mount-usb-storage %I
ExecStop=/usr/bin/umount %I
[Install]
WantedBy=local-fs.target
Then provide a script to safely mount approved devices, scanned and owned appropriately:
/usr/bin/mount-usb-storage
#!/bin/bash
dev=$1
usb_device=/sys$(udevadm info -q path --name=${dev##*/})
# Check device attributes to confirm policy compliance
uid="$(get-usb-id "$usb_device")"
if ! is_approved "$uid"; then
logger "Blocking unauthorized USB device $dev: $uid"
exit 0
fi
# Scan for malware before mounting
fs_type=$(blkid -o udev ${dev} | grep -v TYPE= | cut -d"=" -f2)
clamdscan ${dev} # ClamAV daemon example
# Mount device read-only initially
mount -o ro ${dev} /mnt/external_drives/
# Notify admins and request user authorization
notify-usb-request "$uid"
# Remount read-write if approved
if user_accepted "$uid"; then
mount -o remount,rw ${dev} /mnt/external_drives/
fi
This shows the extensive flexibility around USB device handling with udev rules and scripts. The options for access control are vast.
So while auto-mounting and usage works out the box, customizing USB device authorization and policies follows classic Linux "do anything manually" philosophy if desired.
Troubleshooting USB Issues
USB relies on interaction between hardware, the kernel driver stack, daemon services and more. So issues can arise needing debugging. Common symptoms around USB devices include:
- Devices not appearing
- Check lsusb and dmesg output after insertion
- Failure to recognize device type
- Inspect /sys filesystem for misdetections
- Errors during mounting
- Verify syslog/kern logs for mount failures
- Disconnections or power problems
- Examine dmesg for disconnect events
- Toggle to alternate USB ports
- Permission issues
- Review user/group ownership
- Check permissions using lsblk
General troubleshooting tips involve:
- Trying alternate USB ports in case of hardware issues
- Comparing working and non-working devices with lsusb
- Tail syslog with filters like
tail -F /var/log/syslog | grep -i usb
- Testing multiple cables – USB wires degrade over time
Rebooting also resets the USB sub-system, kernel driver states and daemon processes.Retrying device insertion after a reboot isolates software vs hardware faults through testing clean configurations.
And tools like usbreset can recycle individual port states without fully restarting.
So while USB normally operates transparently, check these sources while debugging USB issues on Linux.
Looking Forward: USB4 / Thunderbolt Support
USB ports remain essential interfaces even in our wireless world. And Linux implements advanced capabilities for handling USB devices as the standards progress.
Recent Linux kernels support emerging USB Type-C connectivity. This slim reversible connector supersedes the older rectangular Type-A ports.
Type-C allows charging, data transfer, display protocols, and power delivery over a single cable. And connects USB to Thunderbolt and USB4 which share the same USB-C connector.
USB4 debuted in 2019 based on the Thunderbolt protocol specification. It pushes speeds up to 40 Gbps – 8x faster than USB 3.2. And permits more flexible device bus topology chains.
Addition of tunneling PCIe data allows innovative expansions too. For example connecting external GPUs for gaming, machine learning accelerators for AI programming, and advanced docking stations.
Current major Linux distro releases incorporate early support for these faster standards. So existing tools we‘ve covered will manage devices as you upgrade computers down the road.
Listing basic USB device details, configuring secure storage handling policies, and troubleshooting issues will continue working in combination with modern ports and protocols. Linux remains versatile and capable interacting with the latest and greatest USB innovations.
Conclusion
We‘ve covered a gamut of USB device listing techniques – from quick lsusb sanity checks to customized udev scripting to handle device connections. Plus explored USB storage handling, security implications, troubleshooting steps and the roadmap for USB advances.
Hopefully this guide has prepped you to expertly manage USB devices across Linux systems – both for current peripherals and future advances. The combination of command line tools, sysfs metadata access and flexible udev rules grants extensive control to administer USB gadgets.
Let me know in the comments if you have any other favorite USB tricks! And reach out if you‘d ever like assistance solving USB problems in your Linux environments.