Не получается смонтировать флкшку через udev
Пытаюсь настроить автоматическое монтирование usb-флешки через udev. Написал следующий конфиг с правилами для udev:
Сам скрипт выглядит так:
При полдключении получаю такой лог:
В dmesg получаю следующие сообщения:
Причем вручную все работает, аналогичный конфиг в убунте рабтает, пытаюсь настроить работу в ArchLinux. Директории создаются и удаляются, но монтирования/размонтирования не происходит.
Уроки учи, арчешколота.
Что этим вы хотели сказать?
Дебиан-штабле школолотун решил повыпендриваться.
могу поправить, но от этого суть не изменится
Как ты поправишь то, что ты — арчешколотрон?
Со своей душевной травмой обращайтесь к соответствующим специалистам, мне вам помочь нечем(
Немного погуглив, получилось такое решение:
Сильно не тестировал, вроде как работает, останется только немного допилить. Если кому есть что добавить по теме, буду рад почитать)
Не нужно монтировать флешки через udev, он для этого не предназначен
Монтированием в данном случае занимается systemd, а udev лишь сообщает, инициирует этот процесс.
systemd можно, но скорее всего тоже не очень правильно. Если на флехе файлуха системы, то ок. Если файло пользователя который сидит перед терминалом — не ок.
Файлуху системы лучше через fstab. А тут две строчки текста и все маунтится на автомате. Мне кажется это удобнее чем выяснять как ядро обозвало дивайс, создавать точку монтирования, вспоминать какая там фс и туча опций, а потом ещё и не забыть удалит ненужную директорию, после разминирования.
Источник
Не срабатывает правило udev
ID 12d1:14db Huawei Technologies Co., Ltd. E353/E3131
С недавнего времени отвалилось его переключение в режим модема. Когда делаю вручную
usb_modeswitch -v 12d1 -p 1f01 -J
(1f01 — это его device id в исходном режиме cdrom)
все переключается отлично. А через udev не срабатывает. В 40-usb_modeswitch.rules есть правила:
Вот это последнее правило я добавил вручную, первое было изначально.
Подскажите пожалуйста, что может быть не так.
Что за дистрибутив? Когда подключается модем, после полного запуска системы или он подключен во время запуска?
Дистрибутив Arch. Модем втыкается после того, как все уже загружено. В итоге определяется как cdrom, переключение не происходит. Месяц назад еще все было нормально. На соседнем компе с debian 9 все работает.
У меня было такое же на Gentoo, пришлось откатывать версию usb_modeswitch, но потом я вернулся на новую версию usb_modeswitch, а прописывал в файл настроек свою строку переключения.
Просто в новой версии usb_modeswitch поломали параметры переключения твоего модема.
В файле настроек modeswitch все правильно, когда я его вручную использую -с имя-файла, переключение работает. Вот что странно.
Попробую, и скорее всего это поможет, но хотелось бы понять, в чем дело. Почему вручную все работает — значит проблема не в modeswitch? Через udevadm test я не вижу, что применяется это правило udev. Не могу вот в этом разобраться.
Сделай udevadm test на файле устройства (или в /dev/bus/usb, или в /sys/bus/usb/devices) и запости вывод.
Твоё правило либо вообще не считалось, либо не заматчилось с устройством. В каком оно файле? Найди его в выводе. И да, reload udev’у сделал?
Reading rules file: /usr/lib/udev/rules.d/40-usb_modeswitch.rules
Там два правила, которые, как мне кажется, должны подходить — оба в первом посте написаны. Одно идет изначально, другое я сам добавил. Reload делал, перезагружал уже раз десять.
Почему вообще правило может не матчится? vendor id и device id совпадают. Может, другое правило как-то мешает?
Ты не на том устройстве тестируешь. Ты тестируешь на /dev/sr1 (эмулируемый SCSI-дисковод), а нужно на самом USB-устройстве.
Ах ё, то есть надо было прямо на устройстве, которое в /dev/bus/usb?
Кстати, дошел до чего. Пересмотрел вывод udevadm info, и заменил своем правиле ATTR на ATTRS. Теперь при тестировании, даже вот так на sr1, правило срабатывает. Но реально — все равно ничего не переключается. Если правило изменено, достаточно перезагрузки? Или надо командами заставлять перечитать?
Ах ё, то есть надо было прямо на устройстве, которое в /dev/bus/usb?
Или надо командами заставлять перечитать?
Попробую в понедельник, модем на работе.
Но реально — все равно ничего не переключается. Если правило изменено, достаточно перезагрузки? Или надо командами заставлять перечитать?
Вдогонку: помимо того, что правила в udev нужно перечитывать вручную, тебе всё равно нужно писать правило для основного устройства, а не виртуального. Ты в своём правиле используешь %k — это kernel name устройства. Если писать правило для подустройства, в нём это самое kernel name будет другим, и usb_modeswitch скорее всего просто не поймёт, что с ним делать.
Вдогонку 2: а чем тебя не устроило то правило, которое было там изначально?
Я пробовал и без %k, просто прописав те ключи, которые вручную гарантированно работают. И ничего. Но да, я не перечитал правила, думал достаточно перезагрузки.
Если писать правило для подустройства, в нём это самое kernel name будет другим, и usb_modeswitch скорее всего просто не поймёт, что с ним делать.
В дефолтном правиле тоже %k, и как-то оно годами работало. Не понимаю как.
Можно как-то добуквенно получить ту команду, которую будет вызывать udev и проверить вручную?
Вдогонку 2: а чем тебя не устроило то правило, которое было там изначально?
Тем, что оно не срабатывает. Не только не переключает, но, насколько я понял, вообще не цепляется. Хотя раньше прекрасно все работало из коробки.
Чтобы мое второе правило цеплялось, я вроде добился — в udevadm test видно. Но не перечитал их.
В дефолтном правиле тоже %k, и как-то оно годами работало. Не понимаю как.
В дефолтном правиле матчится правильное устройство, насколько я понимаю. Ну или usb_modeswitch умный и может автоматически пройти вверх по иерархии. Не знаю. Это уже слишком много вангования, а проверить не на чем.
В выхлопе udevadm test, который я выкладывал, не видно чтобы матчилось и срабатывал RUN. Хотя вроде все правильно.
usb_modeswitch с параметрами device id и vendor id от этого cdrom, то есть с теми, которые и прописаны в моем правиле, работает 100% при запуске вручную.
Везде написано, что в RUN надо прописывать абсолютный путь. Я прописал
/usr/bin/usb_modeswitch -v 12d1 -p 1f01 -J
И все заработало.
Но остался вопрос — как же оно работало раньше, и как должны работать 100500 правил в этом файле для различных модемов, в каждом прописан не абсолютный путь.
%k в данном случае дает ‘sr1’ — и usb_modeswitch не может понять что с этим делать. Но во всех правилах написано именно так. Как то же это должно было работать?
Источник
правило udev с для ttyUSB не работает
Я использую Ubuntu 17.10 вместе с адаптером tty-to-USB (добавлю еще в будущем), поэтому намереваюсь создать уникальный идентификатор udev для адаптера.
Я сделал lsusb :
udevadm info -a -n / dev / ttyUSB0 | grep ‘
, таким образом я сделал sudo vi /etc/udev/rules.d/99-usb-serial.rules
после sudo udevadm control —reload-rules & amp; & amp; триггер sudo udevadm Я ожидал некоторого / dev / ttyUSB . но ll / dev / ttyUSB * приведет к
ТОЛЬКО если я опущу ATTRS это работает .
ЛЮБАЯ ИДЕЯ ?? — поскольку добавление большего количества этих адаптеров потребует серийного номера, чтобы различать адаптеры .
Привет! поскольку мне не очень понятно, какие уместные части: я добавляю полный вывод .
2 ответа
Правила Udev не поддерживают условия смешивания из нескольких родительских узлов.
- конечный узел: SUBSYSTEM==»tty»
- родительский режим: ATTRS
==»067b», ATTRS ==»2303″ - другой родительский узел: ATTRS
==»0000:00:16.0″
Это известная проблема со многими адаптерами rs232, у которых нет серийного номера. Обычно пользователи выбирают фиксированный USB-разъем для определенного адаптера и устанавливают правило udeu для этого порта.
Другой вариант, некоторые микросхемы PL2303 могут быть запрограммированы с индивидуальным серийным и даже vid / pid. Инструмент предоставляется бесплатно, но ему нужен адаптер, который подает на микросхему программирующее напряжение 6,5 В (нормальный режим 5 В).
Насколько я знаю, вы можете объединить информацию только одного конкретного ребенка с родителем. В вашей строке
вы объединяете информацию этого ребенка
И этого ребенка
Если вы посмотрите на первое, нет ATTRS ( serial), и если вы посмотрите на последнее, нет ATTRS (idVendor / idProduct).
Источник
Не срабатывает правило udev
тоже не срабатывает
Выяснилось, что надо ATTRS, а не ATTR. Теперь после
Точно ″ATTR″, а не ″ATTRS″?
Куда добавляется правило? Попробуйте включить debug у udev и сделать подключение устойства, может что понятнее будет.
ATTRS действительно сработало!
Правило в /etc/udev/rules.d? После добавления правила демон udev перезапускался? В слаке это делается по # /etc/rc.d/rc.udev reload .
Я не понял сути вопроса. Что конкретно тебе надо-то?
Можно и без шелла, ATTRS
Ой, не ATTRS, а ATTR. И да, можно еще проще — SYSFS
Может, после RUN+= должно быть что-то другое? Какое там событие должно быть для того чтобы устройство не подключалось как клавиатура?
это когда клава поменяется, придётся править конфиг. немного не то. хочется просто чтобы после старта системы распознавалось клавиатурой только то что подключено. а потом всё что подключается не должно распознаваться клавиатурой.
Что должно быть после RUN+= чтобы подключенное устройство не обрабатывалось? Пробовал просто пустой RUN+= — клава всё равно распрзнаётся
чтобы после старта системы распознавалось клавиатурой только то что подключено. а потом всё что подключается не должно распознаваться клавиатурой.
Источник
[РЕШЕНО]Не работает созданное правило udev
# 3 года, 3 месяца назад (отредактировано 3 года, 3 месяца назад)
Linux archlinux 4.17.2-1-ARCH/OpenBox
Хотелка: при подключении usb flash, появлялось сообщение о подключении через notify-send
Создал правило в /etc/udev/rules.d/10-mntusb.rules(права -rw-r—r— 1 user user):
ACTION==»add», SUBSYSTEM==»block»,KERNEL==»sd*» RUN+=»/etc/udev/mntusb.sh»
Содержимое /etc/udev/mntusb.sh(права -rwxr-xr-x 1 user user ):
#!/bin/bash
notify-send test
При запуске из консоли скрипт выполняется, при подключении usb -нет
Если в скрипте прописать: touch /home/user/TEST.txt то при подключении USB создается файл /home/user/TEST.txt из чего следует что скрипт выполняется, но не выполняется необходимые команды, из всех что я пробовал выполняется только touch.
Коталог скрипта менял на домашний, менял SUBSYSTEM==»block» на SUBSYSTEM==»usb» и KERNEL==»sd*» на KERNEL==»sd[b-z]2″ а также RUN+=»/etc/udev/mntusb.sh» на RUN+=»/bin/bash /etc/udev/mntusb.sh», менял права файлов на root результата нет.
Подскажите что я делаю не так.
кусок dmesg после подключения usb:
journalctl
# 3 года, 3 месяца назад (отредактировано 3 года, 3 месяца назад)
для получения UID можно использовать например
/etc/udev/rules.d/10-mntusb.rules(внесенные изменения — /usr/bin/su user -c ):
ACTION==»add», SUBSYSTEM==»block»,KERNEL==»sd*», ENV
/home/user/scripts/mntusb.sh(внесенные изменения — export XAUTHORITY=/home/user/.Xauthority
export DISPLAY=:0
export DBUS_SESSION_BUS_ADDRESS=»unix:path=/run/user/1000/bus»):
export XAUTHORITY=/home/user/.Xauthority
export DISPLAY=:0
export DBUS_SESSION_BUS_ADDRESS=»unix:path=/run/user/1000/bus»
/usr/bin/notify-send -i ‘usb-creator-gtk’ ‘USB conected’ -t 5000
© 2006-2021, Русскоязычное сообщество Arch Linux.
Название и логотип Arch Linux ™ являются признанными торговыми марками.
Linux ® — зарегистрированная торговая марка Linus Torvalds и LMI.
Источник