web-dev-qa-db-fra.com

Comment déboguer une règle Udev (dans /etc/udev/roules.d / ...)

Je crée une nouvelle règle de base

/etc/udev/rules.d/10-myrule.rules

contenant:

KERNEL!="sdb*", GOTO="auto_mount_end"
ACTION=="add", RUN+="/usr/bin/mount /dev/sdb1 /media"
LABEL="auto_mount_end"

J'ai sauvegardé, redémarré et inséré une carte SD (reconnu par /dev/sdb1, Je le vois avec dmesg), mais rien ne se passe. Quand je fais manuellement mount /dev/sdb1 /media, Ça marche.

Comment puis-je dépanner/déboguer une telle règle udev?

Remarque: J'utilise Archlinux, mais cela devrait être le même sur n'importe quelle distribution?

15
Basj
  • 10- Comme mentionné par Jasonwryan, utilisez la numérotation élevée (70 ans). Donc, votre règle ne va pas être remplacée par une autre.
  • Utilisez les touches minimales exactement comme vous avez vraiment besoin. Exemple, != & GOTO/LABEL, utilisez plutôt directement ==

    ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    
  • Votre cible était sdb1 avec commande fixe, minimisez le match aveugle en utilisant KERNEL=="sdb1"

  • Je trouve utile de créer une règle de débogage de l'ombre, j'ai appelé Shadow parce que je le laissais toujours dans le même fichier, alors je l'utilise quand j'en ai besoin.

    ACTION=="add", KERNEL=="sdb*", RUN+="/bin/sh -c 'echo == >> /home/user/Desktop/udev-env.txt; env >> /home/user/Desktop/udev-env.txt'"
    #ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    

    ( Remarque: udev-env.txt est créé alors la règle est déclenchée de toute façon. Ligne == correspondant à un nœud correspondant. L'ENV enregistré dans ce fichier pourrait être mélangé entre 2 nœuds ou plus, créé presque en même temps, c'est un problème de tampon stdout.

  • Utilisation udevadm monitor -u, udevadm test ... et udevadm trigger ... Pour vérifier quelles règles ont traité les événements.

  • À l'intérieur, les scripts sont à vous de faire un journal de débogage et de capter les commandes échouées, en enregistrant leur valeur de retour également stdout & stderr messages.

Mise à jour :

  • Référence: dev_237 - man udev (Ubuntu_18.04)

    RUN{type}

    Note that running programs that access the network or mount/unmount filesystems is not
    allowed inside of udev rules, due to the default sandbox that is enforced on
    systemd-udevd.service.
    
11
user.dz
  1. Créer un fichier de règles udev

    Sudo nano /etc/udev/rules.d/99-removable-sd.rules
    
  2. Ajouter une règle qui dit aux uDisks de l'automner

    SUBSYSTEM=="block", SUBSYSTEMS=="mmc", DRIVERS=="mmcblk", ATTRS{type}=="SD", ENV{UDISKS_AUTO}="1", ENV{UDISKS_SYSTEM}="0"
    

    ATTRS{type}=="SD" Peut être nécessaire si vous utilisez différents types.

  3. Règles de rechargement

    Sudo udevadm control -R
    
  4. Éjectez-le ensuite remettre.

Référence:Archlinux wiki: certains appareils, qui doivent être traités comme amovibles, ne sont pas

1
user.dz

Je pense que la commande que vous recherchez ici est udevadm. Vous utiliserez les paramètres trigger et test afin de déclencher une modification des événements UDEM et de tester un événement spécifique, respectivement.

J'ai appris cela la solution difficile lorsque vous portez avec le nouveau périphérique réseau nommant à El 7. Bonne chance!

1
Paul

J'avais le même problème avec Raspberry Pi 3 B +, il pourrait être possible que les commandes ci-dessus puissent vous aider. Mais c'est DID pas m'aider. J'essayais d'appeler un script sur l'insertion d'un périphérique de stockage USB. Les règles ne sont pas connectées à Syslog. Il devient donc très difficile de comprendre quelle règle a fonctionné ou quelle règle a échoué.

J'ai donc fait ce qui suit:

(1) J'ai fait mon fichier de règles dans /etc/udev/roules.d/100-myrule.rules

(2) Puis j'ai couru la commande Sudo /etc/init.d/udev restart

ensuite, j'ai vérifié ça a fonctionné. Une information, peut vous être utile ou non, mais les systèmes de fichiers sont libellés pour Udev jusqu'à ce que la commande à (2) soit exécutée.

0
MSharq