List all block devices
[root@rhtest1:~/# lsblk /dev/sr0: UUID="2016-12-22-15-10-02-00" LABEL="CentOS_7_ppc64le" TYPE="iso9660" PTTYPE="dos" /dev/sda: PTTYPE="dos" /dev/sdb: UUID="lWgefe-0g0v-Rw8R-oH16-ntlB-cmxL-yJ1GZV" TYPE="LVM2_member" /dev/sdd: UUID="lWgefe-0g0v-Rw8R-oH16-ntlB-cmxL-yJ1GZV" TYPE="LVM2_member" /dev/mapper/mpatha: PTTYPE="dos" /dev/sdc: PTTYPE="dos" /dev/mapper/mpatha2: UUID="2d558b91-3bc0-4473-a5d2-8124ecfc5edf" TYPE="xfs" /dev/mapper/mpatha3: UUID="Fekdxv-VOcD-frgW-e6sT-b9Ny-oAGT-cRLNxi" TYPE="LVM2_member" /dev/mapper/mpathb: UUID="lWgefe-0g0v-Rw8R-oH16-ntlB-cmxL-yJ1GZV" TYPE="LVM2_member" /dev/mapper/ca-root: UUID="c28f2089-7982-4a13-8daf-849837c29319" TYPE="xfs" /dev/mapper/ca-swap: UUID="1df7e041-a40b-43f3-8ae9-2d9645e226e3" TYPE="swap" /dev/mapper/datavg-testlv: UUID="eb42664d-452f-47f4-9a7b-2119707db7e8" TYPE="ext4"
List with tree
[root@rhtest1:~/# lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT sda mpath_member └─mpatha ├─mpatha1 ├─mpatha2 xfs 2d558b91-3bc0-4473-a5d2-8124ecfc5edf /boot └─mpatha3 LVM2_member Fekdxv-VOcD-frgW-e6sT-b9Ny-oAGT-cRLNxi ├─ca-root xfs c28f2089-7982-4a13-8daf-849837c29319 / └─ca-swap swap 1df7e041-a40b-43f3-8ae9-2d9645e226e3 [SWAP] sdb mpath_member lWgefe-0g0v-Rw8R-oH16-ntlB-cmxL-yJ1GZV └─mpathb LVM2_member lWgefe-0g0v-Rw8R-oH16-ntlB-cmxL-yJ1GZV └─datavg-testlv ext4 eb42664d-452f-47f4-9a7b-2119707db7e8 /test sdc mpath_member └─mpatha ├─mpatha1 ├─mpatha2 xfs 2d558b91-3bc0-4473-a5d2-8124ecfc5edf /boot └─mpatha3 LVM2_member Fekdxv-VOcD-frgW-e6sT-b9Ny-oAGT-cRLNxi ├─ca-root xfs c28f2089-7982-4a13-8daf-849837c29319 / └─ca-swap swap 1df7e041-a40b-43f3-8ae9-2d9645e226e3 [SWAP] sdd mpath_member lWgefe-0g0v-Rw8R-oH16-ntlB-cmxL-yJ1GZV └─mpathb LVM2_member lWgefe-0g0v-Rw8R-oH16-ntlB-cmxL-yJ1GZV └─datavg-testlv ext4 eb42664d-452f-47f4-9a7b-2119707db7e8 /test sr0
Disk info and serial NUMBER
root@SGELLIN119:~# udevadm info --query=all --name=/dev/mapper/mpatha P: /devices/virtual/block/dm-1 N: dm-1 L: 10 S: disk/by-id/dm-name-mpatha S: disk/by-id/dm-uuid-mpath-36005033330810012e80000000000007a S: disk/by-id/lvm-pv-uuid-atrTB1-Jf6u-3k2E-Ia0I-cEyO-ffrO-xxcAcY S: mapper/mpatha E: DEVLINKS=/dev/disk/by-id/dm-name-mpatha /dev/disk/by-id/dm-uuid-mpath-36005033330810012e80000000000007a /dev/disk/by-id/lvm-pv-uuid-atrTB1-Jf6u-3k2E-Ia0I-cEyO-ffrO-xxcAcY /dev/mapper/mpatha E: DEVNAME=/dev/dm-1 E: DEVPATH=/devices/virtual/block/dm-1 E: DEVTYPE=disk E: DM_ACTIVATION=1 E: DM_MULTIPATH_TIMESTAMP=1564405547 E: DM_NAME=mpatha E: DM_SUSPENDED=0 E: DM_UDEV_DISABLE_LIBRARY_FALLBACK_FLAG=1 E: DM_UDEV_PRIMARY_SOURCE_FLAG=1 E: DM_UDEV_RULES_VSN=2 E: DM_UUID=mpath-36005033330810012e80000000000007a E: ID_FS_TYPE=LVM2_member E: ID_FS_USAGE=raid E: ID_FS_UUID=atrTB1-Jf6u-3k2E-Ia0I-cEyO-ffrO-xxcAcY E: ID_FS_UUID_ENC=atrTB1-Jf6u-3k2E-Ia0I-cEyO-ffrO-xxcAcY E: ID_FS_VERSION=LVM2 001 E: ID_MODEL=LVM PV atrTB1-Jf6u-3k2E-Ia0I-cEyO-ffrO-xxcAcY on /dev/dm-1 E: MAJOR=253 E: MINOR=1 E: MPATH_SBIN_PATH=/sbin E: SUBSYSTEM=block E: SYSTEMD_ALIAS=/dev/block/253:1 E: SYSTEMD_READY=1 E: SYSTEMD_WANTS=lvm2-pvscan@253:1.service E: TAGS=:systemd: E: USEC_INITIALIZED=13601
Only Serial NUMBER
root@SGELLIN119:~# /lib/udev/scsi_id --whitelisted --device=/dev/sda 36005033330810012e80000000000007a
Once a device is recognized by the kernel it triggers a series of events. First it populates /sys structures, then the kernel sends a uevent received by 'udev' and, finally, 'udev' creates a device node for the new device or parses the 'udev' rules files, under /etc/udev/rules.d/, in alphanumeric order, to decide what action should be taken.
To query the 'udev' database for device information or the properties of a device from its sysfs representation we can use 'udevadm info':
Export the content of the udev database:
# udevadm info --export-db
Print all sysfs properties of the specified device that can be used in 'udev' rules to match the specified device. It prints all devices along the chain, up to the root of sysfs that can be used in 'udev' rules.
# udevadm info --attribute-walk --name=/dev/<sdc>
For a scsi device, we may use its unique SCSI identifier
'udevd' watch for any changes in rules files and will automatically apply any changes to those files. If that's not the case, one can ask 'udevd' to reload the rules files (reloading rules does not apply any changes to already existing devices) by:
# udevadm control --reload-rules
Request to trigger the execution of all 'udev' rules:
# udevadm trigger
# Writing a simple custom rule # ——————————————————————————————
# A 'udev' rule has two parts: one part that tests certain conditions and one part that # assigns variables (name, permissions, symbolic links, etc) when all conditions are # fulfilled
# 'udev' rule operators # ——————— # # == Compare for equality # != Compare for inequality # = Assign a value to a key # += Add the value to a key that holds a list of entries # := Assign a value to a key and lock the key to prevent any further modification
Some examples of udev rules:
# vi /etc/udev/rules.d/<99-my-custom.rules>
# 1.- Create a symbolic link under /dev/mydisks/ for each matching sd device
SUBSYSTEM=="block", KERNEL=="sd*", SYMLINK:="mydisks/%k"
If the new device is a block device, then we test if the internal kernel name starts with 'sd'. If both match, we add 'mydisks/%k' to the list of symbolic links to be created for this device
KERNEL=="sd[b-d]", SUBSYSTEM=="block", SUBSYSTEMS=="scsi", DRIVERS=="sd", SYMLINK+="shared/%k", RUN+="/usr/bin/wall MESSAGE: shared/%k --> $tempnode"
# ll /dev/sd* brw-rw---- 1 root disk 8, 0 Jul 2 17:18 /dev/sda brw-rw---- 1 root disk 8, 1 Jul 2 17:18 /dev/sda1 brw-rw---- 1 root disk 8, 2 Jul 2 17:18 /dev/sda2 brw-rw---- 1 root disk 8, 16 Jul 2 17:18 /dev/sdb brw-rw---- 1 root disk 8, 32 Jul 2 17:18 /dev/sdc brw-rw---- 1 root disk 8, 48 Jul 2 17:18 /dev/sdd
# udevadm trigger
Broadcast message from root@mynode (Wed Jul 2 17:18:44 2014): MESSAGE: /dev/sdd Broadcast message from root@mynode (Wed Jul 2 17:18:45 2014): MESSAGE: /dev/sdb Broadcast message from root@mynode (Wed Jul 2 17:18:46 2014): MESSAGE: /dev/sdc
# ll /dev/shared/ total 0 lrwxrwxrwx 1 root root 6 Jul 2 17:18 sdb -> ../sdb lrwxrwxrwx 1 root root 6 Jul 2 17:18 sdc -> ../sdc lrwxrwxrwx 1 root root 6 Jul 2 17:18 sdd -> ../sdd
# 3.- Name a network interface bearing a given mac-address (/etc/udev/rules.d/70-persistent-net.rules)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:48:a7:ef", ATTR{type}=="1", KERNEL=="eth*", NAME="my_eth0"
# 4.- Create a symbolic link and run a command for a device matching a given SCSI identifier
SUBSYSTEM=="block", KERNEL=="sd?", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/%k", RESULT=="1ATA_VBOX_HARDDISK_VB0d221c89-8b845902", SYMLINK:="shared/disk01"
# ll /dev/shared total 0 lrwxrwxrwx 1 root root 6 Feb 8 16:18 disk01 -> ../sdb
# 5.- Creating Oracle ASM devices under /dev/oracle/ using disks' SCSI identifiers
ACTION=="add", BUS=="scsi", ENV{ID_SERIAL}=="360c22lm4rr4nzf88df13aa9a0c8", NAME="oracle/DGTEST_01", OWNER="oracle", GROUP="dba", MODE="0660"