Як налагодити правило udev (у /etc/udev/rules.d/…)


15

Я створюю нове основне правило

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

що містить:

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

Я зберег, перезавантажив і вставив SD-карту (розпізнається /dev/sdb1, я це бачу dmesg), але нічого не відбувається. Коли я роблю вручну mount /dev/sdb1 /media, це працює.

Як я можу усунути / налагодити таке udevправило?

Примітка: я використовую ArchLinux, але це має бути однаково на будь-якому дистрибутиві?


1
Змініть ім'я файлу на 99-myrule.rules...
Jasonwryan

@jasonwryan: те саме: нічого не відбувається. Як усунути правило udev? Чи варто його запускати вручну (як у цьому випадку?)
Basj

Чи systemdщось змінює нормальну поведінку удеву?
Бась

1
спробуйте udevadm monitor, подивіться це і це
Сила Водолія

1
AFAIK не потребує перезавантаження, щоб змусити udev перечитати правила (див. Unix.stackexchange.com/a/39371/44760 ). Я зробив свою налагодження udev (що насправді не найпростіша задача!) За допомогою udevadm testта затвердив правила проти реальності udevadm info.
загримсан

Відповіді:


11
  • 10-як згадував Jasonwryan, використовуйте високу нумерацію (добре 90-х). Отже, ви правите, що інший не буде перекритий.
  • Використовуйте мінімальні клавіші так, як вам справді потрібно. Наприклад, !=& GOTO/ LABEL, замість цього використовуйте безпосередньо==

    ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    
  • Ваша мета була sdb1з фіксованою командою, мінімізуйте використання сліпої відповідностіKERNEL=="sdb1"

  • Мені здається корисним створити правило налагодження тіні, я назвав тінь, тому що я завжди залишаю його там, у тому ж файлі, тому я використовую його, коли мені це потрібно.

    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"
    

    Примітка: udev-env.txt створюється, тоді правило все одно запускається. Рядок, що==відповідає одному узлу, що відповідає. ENV, записаний у цьому файлі, може містити між двома вузлами або більше, що створюється майже за один і той же час, цеstdoutпроблема буферизації.

  • Використання udevadm monitor -u, udevadm test ...і udevadm trigger ... перевірити , які правила обробляються події.

  • Всередині сценаріїв залежить від того, щоб зробити журнал налагодження і ловити невдалі команди, зберігаючи також їх повернене значення stdoutта stderrповідомлення.

Оновлення:

  • Довідка: udev_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.
    

1
Дуже корисний. udevadm test...Здається, що пара коментарів показує лише змінні середовища, які ATTRSви можете використовувати udevadm info $DEVICEдля пошуку цих інших налаштувань.
Att Righ

1
При udevadm infoповерненні дерево пристроїв обережно розрізняйте налаштування між пристроєм та його батьківськими пристроями (здається, властивості успадковуються, якщо не переосмислюються). У моєму випадку підсистема була помилковою.
Att Righ

udevadm test "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."Чи немає способу просто простежити, що насправді відбувається?
Марч

@MarcH, ви можете використовувати udevadm monitor -uдля перевірки подій / умов та udevadm trigger ...для перевірки їх дій.
user.dz

@MarcH, але всередині скриптів вам належить скласти журнал налагодження і ловити невдалі команди (збереження їх повернення значення також stdout & stderr повідомлення).
user.dz

1

Я думаю, команда, яку ви шукаєте тут, є udevadm. Ви будете використовувати triggerі testпараметри , щоб викликати повторне сканування Udev подій і перевірити подія конкретного, відповідно.

Про це я навчився важко, використовуючи новий мережевий пристрій для іменування в EL 7. Удачі!


1
  1. Створіть файл правил udev

    sudo nano /etc/udev/rules.d/99-removable-sd.rules
    
  2. Додайте правило, яке повідомляє udisks, щоб автоматизувати його

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

    ATTRS{type}=="SD" може не знадобитися, якщо ви використовуєте різні типи.

  3. Правила перезавантаження

    sudo udevadm control -R
    
  4. Вийняти його, потім поставити назад.

Довідка: Archlinux Wiki: Деякі пристрої, які слід розглядати як знімні, не є


0

У мене була така ж проблема з RASPBERRY PI 3 B +, можливо, вищезгадані команди можуть вам допомогти. Але це НЕ допомогло мені. Я намагався викликати сценарій щодо вставлення USB-накопичувача. Правила не заносяться в syslog, тому стає важко зрозуміти, яке правило працювало чи яке правило не вдалося.

Тому я зробив наступне:

(1) Я створив свій файл правил у /etc/udev/rules.d/100-myrule.rules

(2) потім я запустив команду sudo /etc/init.d/udev restart

потім я перевірив, як це працювало. Інформація може бути корисною для вас, а може і не бути, але файлові системи читаються лише для udev, поки не буде виконана команда в (2).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.