[Tuto]Création d'une règle UDEV pour automatiser l'insertion d'un clef USB !

Proposer ou rechercher un tutoriel concernant le Raspberry Pi

Modérateur : Francois

Répondre
Artemus24
Raspinaute
Messages : 1077
Enregistré le : ven. 15 sept. 2017 19:15

[Tuto]Création d'une règle UDEV pour automatiser l'insertion d'un clef USB !

Message par Artemus24 » sam. 22 sept. 2018 02:09

Salut à tous.

Suite à une question posée dans ce forum, j'ai voulu faire le test de la création d'une règle pour gérer un périphérique dans la Rpi3+.

1) Qu'est-ce que je désire faire et pourquoi ?

J'utilise une clef USB de la marque Verbatim, qui contient la distribution Stretch.
On peut l'utiliser pour un autre usage, par exemple, du stockage.

A chaque fois que je désire utiliser ma clef USB, mon problème est que je dois faire le montage des deux partitions manuellement pour accéder à leur contenu.
Autant le faire automatiquement est source de moins d'erreurs et de gain de temps.
On peut après le montage, faire un traitement, par exemple, de la recopie.

2) identification du montage.

Je pars de l'hypothèse que ma règle fonctionne correctement.

Code : Tout sélectionner

~> blkid
/dev/sda1: LABEL="boot" UUID="13C6-2676" TYPE="vfat" PARTUUID="9cba179a-01"
/dev/sda2: UUID="037616fd-28fe-4652-8248-2042ea30b929" TYPE="ext4" PARTUUID="9cba179a-02"
/dev/sdb1: LABEL="boot" UUID="13C6-2676" TYPE="vfat" PARTUUID="12345678-01"
/dev/sdb2: UUID="037616fd-28fe-4652-8248-2042ea30b929" TYPE="ext4" PARTUUID="12345678-02"
~>
Ce qui nous intéresse concerne "/dev/sdb", c'est-à-dire nos deux partitions que l'on veut monter.

Et quand ils sont montés, voici ce que l'on obtient :

Code : Tout sélectionner

~> df
Sys. de fichiers blocs de 1K Utilisé Disponible Uti% Monté sur
/dev/root           16453544 5276804   10450172  34% /
devtmpfs              470112       0     470112   0% /dev
tmpfs                 474720       0     474720   0% /dev/shm
tmpfs                 474720   14428     460292   4% /run
tmpfs                   5120       4       5116   1% /run/lock
tmpfs                 474720       0     474720   0% /sys/fs/cgroup
tmpfs                  10240      12      10228   1% /tmp
tmpfs                  10240     340       9900   4% /var/log
tmpfs                  10240       0      10240   0% /var/tmp
/dev/sda1              42137   22499      19638  54% /boot
tmpfs                  94944       0      94944   0% /run/user/0
tmpfs                  94944       0      94944   0% /run/user/1000
tmpfs                  94944       0      94944   0% /run/user/109
/dev/sdb2           16453544 4913748   10813228  32% /mnt/rootfs
/dev/sdb1              42137   22499      19638  54% /mnt/boot
~>
Le résultat final sont "/mnt/boot" et "/mntrootfs".

Nous devrons utiliser ces deux commandes pour voir si le montage s'est bien fait.

Dans cet exemple, nous retiendrons "/dev/sdb".

3) Comment identifier le périphérique (ma clef USB) ?

Faire ceci avant d'insérer la clef USB dans la Raspberry :

Code : Tout sélectionner

~> lsusb
Bus 001 Device 004: ID 0bc2:61b3 Seagate RSS LLC
Bus 001 Device 005: ID 0424:7800 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
~>
Puis voici ce que l'on obtiens après l'insertion :

Code : Tout sélectionner

~> lsusb
Bus 001 Device 004: ID 0bc2:61b3 Seagate RSS LLC
Bus 001 Device 006: ID 18a5:0302 Verbatim, Ltd Flash Drive
Bus 001 Device 005: ID 0424:7800 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
~>
Le nouveau périphérique est :

Code : Tout sélectionner

Bus 001 Device 006: ID 18a5:0302 Verbatim, Ltd Flash Drive
En général, c'est le plus haut numéro du device. Ici, c'est "006".

