From 9c2815190aa96f78ff79622edae0c04294141b72 Mon Sep 17 00:00:00 2001 From: waldek Date: Fri, 20 Aug 2021 12:03:36 +0200 Subject: [PATCH] adds udev doc and some placeholders --- modules/qualifying/learning_dbus.md | 0 .../learning_systemd_udev_dbus_integration.md | 0 modules/qualifying/learning_udev.md | 487 ++++++++++++++++++ 3 files changed, 487 insertions(+) create mode 100644 modules/qualifying/learning_dbus.md create mode 100644 modules/qualifying/learning_systemd_udev_dbus_integration.md create mode 100644 modules/qualifying/learning_udev.md diff --git a/modules/qualifying/learning_dbus.md b/modules/qualifying/learning_dbus.md new file mode 100644 index 0000000..e69de29 diff --git a/modules/qualifying/learning_systemd_udev_dbus_integration.md b/modules/qualifying/learning_systemd_udev_dbus_integration.md new file mode 100644 index 0000000..e69de29 diff --git a/modules/qualifying/learning_udev.md b/modules/qualifying/learning_udev.md new file mode 100644 index 0000000..fa5a88a --- /dev/null +++ b/modules/qualifying/learning_udev.md @@ -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. + +##