Как отладить правило 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что-то нормальное поведение udev?
Basj

1
попробуй udevadm monitor, посмотри на это и на это
Водолей Сила

1
На самом деле, никто не должен перезагружаться, чтобы 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"

  • Я считаю полезным создать правило отладки теней, которое я назвал shadow, потому что я всегда оставляю его там в одном и том же файле, поэтому я использую его, когда мне это нужно.

    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, записанный в этом файле, может быть смесью между 2 или более узлами, созданными почти одновременно, это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-накопителя. Правила не регистрируются в системном журнале, поэтому становится очень трудно понять, какое правило сработало или какое правило не удалось.

Итак, я сделал следующее:

(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.