4) Récupérer des informations pour identifier de manière unique le périphérique.

On va utiliser la commande "lsusb". Nous savons que qu'il s'agit du bus "001" et du device "006".

Code : Tout sélectionner

~> lsusb -s 001:006 -v

Bus 001 Device 006: ID 18a5:0302 Verbatim, Ltd Flash Drive
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x18a5 Verbatim, Ltd
  idProduct          0x0302 Flash Drive
  bcdDevice            1.00
  iManufacturer           1 Verbatim
  iProduct                2 STORE N GO
  iSerial                 3 07013A109B3D5264
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              200mA
    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
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0000
  (Bus Powered)
~>
En ce qui me concerne, je me suis focalisé sur trois paramètres que voici :

Le vendeur :

Code : Tout sélectionner

~> lsusb -s 001:006 -v | grep idVendor
  idVendor           0x18a5 Verbatim, Ltd
Le produit :

Code : Tout sélectionner

~> lsusb -s 001:006 -v | grep idProduct
  idProduct          0x0302 Flash Drive
Le numéro de série du périphérique afin de le rendre unique dans le filtrage :

Code : Tout sélectionner

~> lsusb -s 001:006 -v | grep iSerial
  iSerial                 3 07013A109B3D5264
Il existe une autre solution pour récupérer ces informations :
Le vendeur :

Code : Tout sélectionner

~> udevadm info /dev/sdb | grep ID_VENDOR_ID
E: ID_VENDOR_ID=18a5
Le produit :

Code : Tout sélectionner

~> udevadm info /dev/sdb | grep ID_MODEL_ID
E: ID_MODEL_ID=0302
Le numéro de séri :

Code : Tout sélectionner

~> udevadm info /dev/sdb | grep ID_SERIAL_SHORT
E: ID_SERIAL_SHORT=07013A109B3D5264
5) le filtrage des règles.

Pour filtrer, vous devez nécessairement identifier le niveau de la règle que vous désirer récupérer.
Voici ce que l'on obtient sans filtrage :

Code : Tout sélectionner

