pense-bête : Udev

Published: 30-12-2014

Updated: 08-12-2017

By: Maxime de Roucy

tags: udev

Mes notes concernant udev.

ajout/suppression de device

récupération des propriétés

Pour avoir la liste des propriété disponible lors du branchement / débranchement d’un device :

  1. lancez la commande sudo udevadm monitor --property
  2. branchez / débranchez le device

lancement de script

Lancement d’un script à l’insertion d’un device

ACTION=="add", SUBSYSTEM=="usb", ATTRS{…}=="…", ATTRS{…}=="…", RUN+="/path/mon_script"

Lancement d’un script à l’extraction d’un device

ACTION=="remove", SUBSYSTEM=="usb", ENV{…}=="…", ENV{…}=="…", RUN+="/path/mon_script"

La règle udev correspondant à l’action « remove » ne doit pas contenir d’élément « ATTRS{…} » mais des « ENV{…} ». Pour une action « add » les deux sont utilisable. Cela est dû au fait qu’une fois le device retiré il n’est plus possible de lire ces attribut.

simulation

Pour simuler la réapparition d’un device utilisez la commande udevadm trigger. Par exemple pour simuler la réapparition de tous les éléments du « SUBSYSTEM=sound » :

max@laptop % sudo udevadm trigger -ssound

dump

Il est possible de dumper la totalité de la base udev via la commande suivante.

max@laptop % sudo udevadm info -e
P: /devices/LNXSYSTM:00
E: DEVPATH=/devices/LNXSYSTM:00
E: MODALIAS=acpi:LNXSYSTM:
E: SUBSYSTEM=acpi

P: /devices/LNXSYSTM:00/LNXCPU:00
E: DEVPATH=/devices/LNXSYSTM:00/LNXCPU:00
E: MODALIAS=acpi:LNXCPU:
E: SUBSYSTEM=acpi

…

P: /devices/pci0000:00/0000:00:1c.1/0000:02:00.0/bcma0:1/net/wlp2s0b1
E: DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:02:00.0/bcma0:1/net/wlp2s0b1
E: DEVTYPE=wlan
E: ID_BUS=pci
E: ID_MODEL_FROM_DATABASE=BCM4313 802.11bgn Wireless Network Adapter
E: ID_MODEL_ID=0x4727
E: ID_NET_DRIVER=brcmsmac
E: ID_NET_LINK_FILE=/usr/lib/systemd/network/99-default.link
E: ID_NET_NAME=wlp2s0b1
E: ID_NET_NAME_MAC=wlxdc85de27d2d0
E: ID_NET_NAME_PATH=wlp2s0b1
E: ID_OUI_FROM_DATABASE=AzureWave Technology Inc.
E: ID_PATH=pci-0000:02:00.0-bcma-1
E: ID_PATH_TAG=pci-0000_02_00_0-bcma-1
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Network controller
E: ID_VENDOR_FROM_DATABASE=Broadcom Corporation
E: ID_VENDOR_ID=0x14e4
E: IFINDEX=3
E: INTERFACE=wlp2s0b1
E: SUBSYSTEM=net
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/wlp2s0b1 /sys/subsystem/net/devices/wlp2s0b1
E: TAGS=:systemd:
E: USEC_INITIALIZED=18043585

…

P: /devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.3/4-1.3.2
N: bus/usb/004/004
E: BUSNUM=004
E: DEVNAME=/dev/bus/usb/004/004
E: DEVNUM=004
E: DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.3/4-1.3.2
E: DEVTYPE=usb_device
E: DRIVER=usb
E: ID_BUS=usb
E: ID_MODEL=Kensington_Expert_Mouse
E: ID_MODEL_ENC=Kensington\x20Expert\x20Mouse
E: ID_MODEL_FROM_DATABASE=Expert Mouse Trackball
E: ID_MODEL_ID=1020
E: ID_REVISION=0100
E: ID_SERIAL=Kensington_Kensington_Expert_Mouse
E: ID_USB_INTERFACES=:030102:
E: ID_VENDOR=Kensington
E: ID_VENDOR_ENC=Kensington\x20\x20\x20\x20\x20
E: ID_VENDOR_FROM_DATABASE=Kensington
E: ID_VENDOR_ID=047d
E: MAJOR=189
E: MINOR=387
E: PRODUCT=47d/1020/100
E: SUBSYSTEM=usb
E: TYPE=0/0/0
E: USEC_INITIALIZED=17121821

…

