488 lines
23 KiB
Markdown
488 lines
23 KiB
Markdown
# udev
|
||
|
||
## What is udev?
|
||
|
||
Udev (userspace /dev) is a Linux sub-system for dynamic device detection and management, since kernel version 2.6. It’s a replacement of [devfs](https://wiki.debian.org/DevFS) and hotplug.
|
||
It dynamically creates or removes device nodes (an interface to a device driver that appears in a file system as if it were an ordinary file, stored under the /dev directory) at boot time or if you add a device to or remove a device from the system.
|
||
It then propagates information about a device or changes to its state to user space.
|
||
The goal of udev, as stated by the [project](https://www.linux.com/news/udev-introduction-device-management-modern-linux-system/) is:
|
||
|
||
* Run in user space.
|
||
* Create persistent device names, take the device naming out of kernel space and implement rule based device naming.
|
||
* Create a dynamic /dev with device nodes for devices present in the system and allocate major/minor numbers dynamically.
|
||
* Provide a user space API to access the device information in the system.
|
||
|
||
One of the pros of udev is that it can use persistent device names to guarantee consistent naming of devices across reboots, despite their order of discovery.
|
||
This feature is useful because the kernel simply assigns unpredictable device names based on the order of discovery.
|
||
|
||
## How does it work?
|
||
|
||
As udev runs in [userland](https://unix.stackexchange.com/questions/137820/whats-the-difference-of-the-userland-vs-the-kernel), it runs a service which on most modern distributions is controlled by [systemd](./learning_systemd.md).
|
||
If we have a look at our running processes and search for `udev` we find the following.
|
||
|
||
```
|
||
➜ ~ git:(master) ✗ ps aux | grep udev
|
||
root 430 0.0 0.0 23252 4164 ? Ss Aug06 0:01 /lib/systemd/systemd-udevd
|
||
waldek 11628 0.0 0.0 6208 896 pts/4 S+ 10:11 0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn udev
|
||
➜ ~ git:(master) ✗
|
||
```
|
||
|
||
The first line hints us to a process run by root with a pretty low `PID`.
|
||
It seems to be part of the `systemd` *suite* of programs.
|
||
As always, let's have a look at the `man systemd-udevd` to learn what it is and how we can interact with it.
|
||
|
||
```
|
||
DESCRIPTION
|
||
systemd-udevd listens to kernel uevents. For every event, systemd-udevd executes matching instructions
|
||
specified in udev rules. See udev(7).
|
||
|
||
The behavior of the daemon can be configured using udev.conf(5), its command line options, environment
|
||
variables, and on the kernel command line, or changed dynamically with udevadm control.
|
||
```
|
||
|
||
The description is pretty solid and points us to a specific program we can use to *talk* to the daemon.
|
||
This is very similar to how we have been talking to `systemd` via `systemctl` but here, to talk to `systemd-udevd`, we'll use `udevadm`.
|
||
|
||
## Interacting with udev
|
||
|
||
### Monitoring events
|
||
|
||
To analyse what udev is receiving we can monitor it with `sudo udevadm monitor`.
|
||
You'll see see the following output with a *blinking* cursor on the last line to show we're monitoring *live*.
|
||
|
||
```
|
||
➜ ~ git:(master) ✗ sudo udevadm monitor
|
||
monitor will print the received events for:
|
||
UDEV - the event which udev sends out after rule processing
|
||
KERNEL - the kernel uevent
|
||
```
|
||
|
||
If we now **plug in** a device we'll see a bunch of messages arriving.
|
||
He I **added** a device by plugging it into the **USB** port.
|
||
You can see a lot of *sound* and *midi* messages so it's safe to say I plugged in a MIDI keyboard.
|
||
Do notice that once the keyboard is fully recognized and initialized by the system the messages stop.
|
||
Udev has done it's work and will remain silent until some changes happen to the system.
|
||
|
||
```
|
||
KERNEL[212709.657308] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2 (usb)
|
||
KERNEL[212709.657495] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0 (usb)
|
||
KERNEL[212709.657545] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1 (sound)
|
||
KERNEL[212709.657658] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/midiC1D0 (sound)
|
||
KERNEL[212709.657725] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/midi1 (sound)
|
||
KERNEL[212709.657774] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/dmmidi1 (sound)
|
||
KERNEL[212709.657801] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/seq-midi-1-0 (snd_seq)
|
||
KERNEL[212709.657829] bind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/seq-midi-1-0 (snd_seq)
|
||
KERNEL[212709.657910] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/controlC1 (sound)
|
||
KERNEL[212709.657967] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/mixer1 (sound)
|
||
KERNEL[212709.658046] bind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0 (usb)
|
||
KERNEL[212709.658086] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.1 (usb)
|
||
KERNEL[212709.658121] bind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.1 (usb)
|
||
KERNEL[212709.658166] bind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2 (usb)
|
||
UDEV [212709.673568] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2 (usb)
|
||
UDEV [212709.675863] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0 (usb)
|
||
UDEV [212709.676560] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.1 (usb)
|
||
UDEV [212709.677850] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1 (sound)
|
||
UDEV [212709.678004] bind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.1 (usb)
|
||
UDEV [212709.690171] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/midiC1D0 (sound)
|
||
UDEV [212709.690273] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/midi1 (sound)
|
||
KERNEL[212709.692086] change /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1 (sound)
|
||
UDEV [212709.692888] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/seq-midi-1-0 (snd_seq)
|
||
UDEV [212709.693659] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/mixer1 (sound)
|
||
UDEV [212709.694897] bind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/seq-midi-1-0 (snd_seq)
|
||
UDEV [212709.696017] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/dmmidi1 (sound)
|
||
UDEV [212709.705167] add /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/controlC1 (sound)
|
||
UDEV [212709.706615] bind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0 (usb)
|
||
UDEV [212709.710665] bind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2 (usb)
|
||
UDEV [212709.712669] change /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1 (sound)
|
||
```
|
||
|
||
When I **unplug** the MIDI keyboard we get the following output.
|
||
Notice the sequence of events here.
|
||
The kernel reports changes which udev uses to **trigger** events and actions.
|
||
|
||
```
|
||
KERNEL[213014.417312] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/mixer1 (sound)
|
||
KERNEL[213014.417546] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/controlC1 (sound)
|
||
KERNEL[213014.417574] unbind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/seq-midi-1-0 (snd_seq)
|
||
KERNEL[213014.417593] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/seq-midi-1-0 (snd_seq)
|
||
KERNEL[213014.417655] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/midi1 (sound)
|
||
KERNEL[213014.417711] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/dmmidi1 (sound)
|
||
KERNEL[213014.417782] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/midiC1D0 (sound)
|
||
KERNEL[213014.417808] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1 (sound)
|
||
KERNEL[213014.417837] unbind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0 (usb)
|
||
KERNEL[213014.417870] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0 (usb)
|
||
KERNEL[213014.417904] unbind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.1 (usb)
|
||
KERNEL[213014.417939] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.1 (usb)
|
||
KERNEL[213014.418036] unbind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2 (usb)
|
||
KERNEL[213014.418080] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2 (usb)
|
||
UDEV [213014.419887] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/controlC1 (sound)
|
||
UDEV [213014.420067] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/mixer1 (sound)
|
||
UDEV [213014.420472] unbind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/seq-midi-1-0 (snd_seq)
|
||
UDEV [213014.421955] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/seq-midi-1-0 (snd_seq)
|
||
UDEV [213014.422602] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/midiC1D0 (sound)
|
||
UDEV [213014.422717] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/midi1 (sound)
|
||
UDEV [213014.424188] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1/dmmidi1 (sound)
|
||
UDEV [213014.424383] unbind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.1 (usb)
|
||
UDEV [213014.425445] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.1 (usb)
|
||
UDEV [213014.425718] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/sound/card1 (sound)
|
||
UDEV [213014.427640] unbind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0 (usb)
|
||
UDEV [213014.430208] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0 (usb)
|
||
UDEV [213014.432609] unbind /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2 (usb)
|
||
UDEV [213014.438393] remove /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2 (usb)
|
||
```
|
||
|
||
**In virtualbox you can add or remove USB devices via the menu bar of you virtual machine.**
|
||
|
||
We can use `udevadm` for more than just monitoring.
|
||
Tab complete to the rescue!
|
||
|
||
```
|
||
➜ ~ git:(master) ✗ sudo udevadm
|
||
control -- control the udev daemon
|
||
info -- query sysfs or the udev database
|
||
monitor -- listen to kernel and udev events
|
||
settle -- wait for the event queue to finish
|
||
test -- test an event run
|
||
test-builtin -- test a built-in command
|
||
trigger -- request events from the kernel
|
||
```
|
||
|
||
You can query the help information of a specific sub command by adding the `--help` argument.
|
||
A full manual can be read via `man udevadm`.
|
||
|
||
```
|
||
➜ ~ git:(master) ✗ sudo udevadm monitor --help
|
||
udevadm monitor [OPTIONS]
|
||
|
||
Listen to kernel and udev events.
|
||
|
||
-h --help Show this help
|
||
-V --version Show package version
|
||
-p --property Print the event properties
|
||
-k --kernel Print kernel uevents
|
||
-u --udev Print udev events
|
||
-s --subsystem-match=SUBSYSTEM[/DEVTYPE] Filter events by subsystem
|
||
-t --tag-match=TAG Filter events by tag
|
||
➜ ~ git:(master) ✗
|
||
```
|
||
|
||
### Listing information
|
||
|
||
#### Via external programs
|
||
|
||
Udev can be used to query device information via the `info` subcommand but there are a few other programs that are very handy to know.
|
||
We'll focus on USB devices for now, but keep in mind that udev manages everything connected to our system.
|
||
My MIDI keyboad is **not** plugged in for now and below is the output of `lsusb`.
|
||
|
||
```
|
||
➜ ~ git:(master) ✗ lsusb
|
||
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
|
||
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
|
||
Bus 001 Device 003: ID 04f2:b217 Chicony Electronics Co., Ltd Lenovo Integrated Camera (0.3MP)
|
||
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
|
||
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
|
||
➜ ~ git:(master) ✗
|
||
```
|
||
|
||
Next I plug it **in** and review the output of `lsusb`.
|
||
A device is added but it's not saying much!
|
||
This is vedor dependant and this company did not fully document it's device.
|
||
Most of the time however, you'll see a short description of the device.
|
||
|
||
```
|
||
➜ ~ git:(master) ✗ lsusb
|
||
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
|
||
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
|
||
Bus 001 Device 003: ID 04f2:b217 Chicony Electronics Co., Ltd Lenovo Integrated Camera (0.3MP)
|
||
Bus 001 Device 006: ID 2702:1110
|
||
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
|
||
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
|
||
➜ ~ git:(master) ✗
|
||
```
|
||
|
||
The **hexadecimal** numbers you see listed are `VENDOR_ID:PROCUCT_ID` and can be used to digg deeper into a specific device.
|
||
For this we use the `-d VENDOR_ID:PROCUCT_ID` argument, together with `-v` for verbosity.
|
||
|
||
```
|
||
➜ ~ git:(master) ✗ lsusb -d 2702:1110 -v
|
||
|
||
Bus 001 Device 006: ID 2702:1110
|
||
Device Descriptor:
|
||
bLength 18
|
||
bDescriptorType 1
|
||
bcdUSB 1.10
|
||
bDeviceClass 0
|
||
bDeviceSubClass 0
|
||
bDeviceProtocol 0
|
||
bMaxPacketSize0 64
|
||
idVendor 0x2702
|
||
idProduct 0x1110
|
||
bcdDevice 0.01
|
||
iManufacturer 0
|
||
iProduct 0
|
||
iSerial 0
|
||
bNumConfigurations 1
|
||
Configuration Descriptor:
|
||
bLength 9
|
||
bDescriptorType 2
|
||
wTotalLength 0x0065
|
||
bNumInterfaces 2
|
||
bConfigurationValue 1
|
||
iConfiguration 0
|
||
bmAttributes 0x00
|
||
(Missing must-be-set bit!)
|
||
(Bus Powered)
|
||
MaxPower 100mA
|
||
Interface Descriptor:
|
||
bLength 9
|
||
bDescriptorType 4
|
||
bInterfaceNumber 0
|
||
bAlternateSetting 0
|
||
bNumEndpoints 0
|
||
bInterfaceClass 1 Audio
|
||
bInterfaceSubClass 1 Control Device
|
||
bInterfaceProtocol 0
|
||
iInterface 0
|
||
AudioControl Interface Descriptor:
|
||
bLength 9
|
||
bDescriptorType 36
|
||
bDescriptorSubtype 1 (HEADER)
|
||
bcdADC 1.00
|
||
wTotalLength 0x0009
|
||
bInCollection 1
|
||
baInterfaceNr(0) 1
|
||
Interface Descriptor:
|
||
bLength 9
|
||
bDescriptorType 4
|
||
bInterfaceNumber 1
|
||
bAlternateSetting 0
|
||
bNumEndpoints 2
|
||
bInterfaceClass 1 Audio
|
||
bInterfaceSubClass 3 MIDI Streaming
|
||
bInterfaceProtocol 0
|
||
iInterface 0
|
||
MIDIStreaming Interface Descriptor:
|
||
bLength 7
|
||
bDescriptorType 36
|
||
bDescriptorSubtype 1 (HEADER)
|
||
bcdADC 1.00
|
||
wTotalLength 0x0041
|
||
MIDIStreaming Interface Descriptor:
|
||
bLength 6
|
||
bDescriptorType 36
|
||
bDescriptorSubtype 2 (MIDI_IN_JACK)
|
||
bJackType 1 Embedded
|
||
bJackID 1
|
||
iJack 0
|
||
MIDIStreaming Interface Descriptor:
|
||
bLength 6
|
||
bDescriptorType 36
|
||
bDescriptorSubtype 2 (MIDI_IN_JACK)
|
||
bJackType 2 External
|
||
bJackID 2
|
||
iJack 0
|
||
MIDIStreaming Interface Descriptor:
|
||
bLength 9
|
||
bDescriptorType 36
|
||
bDescriptorSubtype 3 (MIDI_OUT_JACK)
|
||
bJackType 1 Embedded
|
||
bJackID 3
|
||
bNrInputPins 1
|
||
baSourceID( 0) 2
|
||
BaSourcePin( 0) 1
|
||
iJack 0
|
||
MIDIStreaming Interface Descriptor:
|
||
bLength 9
|
||
bDescriptorType 36
|
||
bDescriptorSubtype 3 (MIDI_OUT_JACK)
|
||
bJackType 2 External
|
||
bJackID 4
|
||
bNrInputPins 1
|
||
baSourceID( 0) 1
|
||
BaSourcePin( 0) 1
|
||
iJack 0
|
||
Endpoint Descriptor:
|
||
bLength 9
|
||
bDescriptorType 5
|
||
bEndpointAddress 0x02 EP 2 OUT
|
||
bmAttributes 2
|
||
Transfer Type Bulk
|
||
Synch Type None
|
||
Usage Type Data
|
||
wMaxPacketSize 0x0040 1x 64 bytes
|
||
bInterval 0
|
||
bRefresh 0
|
||
bSynchAddress 0
|
||
MIDIStreaming Endpoint Descriptor:
|
||
bLength 5
|
||
bDescriptorType 37
|
||
bDescriptorSubtype 1 (GENERAL)
|
||
bNumEmbMIDIJack 1
|
||
baAssocJackID( 0) 1
|
||
Endpoint Descriptor:
|
||
bLength 9
|
||
bDescriptorType 5
|
||
bEndpointAddress 0x81 EP 1 IN
|
||
bmAttributes 2
|
||
Transfer Type Bulk
|
||
Synch Type None
|
||
Usage Type Data
|
||
wMaxPacketSize 0x0040 1x 64 bytes
|
||
bInterval 0
|
||
bRefresh 0
|
||
bSynchAddress 0
|
||
MIDIStreaming Endpoint Descriptor:
|
||
bLength 5
|
||
bDescriptorType 37
|
||
bDescriptorSubtype 1 (GENERAL)
|
||
bNumEmbMIDIJack 1
|
||
baAssocJackID( 0) 3
|
||
can't get debug descriptor: Resource temporarily unavailable
|
||
Device Status: 0x0000
|
||
(Bus Powered)
|
||
➜ ~ git:(master) ✗
|
||
```
|
||
|
||
A USB stick presents itself as follows and offers quite a bit more information than our generic MIDI keyboard.
|
||
We get a unique serial number, speeds, power usage and more.
|
||
|
||
```
|
||
➜ ~ git:(master) ✗ lsusb -d 0781:5591 -v
|
||
|
||
Bus 001 Device 007: ID 0781:5591 SanDisk Corp. Ultra Flair
|
||
Device Descriptor:
|
||
bLength 18
|
||
bDescriptorType 1
|
||
bcdUSB 2.10
|
||
bDeviceClass 0
|
||
bDeviceSubClass 0
|
||
bDeviceProtocol 0
|
||
bMaxPacketSize0 64
|
||
idVendor 0x0781 SanDisk Corp.
|
||
idProduct 0x5591 Ultra Flair
|
||
bcdDevice 1.00
|
||
iManufacturer 1 USB
|
||
iProduct 2 SanDisk 3.2Gen1
|
||
iSerial 3 0101afb5176b84241e77e68fb386ea23b31fe4cf9eafe43b465def85b4531ad93da300000000000000000000014b07c6ff8d260091558107b52921c2
|
||
bNumConfigurations 1
|
||
Configuration Descriptor:
|
||
bLength 9
|
||
bDescriptorType 2
|
||
wTotalLength 0x0020
|
||
bNumInterfaces 1
|
||
bConfigurationValue 1
|
||
iConfiguration 0
|
||
bmAttributes 0x80
|
||
(Bus Powered)
|
||
MaxPower 224mA
|
||
Interface Descriptor:
|
||
bLength 9
|
||
bDescriptorType 4
|
||
bInterfaceNumber 0
|
||
bAlternateSetting 0
|
||
bNumEndpoints 2
|
||
bInterfaceClass 8 Mass Storage
|
||
bInterfaceSubClass 6 SCSI
|
||
bInterfaceProtocol 80 Bulk-Only
|
||
iInterface 0
|
||
Endpoint Descriptor:
|
||
bLength 7
|
||
bDescriptorType 5
|
||
bEndpointAddress 0x81 EP 1 IN
|
||
bmAttributes 2
|
||
Transfer Type Bulk
|
||
Synch Type None
|
||
Usage Type Data
|
||
wMaxPacketSize 0x0200 1x 512 bytes
|
||
bInterval 0
|
||
Endpoint Descriptor:
|
||
bLength 7
|
||
bDescriptorType 5
|
||
bEndpointAddress 0x02 EP 2 OUT
|
||
bmAttributes 2
|
||
Transfer Type Bulk
|
||
Synch Type None
|
||
Usage Type Data
|
||
wMaxPacketSize 0x0200 1x 512 bytes
|
||
bInterval 0
|
||
Binary Object Store Descriptor:
|
||
bLength 5
|
||
bDescriptorType 15
|
||
wTotalLength 0x0016
|
||
bNumDeviceCaps 2
|
||
USB 2.0 Extension Device Capability:
|
||
bLength 7
|
||
bDescriptorType 16
|
||
bDevCapabilityType 2
|
||
bmAttributes 0x00000002
|
||
HIRD Link Power Management (LPM) Supported
|
||
SuperSpeed USB Device Capability:
|
||
bLength 10
|
||
bDescriptorType 16
|
||
bDevCapabilityType 3
|
||
bmAttributes 0x00
|
||
wSpeedsSupported 0x000e
|
||
Device can operate at Full Speed (12Mbps)
|
||
Device can operate at High Speed (480Mbps)
|
||
Device can operate at SuperSpeed (5Gbps)
|
||
bFunctionalitySupport 1
|
||
Lowest fully-functional device speed is Full Speed (12Mbps)
|
||
bU1DevExitLat 10 micro seconds
|
||
bU2DevExitLat 256 micro seconds
|
||
can't get debug descriptor: Resource temporarily unavailable
|
||
Device Status: 0x0000
|
||
(Bus Powered)
|
||
➜ ~ git:(master) ✗
|
||
```
|
||
|
||
#### Via udevadm
|
||
|
||
We can get the same information via `udevadm` with the `info` subcommand.
|
||
We'll have to specify *which* device we want to query and this can be done via different identifiers.
|
||
The USB stick I inserted is still plugged in and represented in my filesystem via `/dev/sdc`.
|
||
Remember TAB complete!
|
||
|
||
```
|
||
➜ ~ git:(master) ✗ sudo udevadm info --path /sys/block/sdc
|
||
[sudo] password for waldek:
|
||
P: /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/host6/target6:0:0/6:0:0:0/block/sdc
|
||
N: sdc
|
||
L: 0
|
||
S: disk/by-id/usb-USB_SanDisk_3.2Gen1_0101afb5176b84241e77e68fb386ea23b31fe4cf9eafe43b465def85b4531ad93da300000000000000000000014b07c6ff8d260091558107b52921c2-0:0
|
||
S: disk/by-path/pci-0000:00:1a.0-usb-0:1.2:1.0-scsi-0:0:0:0
|
||
E: DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/host6/target6:0:0/6:0:0:0/block/sdc
|
||
E: DEVNAME=/dev/sdc
|
||
E: DEVTYPE=disk
|
||
E: MAJOR=8
|
||
E: MINOR=32
|
||
E: SUBSYSTEM=block
|
||
E: USEC_INITIALIZED=216426658045
|
||
E: ID_VENDOR=USB
|
||
E: ID_VENDOR_ENC=\x20USB\x20\x20\x20\x20
|
||
E: ID_VENDOR_ID=0781
|
||
E: ID_MODEL=SanDisk_3.2Gen1
|
||
E: ID_MODEL_ENC=\x20SanDisk\x203.2Gen1
|
||
E: ID_MODEL_ID=5591
|
||
E: ID_REVISION=1.00
|
||
E: ID_SERIAL=USB_SanDisk_3.2Gen1_0101afb5176b84241e77e68fb386ea23b31fe4cf9eafe43b465def85b4531ad93da300000000000000000000014b07c6ff8d260091558107b52921c2-0:0
|
||
E: ID_SERIAL_SHORT=0101afb5176b84241e77e68fb386ea23b31fe4cf9eafe43b465def85b4531ad93da300000000000000000000014b07c6ff8d260091558107b52921c2
|
||
E: ID_TYPE=disk
|
||
E: ID_INSTANCE=0:0
|
||
E: ID_BUS=usb
|
||
E: ID_USB_INTERFACES=:080650:
|
||
E: ID_USB_INTERFACE_NUM=00
|
||
E: ID_USB_DRIVER=usb-storage
|
||
E: ID_PATH=pci-0000:00:1a.0-usb-0:1.2:1.0-scsi-0:0:0:0
|
||
E: ID_PATH_TAG=pci-0000_00_1a_0-usb-0_1_2_1_0-scsi-0_0_0_0
|
||
E: ID_PART_TABLE_UUID=2ab572a6-8db9-4324-9d21-1a3640f4fb19
|
||
E: ID_PART_TABLE_TYPE=gpt
|
||
E: DEVLINKS=/dev/disk/by-id/usb-USB_SanDisk_3.2Gen1_0101afb5176b84241e77e68fb386ea23b31fe4cf9eafe43b465def85b4531ad93da300000000000000000000014b07c6ff8d260091558107b52921c2-0:0 /dev/disk/by-path/pci-0000:00:1a.0-usb-0:1.2:1.0-scsi-0:0:0:0
|
||
E: TAGS=:systemd:
|
||
➜ ~ git:(master) ✗
|
||
```
|
||
|
||
We can also inspect information about the **partions** on the disk, even without **mounting** them.
|
||
I'll spare you the output of the command but you would do `sudo udevadm info --name=/dev/sdc1` wich gives us the label, type of format, etc.
|
||
|
||
##
|