~> udevadm info -a -p $(udevadm info -q path -n /dev/sdb2)

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2/1-1.1.2:1.0/host1/target1:0:0/1:0:0:0/block/sdb/sdb2':
    KERNEL=="sdb2"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{alignment_offset}=="0"
    ATTR{discard_alignment}=="0"
    ATTR{inflight}=="       0        0"
    ATTR{partition}=="2"
    ATTR{ro}=="0"
    ATTR{size}=="33554432"
    ATTR{start}=="206848"
    ATTR{stat}=="      63       29     4410     2750        1        0        8      750        0     3070     3500"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2/1-1.1.2:1.0/host1/target1:0:0/1:0:0:0/block/sdb':
    KERNELS=="sdb"
    SUBSYSTEMS=="block"
    DRIVERS==""
    ATTRS{alignment_offset}=="0"
    ATTRS{capability}=="51"
    ATTRS{discard_alignment}=="0"
    ATTRS{events}=="media_change"
    ATTRS{events_async}==""
    ATTRS{events_poll_msecs}=="-1"
    ATTRS{ext_range}=="256"
    ATTRS{inflight}=="       0        0"
    ATTRS{range}=="16"
    ATTRS{removable}=="1"
    ATTRS{ro}=="0"
    ATTRS{size}=="120918016"
    ATTRS{stat}=="     191       42    10647     6830        1        0        8      750        0     5360     7580"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2/1-1.1.2:1.0/host1/target1:0:0/1:0:0:0':
    KERNELS=="1:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{device_blocked}=="0"
    ATTRS{device_busy}=="0"
    ATTRS{eh_timeout}=="10"
    ATTRS{evt_capacity_change_reported}=="0"
    ATTRS{evt_inquiry_change_reported}=="0"
    ATTRS{evt_lun_change_reported}=="0"
    ATTRS{evt_media_change}=="0"
    ATTRS{evt_mode_parameter_change_reported}=="0"
    ATTRS{evt_soft_threshold_reached}=="0"
    ATTRS{inquiry}==""
    ATTRS{iocounterbits}=="32"
    ATTRS{iodone_cnt}=="0x2c4"
    ATTRS{ioerr_cnt}=="0x2"
    ATTRS{iorequest_cnt}=="0x2c4"
    ATTRS{max_sectors}=="240"
    ATTRS{model}=="STORE N GO      "
    ATTRS{queue_depth}=="1"
    ATTRS{queue_type}=="none"
    ATTRS{rev}=="5.00"
    ATTRS{scsi_level}=="5"
    ATTRS{state}=="running"
    ATTRS{timeout}=="30"
    ATTRS{type}=="0"
    ATTRS{vendor}=="Verbatim"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2/1-1.1.2:1.0/host1/target1:0:0':
    KERNELS=="target1:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2/1-1.1.2:1.0/host1':
    KERNELS=="host1"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2/1-1.1.2:1.0':
    KERNELS=="1-1.1.2:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb-storage"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="08"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bInterfaceProtocol}=="50"
    ATTRS{bInterfaceSubClass}=="06"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2':
    KERNELS=="1-1.1.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="200mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0100"
    ATTRS{bmAttributes}=="80"
    ATTRS{busnum}=="1"
    ATTRS{configuration}==""
    ATTRS{devnum}=="6"
    ATTRS{devpath}=="1.1.2"
    ATTRS{devspec}=="  (null)"
    ATTRS{idProduct}=="0302"
    ATTRS{idVendor}=="18a5"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Verbatim"
    ATTRS{maxchild}=="0"
    ATTRS{product}=="STORE N GO"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="removable"
    ATTRS{serial}=="07013A109B3D5264"
    ATTRS{speed}=="480"
    ATTRS{urbnum}=="2006"
    ATTRS{version}==" 2.00"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1':
    KERNELS=="1-1.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceProtocol}=="02"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="2mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0bb3"
    ATTRS{bmAttributes}=="e0"
    ATTRS{busnum}=="1"
    ATTRS{configuration}==""
    ATTRS{devnum}=="3"
    ATTRS{devpath}=="1.1"
    ATTRS{idProduct}=="2514"
    ATTRS{idVendor}=="0424"
    ATTRS{ltm_capable}=="no"
    ATTRS{maxchild}=="3"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="fixed"
    ATTRS{speed}=="480"
    ATTRS{urbnum}=="46"
    ATTRS{version}==" 2.00"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceProtocol}=="02"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="2mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0bb3"
    ATTRS{bmAttributes}=="e0"
    ATTRS{busnum}=="1"
    ATTRS{configuration}==""
    ATTRS{devnum}=="2"
    ATTRS{devpath}=="1"
    ATTRS{idProduct}=="2514"
    ATTRS{idVendor}=="0424"
    ATTRS{ltm_capable}=="no"
    ATTRS{maxchild}=="4"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{speed}=="480"
    ATTRS{urbnum}=="47"
    ATTRS{version}==" 2.00"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{authorized_default}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="0mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0414"
    ATTRS{bmAttributes}=="e0"
    ATTRS{busnum}=="1"
    ATTRS{configuration}==""
    ATTRS{devnum}=="1"
    ATTRS{devpath}=="0"
    ATTRS{idProduct}=="0002"
    ATTRS{idVendor}=="1d6b"
    ATTRS{interface_authorized_default}=="1"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Linux 4.14.69-v7+ dwc_otg_hcd"
    ATTRS{maxchild}=="1"
    ATTRS{product}=="DWC OTG Controller"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{serial}=="3f980000.usb"
    ATTRS{speed}=="480"
    ATTRS{urbnum}=="31"
    ATTRS{version}==" 2.00"

  looking at parent device '/devices/platform/soc/3f980000.usb':
    KERNELS=="3f980000.usb"
    SUBSYSTEMS=="platform"
    DRIVERS=="dwc_otg"
    ATTRS{busconnected}=="Bus Connected = 0x1"
    ATTRS{buspower}=="Bus Power = 0x1"
    ATTRS{bussuspend}=="Bus Suspend = 0x0"
    ATTRS{devspeed}=="Device Speed = 0x0"
    ATTRS{driver_override}=="(null)"
    ATTRS{enumspeed}=="Device Enumeration Speed = 0x1"
    ATTRS{fr_interval}=="Frame Interval = 0x1d4b"
    ATTRS{ggpio}=="GGPIO = 0x00000000"
    ATTRS{gnptxfsiz}=="GNPTXFSIZ = 0x01000306"
    ATTRS{gotgctl}=="GOTGCTL = 0x001c0000"
    ATTRS{gpvndctl}=="GPVNDCTL = 0x00000000"
    ATTRS{grxfsiz}=="GRXFSIZ = 0x00000306"
    ATTRS{gsnpsid}=="GSNPSID = 0x4f54280a"
    ATTRS{guid}=="GUID = 0x2708a000"
    ATTRS{gusbcfg}=="GUSBCFG = 0x20001700"
    ATTRS{hcd_frrem}=="HCD Dump Frame Remaining"
    ATTRS{hcddump}=="HCD Dump"
    ATTRS{hnp}=="HstNegScs = 0x0"
    ATTRS{hnpcapable}=="HNPCapable = 0x1"
    ATTRS{hprt0}=="HPRT0 = 0x00001005"
    ATTRS{hptxfsiz}=="HPTXFSIZ = 0x02000406"
    ATTRS{hsic_connect}=="HSIC Connect = 0x1"
    ATTRS{inv_sel_hsic}=="Invert Select HSIC = 0x0"
    ATTRS{mode}=="Mode = 0x1"
    ATTRS{mode_ch_tim_en}=="Mode Change Ready Timer Enable = 0x0"
    ATTRS{rd_reg_test}=="Time to read GNPTXFSIZ reg 10000000 times: 1720 msecs (172 jiffies)"
    ATTRS{regdump}=="Register Dump"
    ATTRS{regoffset}=="0xffffffff"
    ATTRS{regvalue}=="invalid offset"
    ATTRS{rem_wakeup_pwrdn}==""
    ATTRS{remote_wakeup}=="Remote Wakeup Sig = 0 Enabled = 0 LPM Remote Wakeup = 0"
    ATTRS{spramdump}=="SPRAM Dump"
    ATTRS{srp}=="SesReqScs = 0x0"
    ATTRS{srpcapable}=="SRPCapable = 0x1"
    ATTRS{wr_reg_test}=="Time to write GNPTXFSIZ reg 10000000 times: 290 msecs (29 jiffies)"

  looking at parent device '/devices/platform/soc':
    KERNELS=="soc"
    SUBSYSTEMS=="platform"
    DRIVERS==""
    ATTRS{driver_override}=="(null)"

  looking at parent device '/devices/platform':
    KERNELS=="platform"
    SUBSYSTEMS==""
    DRIVERS==""