Pour récupérer les informations d’un device (« P: » dans le dump) en particulié.

max@laptop % udevadm info -qall -p /devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.3/4-1.3.2
P: /devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.3/4-1.3.2
N: bus/usb/004/004
E: BUSNUM=004
E: DEVNAME=/dev/bus/usb/004/004
E: DEVNUM=004
E: DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.3/4-1.3.2
E: DEVTYPE=usb_device
E: DRIVER=usb
E: ID_BUS=usb
E: ID_MODEL=Kensington_Expert_Mouse
E: ID_MODEL_ENC=Kensington\x20Expert\x20Mouse
E: ID_MODEL_FROM_DATABASE=Expert Mouse Trackball
E: ID_MODEL_ID=1020
E: ID_REVISION=0100
E: ID_SERIAL=Kensington_Kensington_Expert_Mouse
E: ID_USB_INTERFACES=:030102:
E: ID_VENDOR=Kensington
E: ID_VENDOR_ENC=Kensington\x20\x20\x20\x20\x20
E: ID_VENDOR_FROM_DATABASE=Kensington
E: ID_VENDOR_ID=047d
E: MAJOR=189
E: MINOR=387
E: PRODUCT=47d/1020/100
E: SUBSYSTEM=usb
E: TYPE=0/0/0
E: USEC_INITIALIZED=17121821

test

Pas besoin de faire un reload des rules pour faire un test.

Le path udev doit être utilisé, on peut l’obtenir via udevadm info :

root@testhost # udevadm test --action=add /devices/pci0000:00/0000:00:18.0/0000:1b:00.0/net/eth2
root@testhost # udevadm test --action=add `udevadm info -q path -n /dev/snd/pcmC1D0p` 

Ci-dessous, un exemple complet avec une yubikey. Attention, la règle exposé ici ne doit plus être utilisée pour detecter une yubikey (c’est juste une exemple d’utilisation de udevadm test).

root@testhost # sudo cat /etc/udev/rules.d/70-yubikey.rules
# Lancement d'un script à l'extraction
ACTION=="add", SUBSYSTEM=="input", ENV{NAME}=="?Yubico Yubico Yubikey II?", ENV{ID_VENDOR_ID}=="1050", ENV{ID_MODEL_ID}=="0010", RUN+="/usr/local/bin/toto.sh"

root@testhost # sudo udevadm info -e | less
…

P: /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/0003:1050:0010.0015/input/input47
…
E: ID_MODEL_ID=0010
…
E: ID_VENDOR_ID=1050
…
E: NAME="Yubico Yubico Yubikey II"
…

root@testhost # sudo udevadm test --action=add '/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/0003:1050:0010.0015/input/input47'
calling: test
version 235
This program is for debugging only, it does not run any program
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.

…
Reading rules file: /etc/udev/rules.d/70-yubikey.rules
…
RUN '/usr/local/bin/toto.sh' /etc/udev/rules.d/70-yubikey.rules:2
…
run: '/usr/local/bin/toto.sh'
Unload module index
Unloaded link configuration context.

Le script n’est pas lancé, il s’agit juste d’un test.

fixer le nom des interfaces réseau

old→jessie

Sous les vieille distribution qui utilise encore les notation ethX pour les interfaces réseau il peut arriver que les interfaces soit mélangées au reboot suite à l’ajout d’une nouvelle carte réseau (eg. eth0 correspont à l’ancienne eth1 et vice-versa). Ça m’est arrivé assez souvant sur des VM qui sont rarement reboot mais sur lesquels il est courant d’ajouter des interfaces pour diverse besoins.

Pour s’assurer que les interfaces auront les mêmes noms après le reboot il faut déclancher la re-génération du fichier /etc/udev/rules.d/70-persistent-net.rules :

root@testhost # cat /lib/udev/rules.d/75-persistent-net-generator.rules
root@testhost # rm /etc/udev/rules.d/70-persistent-net.rules
root@testhost # udevadm trigger --action=add --subsystem-match=net

stretch et plus récent

Sous stretch, il est possible d’utiliser l’ancien nomage des NIC (eth…) via les options noyau net.ifnames=0 et biosdevname=0 mais le « presistent-net-generator » ne fonctionne plus.

La seul solution (à ma connaissance) et de générer soit même le fichier /etc/udev/rules.d/70-persistent-net.rules :

i=0
for mac in $(ip link show | grep ether | awk '{print $2}')
do
	echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="'$mac'", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth'$i'"'
	i=$(($i+1))
done