adds udev doc and some placeholders
This commit is contained in:
parent
449c3e5909
commit
9c2815190a
|
@ -0,0 +1,487 @@
|
|||
# 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.
|
||||
|
||||
##
|
Loading…
Reference in New Issue