~>
Ce qui nous intéresse, c'est le niveau le plus bas, à savoir le premier chemin : "looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2/1-1.1.2:1.0/host1/target1:0:0/1:0:0:0/block/sdb/sdb2':".
Comment faire ? En utilisant d'abord nos trois paramètres qui vont s'écrire ainsi :

Code : Tout sélectionner

ATTRS{idVendor}=="18a5"
ATTRS{idProduct}=="0302"
ATTRS{serial}=="07013A109B3D5264"
Auquels nous allons ajouter deux autres paramètres pour nous positionner sur le premier chemin :

Code : Tout sélectionner

KERNEL=="sdb2"
SUBSYSTEM=="block"
Nous retrouverons ce filtrage dans le source de notre règle.

6) Où créer la règle et comment la nommer ?

Cela se passe dans le répertoire : "/etc/udev/rules.d".

Comme il s'agit de ma clef USB, je l'ai nommé : "10-my-usb-key.rules".
Vous devez impérativement préfixer par un numéro sur deux chiffres et suffixer par ".rules".
Pourquoi ce "10" ? Je n'ai pas trouvé de raison à cela.

7) voici la règle "10-my-usb-key.rules" :

Code : Tout sélectionner

#
# Identification de la clef usb 
#
SUBSYSTEM!="block",\
ATTRS{idVendor}!="18a5",\
ATTRS{idProduct}!="0302",\
ATTRS{serial}!="07013A109B3D5264",\
GOTO="my_usb_key_end"
#
# Paramètres
#
ACTION=="add",ENV{ID_OPTIONS}="defaults,auto"
#
# Ajout des liens symboliques
#
ACTION=="add",KERNEL=="sd[b-z]1",SYMLINK+="my_usb_key_1"
ACTION=="add",KERNEL=="sd[b-z]2",SYMLINK+="my_usb_key_2"
#
# Montage des partitions
#
ACTION=="add",KERNEL=="sd[b-z]1",RUN+="/bin/mount -t $env{ID_FS_TYPE} -o $env{ID_OPTIONS} /dev/%k /mnt/boot"
ACTION=="add",KERNEL=="sd[b-z]2",RUN+="/bin/mount -t $env{ID_FS_TYPE} -o $env{ID_OPTIONS} /dev/%k /mnt/rootfs"
#
# traitements
#
ACTION=="add",KERNEL=="sd[b-z]1",RUN+="/root/test.sh"
ACTION=="add",KERNEL=="sd[b-z]2",RUN+="/root/test.sh"
#
# Démontage des partitions
#
ACTION=="remove",KERNEL=="sd[b-z]1",RUN+="/bin/umount /mnt/boot"
ACTION=="remove",KERNEL=="sd[b-z]2",RUN+="/bin/umount /mnt/rootfs"
#
#
# fin de la règle "my_usb_key"
#
LABEL="my_usb_key_end"
Cela demande quelques explications.

a) nous retrouvons le filtrage (subsystem, idVendor, idProduct et serial) au début de la règle. Pourquoi ?
Pour deux raisons.
La première est que nous devrions placer ces quatre filtres partout dans toutes les actions que nous allons entreprendre.
Je considère qu'il est inutile de charger les actions par cette façon de faire.

La seconde raison est que nous pouvons filtrer en utilisant un bloc de conditions au travers du GOTO.
Le GOTO, pour se brancher doit être utiliser en association avec "LABEL".
Dans mon exemple, je n'utilise qu'un seul "LABEL" qui correspond à la structure d'un "IF filtrage THEN bloc END".

b) afin de ne pas tout le temps répéter le paramétrage, j'ai créé un section spéciale.
Le paramètre est "ID_OPTIONS", qui ne doit pas exister au préalable.

c) nous avons deux actions possibles (dans notre cas), qui sont "add" pour l'insertion de la clef et "remove" pour son retrait.
Comme nous avons deux partitions, nous devons les identifier.
Cela se fait par : KERNEL=="sd[b-z]1" pour la partition "boot"
et par :KERNEL=="sd[b-z]2" pour la partition "rootfs".

d) sur chaque action, nous pouvons faire un traitement.
j'ai créé quatre traitements qui sont :
--> les liens symboliques
--> le montage des partitions
--> l'exécution d'un traitement (ici il est bidon car je ne fais que visualiser les variables d'environnements).
--> démontage des partitions en cas de retraits de la clef USB.

e) et bien sûr, pour terminer le bloc, mettre le "label".

8) le montage des partitions.

C'est que j'ai rentré quelques problèmes.
Si manuellement cela peut se résumer à :

Code : Tout sélectionner

mount /dev/sdb2 /mnt/rootfs
il n'en est pas de même dans une règle "UDEV".

Après une recherche sur le NET, il faut ajouter le type de partition, à savoir "vfat" et "ext4".
Cette information se trouve dans la variable d'environnement "ID_FS_TYPE", comme on peut le voir ci-après :

Code : Tout sélectionner

~> udevadm info /dev/sdb1 | grep ID_FS_TYPE
E: ID_FS_TYPE=vfat
~> udevadm info /dev/sdb2 | grep ID_FS_TYPE
E: ID_FS_TYPE=ext4
~>
Ensuite, il faut préciser quelques options comme dans le fichier "/etc/fstab".
J'ai choisi "defaults,auto".

Si dans l'état du service "UDEV", vous obtenez ceci :

Code : Tout sélectionner

~> systemctl status  udev
? systemd-udevd.service - udev Kernel Device Manager
   Loaded: loaded (/lib/systemd/system/systemd-udevd.service; static; vendor preset: enabled)
   Active: active (running) since Thu 2018-09-20 05:37:51 CEST; 1min 43s ago
     Docs: man:systemd-udevd.service(8)
           man:udev(7)
 Main PID: 1467 (systemd-udevd)
   Status: "Processing with 16 children at max"
   CGroup: /system.slice/systemd-udevd.service
           +-1467 /lib/systemd/systemd-udevd

sept. 20 05:37:51 RaspberryPi systemd[1]: Starting udev Kernel Device Manager...
sept. 20 05:37:51 RaspberryPi systemd[1]: Started udev Kernel Device Manager.
sept. 20 05:38:05 RaspberryPi mtp-probe[1474]: checking bus 1, device 11: "/sys/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2"
sept. 20 05:38:13 RaspberryPi systemd-udevd[1480]: Process '/bin/mount -o default /dev/sdb1 /mnt/boot' failed with exit code 32.
sept. 20 05:38:13 RaspberryPi systemd-udevd[1482]: Process '/bin/mount -o default /dev/sdb2 /mnt/rootfs' failed with exit code 32.
sept. 20 05:49:00 RaspberryPi systemd-udevd[1583]: Process '/bin/umount -l /mnt/boot' failed with exit code 32.
sept. 20 05:49:00 RaspberryPi systemd-udevd[1587]: Process '/bin/umount -l /mnt/rootfs' failed with exit code 32.
~>
c'est-à-dire un "exit code 32", vous avez un problème de montage.
Cela se résout par le paramétrage de la commande "mount".

9) recharger les règles.

Code : Tout sélectionner

udevadm control --reload-rules
10) lancement du service "UDEV".

Code : Tout sélectionner

systemctl restart udev.service
11) L'état du service "UDEV".

Code : Tout sélectionner

systemctl status udev.service
C'est ce qui permet de savoir si la règle s'est bien passée ou pas.

12) Pourquoi le montage ne s'effectue pas, même si le code retour est ok ?
Après une recherche sur le NET, vous devez modifier un paramètre dans le service "UDEV".
Le source se trouve dans "/lib/systemd/system/systemd-udevd.service".
Vous recherchez le paramètre "MountFlags".
Avant, il y a "slave". Vous mettez "shared".

Après la modification, vous rechargez le service :

Code : Tout sélectionner

systemctl daemon-reload
Puis vous relancez le service (voir §10).

En principe, si vous n'avez pas de exit code 32, le montage doit se faire correctement.

13) conclusion.

C'est l'astuce du paragraphe 12) qui m'a bloqué dans la résolution de cette règle "UDEV".
Sinon, il n'est pas très compliqué d'automatiser des traitements à l'insertion ou au retrait d'un clef USB.

Si j'ai oublié quelque chose, je modifierais ce message. Si vous avez des questions, n'hésitez pas !

@+
RPI4B/8GB + Argon FanHAt
Rpi3A+, Rpi3B+
RPi 2B + Joy-It I2C Serial 20x4 2004 LCD Module
RPi 2B + PIM273 Unicorn HAT HD 16x16 Leds RGB
RPi0v1.3, RPi0W + LibreElec/Kodi, Rpi0WH + Tuner TV HAT
NodeMCU ESP32

Artemus24
Raspinaute
Messages : 1077
Enregistré le : ven. 15 sept. 2017 19:15

Re: [Tuto]Création d'une règle UDEV pour automatiser l'insertion d'un clef USB !

Message par Artemus24 » ven. 28 déc. 2018 05:54

Salut beyonslay.

Je n'ai aucun conseil à vous donner car j'ignore l'usage que vous désirez faire de votre clef USB.
A priori, n'importe quelle clef USB peut être utilisé.

@+
RPI4B/8GB + Argon FanHAt
Rpi3A+, Rpi3B+
RPi 2B + Joy-It I2C Serial 20x4 2004 LCD Module
RPi 2B + PIM273 Unicorn HAT HD 16x16 Leds RGB
RPi0v1.3, RPi0W + LibreElec/Kodi, Rpi0WH + Tuner TV HAT
NodeMCU ESP32

dyox
Raspinaute
Messages : 969
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: [Tuto]Création d'une règle UDEV pour automatiser l'insertion d'un clef USB !

Message par dyox » mar. 15 juin 2021 10:29

Salut Artemus24,
Pourquoi ce "10" ? Je n'ai pas trouvé de raison à cela.
Depuis le temps tu as dû trouver la réponse : les scripts sont exécutés dans lors croissants donc les plus importants sont mis en 1er.

J'applique enfin ton tuto pour me faire une synchro auto de fichiers (en mode mirroir) avec rsync.

Pour l'instant je procède par étape : création d'un fichier lors de l'insertion.

Test fait sous Linux Mint.
Pour affiner la reconnaissance de la clé et pour qu'elle soit unique, je veux utiliser les attributs "fabricant", "produit" et "série".
Lors de mes recherches, et à une époque (2009), il fallait choisir ses attributs dans un même parent device et ne surtout pas les croisés mais maintenant je crois que la restriction est levée.
Pour mon cas, c'est sous le même parent device donc la question ne se pose pas mais on ne sait jamais.

Je n'utilise qu'une seule commande pour créer ma règle : sudo udevadm info -a /dev/sdb1
Dont voici le résultat:

Code : Tout sélectionner

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/host1/target1:0:0/1:0:0:0/block/sdb/sdb1':
    KERNEL=="sdb1"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{inflight}=="       0        0"
    ATTR{stat}=="      62        0     3744      237        2        0       16        3        0      228      240        0        0        0        0        0        0"
    ATTR{start}=="2048"
    ATTR{size}=="126095360"
    ATTR{discard_alignment}=="0"
    ATTR{partition}=="1"
    ATTR{alignment_offset}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/host1/target1:0:0/1:0:0:0/block/sdb':
    KERNELS=="sdb"
    SUBSYSTEMS=="block"
    DRIVERS==""
    ATTRS{stat}=="     139        0     6408      460        2        0       16        3        0      296      463        0        0        0        0        0        0"
    ATTRS{events_async}==""
    ATTRS{events_poll_msecs}=="-1"
    ATTRS{inflight}=="       0        0"
    ATTRS{range}=="16"
    ATTRS{size}=="126162944"
    ATTRS{alignment_offset}=="0"
    ATTRS{hidden}=="0"
    ATTRS{removable}=="1"
    ATTRS{events}=="media_change"
    ATTRS{discard_alignment}=="0"
    ATTRS{ext_range}=="256"
    ATTRS{ro}=="0"
    ATTRS{capability}=="51"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/host1/target1:0:0/1:0:0:0':
    KERNELS=="1:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{rev}=="0.00"
    ATTRS{evt_capacity_change_reported}=="0"
    ATTRS{model}=="Voyager GT 3.0  "
    ATTRS{queue_depth}=="1"
    ATTRS{iorequest_cnt}=="0xca"
    ATTRS{queue_type}=="none"
    ATTRS{type}=="0"
    ATTRS{evt_media_change}=="0"
    ATTRS{evt_lun_change_reported}=="0"
    ATTRS{eh_timeout}=="10"
    ATTRS{evt_soft_threshold_reached}=="0"
    ATTRS{state}=="running"
    ATTRS{iocounterbits}=="32"
    ATTRS{dh_state}=="detached"
    ATTRS{scsi_level}=="3"
    ATTRS{inquiry}==""
    ATTRS{timeout}=="30"
    ATTRS{max_sectors}=="240"
    ATTRS{evt_mode_parameter_change_reported}=="0"
    ATTRS{iodone_cnt}=="0xca"
    ATTRS{evt_inquiry_change_reported}=="0"
    ATTRS{ioerr_cnt}=="0x1"
    ATTRS{device_busy}=="0"
    ATTRS{vendor}=="Corsair "
    ATTRS{device_blocked}=="0"
    ATTRS{blacklist}==""

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/host1/target1:0:0':
    KERNELS=="target1:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/host1':
    KERNELS=="host1"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0':
    KERNELS=="1-2:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb-storage"
    ATTRS{bInterfaceProtocol}=="50"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceSubClass}=="06"
    ATTRS{authorized}=="1"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bInterfaceClass}=="08"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2':
    KERNELS=="1-2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{manufacturer}=="Corsair"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{idVendor}=="1b1c"
    ATTRS{bDeviceClass}=="00"
    ATTRS{version}==" 2.10"
    ATTRS{ltm_capable}=="no"
    ATTRS{rx_lanes}=="1"
    ATTRS{configuration}==""
    ATTRS{authorized}=="1"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="218160000000006"
    ATTRS{bcdDevice}=="0000"
    ATTRS{devnum}=="11"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{devpath}=="2"
    ATTRS{busnum}=="1"
    ATTRS{urbnum}=="584"
    ATTRS{idProduct}=="1a01"
    ATTRS{bmAttributes}=="80"
    ATTRS{speed}=="480"
    ATTRS{product}=="Voyager GT 3.0"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{maxchild}=="0"
    ATTRS{bMaxPower}=="400mA"
    ATTRS{tx_lanes}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{removable}=="removable"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{version}==" 2.00"
    ATTRS{devpath}=="0"
    ATTRS{maxchild}=="16"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{urbnum}=="223"
    ATTRS{bmAttributes}=="e0"
    ATTRS{authorized_default}=="1"
    ATTRS{authorized}=="1"
    ATTRS{interface_authorized_default}=="1"
    ATTRS{product}=="xHCI Host Controller"
    ATTRS{bMaxPower}=="0mA"
    ATTRS{devnum}=="1"
    ATTRS{bDeviceClass}=="09"
    ATTRS{idProduct}=="0002"
    ATTRS{idVendor}=="1d6b"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{bcdDevice}=="0508"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{manufacturer}=="Linux 5.8.0-55-generic xhci-hcd"
    ATTRS{rx_lanes}=="1"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{speed}=="480"
    ATTRS{serial}=="0000:00:14.0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{tx_lanes}=="1"
    ATTRS{ltm_capable}=="no"
    ATTRS{busnum}=="1"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"

  looking at parent device '/devices/pci0000:00/0000:00:14.0':
    KERNELS=="0000:00:14.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="xhci_hcd"
    ATTRS{device}=="0xa36d"
    ATTRS{local_cpus}=="fff"
    ATTRS{dma_mask_bits}=="64"
    ATTRS{index}=="6"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{enable}=="1"
    ATTRS{subsystem_vendor}=="0x1028"
    ATTRS{subsystem_device}=="0x0949"
    ATTRS{vendor}=="0x8086"
    ATTRS{label}=="Onboard - Other"
    ATTRS{ari_enabled}=="0"
    ATTRS{numa_node}=="-1"
    ATTRS{irq}=="127"
    ATTRS{local_cpulist}=="0-11"
    ATTRS{msi_bus}=="1"
    ATTRS{revision}=="0x10"
    ATTRS{driver_override}=="(null)"
    ATTRS{class}=="0x0c0330"
    ATTRS{d3cold_allowed}=="1"
    ATTRS{dbc}=="disabled"
    ATTRS{broken_parity_status}=="0"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""
Tous mes ATTRS apparaîssent sous le même parent device : looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2':
ma règle peut donc s'écrire ACTION=="add", KERNELS=="1-2", SUBSYSTEMS=="usb", ATTRS{manufacturer}=="Corsair", ATTRS{product}=="Voyager GT 3.0", ATTRS{serial}=="218160000000006", RUN+="/home/dyox/Documents/scripts/test.sh"
mais elle fonctionne avec :
ACTION=="add", ATTRS{manufacturer}=="Corsair", ATTRS{product}=="Voyager GT 3.0", ATTRS{serial}=="218160000000006", RUN+="/home/dyox/Documents/scripts/test.sh"

Yapluka créer un vrai script de synchro !

Artemus24
Raspinaute
Messages : 1077
Enregistré le : ven. 15 sept. 2017 19:15

Re: [Tuto]Création d'une règle UDEV pour automatiser l'insertion d'un clef USB !

Message par Artemus24 » mar. 15 juin 2021 18:04

Salut Dyox.

Oui, je savais que cela s'exécute dans l'ordre.
Mais depuis, je ne suis pas revenu sur cette astuce.

@+
RPI4B/8GB + Argon FanHAt
Rpi3A+, Rpi3B+
RPi 2B + Joy-It I2C Serial 20x4 2004 LCD Module
RPi 2B + PIM273 Unicorn HAT HD 16x16 Leds RGB
RPi0v1.3, RPi0W + LibreElec/Kodi, Rpi0WH + Tuner TV HAT
NodeMCU ESP32

sewive
Messages : 2
Enregistré le : jeu. 29 juil. 2021 00:56

Re: [Tuto]Création d'une règle UDEV pour automatiser l'insertion d'un clef USB !

Message par sewive » jeu. 29 juil. 2021 00:58

Salut, merci pour ce tuto vraiment très pratique.

Répondre

Retourner vers « Tutoriels »