Что такое udev linux

Обновлено: 01.07.2024

Udev (userspace /dev) — это подсистема Linux для динамического обнаружения устройств и управления ими, начиная с версии ядра 2.6. Это замена devfs и hotplug.

Он динамически создает или удаляет узлы устройств (интерфейс к драйверу устройства, который отображается в файловой системе, как если бы это был обычный файл, хранящийся в каталоге /dev) во время загрузки или при добавлении или удалении устройства. устройство из системы. Затем он распространяет информацию об устройстве или изменениях его состояния в пространстве пользователя.

Его функция состоит в том, чтобы 1) снабжать системные приложения событиями устройств, 2) управлять разрешениями узлов устройств и 3) создавать полезные символические ссылки в каталоге /dev для доступа к устройствам или даже переименовывать сетевые интерфейсы.

Одним из преимуществ udev является то, что он может использовать постоянные имена устройств, чтобы гарантировать единообразие имен устройств при перезагрузке, независимо от порядка их обнаружения. Эта функция полезна, потому что ядро ​​просто присваивает устройствам непредсказуемые имена в зависимости от порядка обнаружения.

В этой статье мы узнаем, как использовать Udev для обнаружения устройств и управления ими в системах Linux. Обратите внимание, что большинство, если не все основные современные дистрибутивы Linux поставляются с Udev как часть установки по умолчанию.

Изучите основы Udev в Linux

Демон udev, systemd-udevd (или systemd-udevd.service), связывается с ядром и получает события uevents устройства непосредственно от него каждый раз, когда вы добавляете или удаляете устройство из системы или когда устройство меняет свое состояние.

Udev основан на правилах — эти правила гибкие и очень мощные. Каждое полученное событие устройства сопоставляется с набором правил, считанных из файлов, расположенных в /lib/udev/rules.d и /run/udev/rules.d.

Чтобы создать файл узла устройства, udev должен идентифицировать устройство, используя определенные атрибуты, такие как метка, серийный номер, его старший и младший используемые номера, номер устройства шины и многое другое. Эта информация экспортируется файловой системой sysfs.

Каждый раз, когда вы подключаете устройство к системе, ядро ​​​​обнаруживает и инициализирует его, а в каталоге /sys/ создается каталог с именем устройства, в котором хранятся атрибуты устройства.

Основным файлом конфигурации для udev является /etc/udev/udev.conf, а для управления поведением демона udev во время выполнения вы можете использовать утилиту udevadm.

Чтобы отобразить полученные события ядра (uevents) и события udev (которые udev отправляет после обработки правил), запустите udevadm с командой monitor. Затем подключите устройство к своей системе и посмотрите на терминале, как обрабатывается событие устройства.

На следующем снимке экрана показан фрагмент события ADD после подключения USB-накопителя к тестовой системе:

Контролировать события устройства в Linux

Чтобы найти имя, назначенное вашему USB-диску, используйте утилиту lsblk, которая считывает файловую систему sysfs и базу данных udev для сбора информации об обрабатываемых устройствах.

Список блочных устройств в Linux

Из вывода предыдущей команды USB-диск называется sdb1 (абсолютный путь должен быть /dev/sdb1 ). Чтобы запросить атрибуты устройства из базы данных udev, используйте команду info.

Запрос атрибутов устройства из базы данных Udev в Linux

Как работать с правилами Udev в Linux

В этом разделе мы кратко обсудим, как писать правила udev. Правило состоит из списка, разделенного запятыми, из одной или нескольких пар ключ-значение. Правила позволяют вам переименовывать узел устройства, используя имя по умолчанию, изменять разрешения и владельца узла устройства, запускать выполнение программы или сценария при создании или удалении узла устройства, среди прочего.

Мы напишем простое правило для запуска скрипта при добавлении USB-устройства и при его удалении из работающей системы.

Давайте начнем с создания двух скриптов:

Добавьте следующие строки в скрипт device_added.sh.

Откройте второй скрипт.

Затем добавьте следующие строки в скрипт device_removed.sh.

Сохраните файлы, закройте и сделайте оба скрипта исполняемыми.

Добавьте в него два следующих правила.

Тогда в файле должна быть запись, например "USB-устройство удалено в дату_время", как показано на снимке экрана.

Проверить журнал сценариев после извлечения USB

Для получения дополнительной информации о том, как писать правила udev и управлять udev, обратитесь к справочным записям udev и udevadm соответственно, выполнив:

Обзор

Udev — замечательный диспетчер устройств, который обеспечивает динамический способ настройки узлов устройств в каталоге /dev. Это гарантирует, что устройства будут настроены, как только они будут подключены и обнаружены. Он распространяет информацию об обрабатываемом устройстве или изменениях его состояния в пространстве пользователя.

Если у вас есть вопросы или мысли по этой теме, воспользуйтесь формой обратной связи.

Если вам понравилась эта статья, подпишитесь на уведомления по электронной почте о руководствах по Linux. Если у вас есть вопросы или сомнения? обратитесь за помощью в разделе комментариев.

Если вы цените то, что мы делаем здесь, в TecMint, вам следует подумать о следующем:

TecMint – это самый быстрорастущий и пользующийся наибольшим доверием сайт сообщества, где можно найти любые статьи, руководства и книги по Linux в Интернете. Миллионы людей посещают TecMint! для поиска или просмотра тысяч опубликованных статей, доступных всем БЕСПЛАТНО.

Если вам нравится то, что вы читаете, купите нам кофе (или 2) в знак признательности.

Поддержите нас

Мы благодарны за вашу бесконечную поддержку.

Похожие записи

 Отключить Su Access для пользователя

 Переместить домашний каталог в новый раздел

Система Linux Команды администратора

 Как скачать файлы в Linux

Примеры Linux Cron

Linux Vmstat и команды Iostat

9 мыслей о «Как использовать Udev для обнаружения устройств и управления ими в Linux»

Я пытаюсь запустить скрипт при подключении планшета. Планшет — это «устройство», но не запоминающее устройство. Это тут для устройств хранения. Я думаю, вы должны ясно указать это в заголовке.

Спасибо, это именно то, что мне нужно!

Прежде всего спасибо за статью. У меня вопрос, можно ли использовать udev, чтобы не отображались сообщения при обнаружении USB?

Я буду признателен за вашу поддержку.

Я никогда не пробовал это, но это должно быть возможно. Вам нужно написать соответствующие правила, чтобы это произошло.

Ну, я пытался это сделать. однако основная цель того, что я пытаюсь сделать, — скрыть USB при использовании, например, lsblk.

Я знаю, как это сделать в своей Ubuntu (удалить UAS и usb_storage), и проблема в том, что я пытаюсь сделать это в системе LFS, где нет ни UAS, ни usb_storage, поэтому я думаю, что udev — это единственный способ сделать это

udev — это замена файловой системы устройства (DevFS), начиная с ядра Linux версии 2.6. Это позволяет динамически идентифицировать устройства на основе их свойств, таких как идентификатор поставщика и идентификатор устройства. udev запускается в пространстве пользователя (в отличие от devfs, который выполнялся в пространстве ядра).

udev позволяет использовать правила, указывающие, какое имя дается устройству, независимо от того, к какому порту оно подключено. Например, возможно правило всегда монтировать жесткий диск с производителем «iRiver» и кодом устройства «ABC» как /dev/iriver. Это согласованное наименование устройств гарантирует, что сценарии, зависящие от существования конкретного устройства, не будут нарушены.

Обзор

Система udev состоит из нескольких служб ядра и демона udevd. Ядро информирует демон udevd, когда происходят определенные события. Демон udevd настроен реагировать на события соответствующими действиями. Информация о событии поступает из ядра — действия происходят в пользовательском пространстве. Реакция на события настраивается в «правилах».

Функциональность udev пользовательского пространства реализована с помощью systemd-udevd.service. Его файл конфигурации находится в /etc/udev/udev.conf. Файлы правил (которые составляют дополнительную конфигурацию для udevd) берутся из /run/udev/rules.d, /etc/udev/rules.d или /lib/udev/rules.d. Пакеты устанавливают правила в /lib/udev/rules.d), а расположения /etc и /run предоставляют администратору возможность переопределить поведение правила, предоставляемого пакетом. Если файл с таким же именем присутствует более чем в одном из этих каталогов, то последний файл(ы) будет проигнорирован. Файлы там анализируются в альфа-порядке, если имя заканчивается на «.rules». При изменении файла конфигурации или файлов правил следует использовать программу udevadm, чтобы указать systemd-udevd перезагрузить правила (см. ниже).

udev был создан, чтобы реагировать на события типа горячего подключения. Многие документы относятся к созданию устройств в ответ на появление новых устройств. Но udev носит более общий характер; он может запускать произвольные команды пользовательского пространства в ответ на появление нового устройства или любые другие события, которые он получает от ядра.

Udev — это диспетчер устройств для ядра Linux. Udev динамически создает или удаляет файлы узлов устройств во время загрузки в каталоге /dev для всех типов устройств. Udev теперь является частью systemd, в чем вы можете убедиться, просмотрев имена файлов «udev», включенные в RPM-пакет systemd.

Демон Udev, systemd-udevd, получает события uevents устройства непосредственно из ядра всякий раз, когда устройство добавляется или удаляется из системы. Для каждого события systemd-udevd выполняет соответствующие инструкции, указанные в правилах Udev.

Имена файлов устройств могут измениться при удалении дисков из системы из-за сбоя. Например, во время загрузки устройства называются /dev/sda, /dev/sdb и /dev/sdc. Но при следующей перезагрузке /dev/sdb происходит сбой, и то, что раньше было /dev/sdc, называется /dev/sdb. Любые ссылки конфигурации на /dev/sdb теперь содержат содержимое, на которое первоначально ссылался /dev/sdc.

Решение, позволяющее избежать подобных ситуаций, состоит в том, чтобы гарантировать согласованность имен для устройств после перезагрузки. Вы можете настроить Udev для создания постоянных имен и использования этих имен в таблице монтирования файловой системы, /etc/fstab или в качестве аргумента команды монтирования.

Файлы и каталоги правил Udev

Правила Udev определяют, как идентифицировать устройства и как назначать имя, которое сохраняется после перезагрузки или замены диска. Когда Udev получает событие устройства, оно сопоставляет настроенные правила с атрибутами устройства в sysfs, чтобы идентифицировать устройство. Правила также могут указывать дополнительные программы для запуска в рамках обработки событий устройства.
Файлы правил Udev находятся в следующих каталогах:

  • /lib/udev/rules.d/ — каталог правил по умолчанию
  • /etc/udev/rules.d/ — каталог пользовательских правил. Эти правила имеют приоритет.

Файлы правил должны иметь уникальные имена. Файлы в каталоге пользовательских правил переопределяют файлы с тем же именем в каталоге правил по умолчанию. Файлы правил сортируются и обрабатываются в лексическом порядке. Ниже приведен частичный список файлов правил из каталогов правил по умолчанию и пользовательских правил:

Примеры правил Udev

  • == : сравнение на равенство
  • != : сравнение на наличие неравенства
  • = : присвоить значение ключу.
  • += : добавить значение к текущим значениям ключа.
  • := : присвоить ключу окончательное значение. Запретить любые более поздние изменения любыми более поздними правилами.
<р>4. Сопоставление шаблонов в стиле оболочки (*, ?, []) также поддерживается в правилах Udev.

Ключи сопоставления

Следующие имена ключей используются для сопоставления со свойствами устройства. Некоторые ключи также соответствуют свойствам родительских устройств в sysfs, а не только устройству, сгенерировавшему событие. Если в одном правиле указано несколько ключей, все эти ключи должны совпадать.

  • ДЕЙСТВИЕ: Сопоставьте название действия события.
  • DEVPATH: Сопоставьте путь разработчика устройства события.
  • KERNEL: соответствует имени устройства события.
  • ИМЯ: соответствует имени сетевого интерфейса. Его можно использовать, если ключ NAME был установлен в одном из предыдущих правил.
  • SYMLINK: Соответствует имени символической ссылки, ведущей к узлу. Его можно использовать, если ключ SYMLINK был установлен в одном из предыдущих правил. Символических ссылок может быть несколько, но совпадать должна только одна.
  • SUBSYSTEM: соответствует подсистеме событийного устройства.
  • ТЕСТ: проверка существования файла. Вы можете указать маску восьмеричного режима.

К другим ключам соответствия относятся DRIVER, ATTR, KERNELS, SUBSYSTEMS, DRIVERS, ATTRS, TAGS, ENV, TAG, PROGRAM и RESULT.

Ключи назначения

Следующим ключам могут быть назначены значения:

  • ИМЯ — имя, используемое для сетевого интерфейса. Udev не может изменить имя узла устройства, можно только создать дополнительные символические ссылки.
  • SYMLINK — имя символической ссылки, ведущей к узлу.
  • ВЛАДЕЛЕЦ, ГРУППА, РЕЖИМ — разрешения для узла устройства.
  • ОПЦИИ – параметры правил и устройств. Параметр ignore_remove, использованный в примере, означает «Не удалять узел устройства, когда устройство отключается».

К другим клавишам назначения относятся ATTR, ENV, TAG, RUN, LABEL, GOTO, IMPORT, WAIT_FOR и OPTIONS.

Замены строк

  • %M – основной номер ядра устройства.
  • %m — дополнительный номер ядра для устройства.

Поддерживаются дополнительные замены строк. Обратитесь к справочной странице udev, чтобы узнать обо всех поддерживаемых заменах и подробностях о дополнительных ключах совпадения, дополнительных ключах назначения, а также дополнительных параметрах правил и устройств.

Утилита udevadm

Утилита udevadm — это инструмент управления пользовательским пространством для Udev. Среди других функций вы можете использовать udevadm для запроса sysfs и получения атрибутов устройства, чтобы помочь в создании правил Udev, соответствующих устройству. Чтобы отобразить использование udevadm:

Вы также можете получить сведения об использовании каждой из команд udevadm. Например, чтобы получить справку по использованию команды info:

Пример утилиты udevadm

Примеры ниже. Чтобы запросить в базе данных Udev путь к устройству /dev/xvdd:

Чтобы запросить в базе данных Udev всю информацию об устройствах для /dev/xvda:

Введите следующее, чтобы распечатать все свойства sysfs /dev/xvda. Эти свойства можно использовать в правилах Udev для соответствия устройству. Он печатает все устройства по цепочке, вплоть до корня sysfs.

Создание символической ссылки на узел устройства

Следующее правило создает символическую ссылку /dev/my_disk на узел устройства /dev/xvdd. Вы можете создать правило Udev для изменения имени сетевого интерфейса, но Udev не может изменить имя узла устройства. Для узлов устройств можно создавать только дополнительные символические ссылки.

Создайте сценарий, который запускает ваш компьютер для выполнения определенного действия при подключении определенного устройства.

Новый рецепт для здравоохранения с открытым исходным кодом

Udev — это подсистема Linux, которая обеспечивает ваш компьютер событиями устройства. Проще говоря, это означает, что это код, который определяет, когда к вашему компьютеру подключены такие устройства, как сетевая карта, внешние жесткие диски (включая флэш-накопители USB), мыши, клавиатуры, джойстики и геймпады, приводы DVD-ROM и т. д. на. Это делает ее потенциально полезной утилитой, и она достаточно хорошо зарекомендовала себя, чтобы обычный пользователь мог вручную создать сценарий для выполнения таких действий, как выполнение определенных задач при подключении определенного жесткого диска.

В этой статье рассказывается, как создать сценарий udev, запускаемый некоторым событием udev, например подключением определенного флэш-накопителя. Как только вы поймете, как работать с udev, вы сможете использовать его для самых разных целей, например, для загрузки определенного драйвера при подключенном геймпаде или выполнения автоматического резервного копирования при подключении резервного диска.

Базовый сценарий

Лучше всего работать с udev небольшими порциями. Не пишите весь сценарий заранее, а вместо этого начните с чего-то, что просто подтверждает, что udev запускает какое-то пользовательское событие.

В зависимости от цели вашего скрипта вы не можете гарантировать, что когда-либо увидите результаты скрипта своими глазами, поэтому убедитесь, что ваш скрипт регистрирует успешный запуск. Обычно файлы журналов размещаются в каталоге /var, но в основном это домен пользователя root. Для тестирования используйте /tmp, который доступен обычным пользователям и обычно очищается при перезагрузке.

Откройте свой любимый текстовый редактор и введите этот простой скрипт:

Поместите это в /usr/local/bin или другое место в пути к исполняемому файлу по умолчанию. Назовите его trigger.sh и, конечно же, сделайте его исполняемым с помощью chmod +x.

Этот скрипт не имеет ничего общего с udev. При выполнении скрипт помещает метку времени в файл /tmp/udev.log. Протестируйте скрипт самостоятельно:

Следующий шаг — заставить udev запускать скрипт.

Уникальная идентификация устройства

Чтобы ваш сценарий запускался событием устройства, udev должен знать, при каких условиях он должен вызывать сценарий. В реальной жизни вы можете определить флэш-накопитель по его цвету, производителю и тому факту, что вы только что подключили его к компьютеру. Однако вашему компьютеру нужен другой набор критериев.

Udev идентифицирует устройства по серийным номерам, производителям и даже идентификаторам поставщиков и продуктов. Поскольку это ранний этап жизни вашего сценария udev, будьте как можно более широкими, неконкретными и всеохватывающими. Другими словами, вы хотите сначала перехватить практически любое допустимое событие udev, чтобы запустить ваш скрипт.

С помощью команды udevadm monitor вы можете подключиться к udev в режиме реального времени и посмотреть, что он видит при подключении разных устройств. Станьте пользователем root и попробуйте.

Функция монитора распечатывает полученные события для:

  • UDEV: событие, которое udev отправляет после обработки правила
  • KERNEL: событие ядра

Запустив монитор udevadm, подключите флэш-накопитель и наблюдайте, как на экран выводится всевозможная информация. Обратите внимание, что типом события является событие ADD. Это хороший способ определить, какое мероприятие вы хотите.

Команда udevadm monitor предоставляет много полезной информации, но вы можете просмотреть ее в более красивом формате с помощью команды udevadm info, предполагая, что вы знаете, где в данный момент находится ваша флешка в дереве /dev. Если нет, отключите и снова подключите флэш-накопитель, а затем немедленно выполните следующую команду:

Если эта команда вернула, например, sdb: sdb1, вы знаете, что ядро ​​присвоило вашему флэш-накопителю метку sdb.

Кроме того, вы можете использовать команду lsblk, чтобы увидеть все диски, подключенные к вашей системе, включая их размеры и разделы.

Теперь, когда вы установили, где находится ваш диск в вашей файловой системе, вы можете просмотреть информацию udev об этом устройстве с помощью этой команды:

Это возвращает много информации. Пока сосредоточьтесь на первом блоке информации.

Ваша задача состоит в том, чтобы выбрать те части отчета udev об устройстве, которые наиболее уникальны для этого устройства, а затем указать udev запустить ваш скрипт при обнаружении этих уникальных атрибутов.

Информационный процесс udevadm сообщает об устройстве (указанном путем к устройству), а затем "проходит" вверх по цепочке родительских устройств. Для каждого найденного устройства он выводит все возможные атрибуты в формате ключ-значение. Вы можете составить правило для сопоставления в соответствии с атрибутами устройства и атрибутами одного родительского устройства.

Правило udev должно содержать один атрибут из одного родительского устройства.

Родительские атрибуты — это элементы, описывающие устройство на самом базовом уровне, например это что-то, что было подключено к физическому порту или это что-то с размером или это съемное устройство.

Поскольку метка KERNEL для sdb может меняться в зависимости от того, сколько других дисков было подключено до того, как вы подключили этот флэш-накопитель, это не оптимальный родительский атрибут для правила udev. Тем не менее, он работает для проверки концепции, поэтому вы можете его использовать. Еще лучшим кандидатом является атрибут SUBSYSTEM, который определяет, что это «блочное» системное устройство (именно поэтому команда lsblk выводит список устройств).

Сохраните файл, отключите тестовый флэш-накопитель и перезагрузите компьютер.

Подождите, перезагрузитесь на компьютере с Linux?

Теоретически вы можете просто выполнить команду udevadm control --reload, которая должна загрузить все правила, но на данном этапе игры лучше исключить все переменные. Удев достаточно сложен, и вы не хотите лежать в постели всю ночь, гадая, не сработало ли это правило из-за синтаксической ошибки или вам просто нужно было перезагрузиться. Так что перезагрузитесь независимо от того, что говорит вам ваша гордость POSIX.

Когда ваша система снова подключится к сети, переключитесь на текстовую консоль (нажмите Ctl+Alt+F3 или аналогичную) и подключите флэш-накопитель. Если вы используете недавнее ядро, вы, вероятно, увидите кучу вывода в консоли, когда подключите диск. Если вы видите сообщение об ошибке, такое как Не удалось выполнить /usr/local/bin/trigger.sh, возможно, вы забыли создать скрипт исполняемый. В противном случае, надеюсь, все, что вы видите, это то, что устройство было подключено, оно получило какое-то назначение устройства ядра и т. д.

Теперь момент истины:

Если вы видите самую последнюю дату и время, возвращенные из /tmp/udev.log, udev успешно запустил ваш скрипт.

Преобразование правила во что-то полезное

Проблема с этим правилом в том, что оно слишком общее. Подключение мыши, флэш-накопителя или чужого флэш-накопителя без разбора вызовет ваш сценарий. Настало время сосредоточиться на том, какой именно флэш-накопитель вы хотите запустить для своего скрипта.

Один из способов сделать это — использовать идентификатор поставщика и идентификатор продукта. Чтобы получить эти числа, вы можете использовать команду lsusb.

В этом примере 03f0:3307 перед TyCoon Corp. обозначает атрибуты idVendor и idProduct. Вы также можете увидеть эти числа в выводе udevadm info -a -n /dev/sdb | grep, но мне кажется, что вывод lsusb немного удобен для глаз.

Теперь вы можете включить эти атрибуты в свое правило.

Протестируйте это (да, вам все равно следует перезагрузиться, просто чтобы убедиться, что вы получаете свежие реакции от udev), и оно должно работать так же, как и раньше, только теперь, если вы подключите, скажем, флэш-накопитель производства другая компания (поэтому с другим idVendor), мышь или принтер, сценарий не будет запущен.

Продолжайте добавлять новые атрибуты, чтобы лучше сосредоточиться на том одном уникальном флэш-накопителе, который вы хотите активировать для своего скрипта. Используя udevadm info -a -n /dev/sdb, вы можете узнать такие вещи, как имя поставщика, иногда серийный номер, название продукта и т. д.

В целях безопасности добавляйте только один новый атрибут за раз.Большинство ошибок, которые я совершал (и видел, как делают другие люди в сети), заключались в том, чтобы добавить кучу атрибутов в правило udev и задаться вопросом, почему эта штука больше не работает. Тестирование атрибутов по одному – самый безопасный способ убедиться, что udev сможет успешно идентифицировать ваше устройство.

Безопасность

Это поднимает вопросы безопасности, связанные с написанием правил udev для автоматического выполнения каких-либо действий при подключении диска. На моих машинах у меня даже не включено автоматическое монтирование, и тем не менее в этой статье предлагаются сценарии и правила, которые выполняются команды, просто подключив что-то.

Здесь следует помнить о двух вещах.

  1. Сосредоточьтесь на правилах udev после того, как они заработают, чтобы они запускали сценарии только тогда, когда вы действительно этого хотите. Выполнение сценария, который слепо копирует данные на ваш компьютер или с него, — плохая идея, если кто-то, у кого есть флешка той же марки, подключит ее к вашему компьютеру.
  2. Не пишите свои правила и сценарии udev и не забывайте о них. Я знаю, на каких компьютерах установлены мои правила udev, и чаще всего это мои личные компьютеры, а не те, которые я беру с собой на конференции или ставлю в своем офисе на работе. Чем более «социальным» является компьютер, тем меньше вероятность того, что на нем будет установлено правило udev, которое потенциально может привести к тому, что мои данные окажутся на чьем-то другом устройстве или чьи-то данные или вредоносные программы будут на моем устройстве. .

Другими словами, как и в случае с огромным количеством возможностей, предоставляемых системой GNU, ваша работа заключается в том, чтобы помнить о том, как вы распоряжаетесь этой силой. Если вы злоупотребляете им или не относитесь к нему с уважением, все может пойти совсем не так.

Удев в реальном мире

Теперь, когда вы можете подтвердить, что ваш скрипт запускается udev, вы можете обратить внимание на функцию скрипта. Прямо сейчас это бесполезно, ничего не делает, кроме регистрации факта его выполнения.

Я использую udev для запуска автоматического резервного копирования своих флэш-накопителей. Идея состоит в том, что основные копии моих активных документов находятся на моем флэш-накопителе (поскольку он везде, где бы я ни был, и с ним можно работать в любой момент), и эти основные документы копируются на мой компьютер каждый раз, когда я подключаю накопитель к сети. эта машина. Другими словами, мой компьютер является резервным диском, а мои производственные данные мобильны. Исходный код доступен, так что не стесняйтесь просматривать код вложения для получения дополнительных примеров ограничения ваших тестов udev.

Поскольку я чаще всего использую udev, я воспользуюсь этим примером и здесь, но udev может захватывать множество других вещей, например геймпады (это полезно в системах, которые не настроены на загрузку модуля xboxdrv, когда подключен геймпад), а также камеры и микрофоны (полезно для настройки входов, когда подключен определенный микрофон), поэтому помните, что это подходит для гораздо большего, чем этот один пример.

Простая версия моей системы резервного копирования представляет собой процесс с двумя командами:

Первая строка определяет мой флэш-накопитель с уже обсуждаемыми атрибутами, а затем назначает флэш-накопителю символическую ссылку в дереве устройств. Символическая ссылка, которую он назначает, — безопасность% n. %n — это макрос udev, который преобразуется в любой номер, который ядро ​​присваивает устройству, например sdb1, sdb2, sdb3 и т. д. Таким образом, %n будет 1, 2 или 3.

Это создает символическую ссылку в дереве разработки, поэтому не мешает обычному процессу подключения устройства. Это означает, что если вы используете среду рабочего стола, которая любит автоматически монтировать устройства, вы не будете создавать для нее проблем.

Вторая строка запускает скрипт.

Мой сценарий резервного копирования выглядит следующим образом:

Сценарий использует символическую ссылку, что позволяет избежать возможности того, что udev присвоит диску неожиданное имя (например, если у меня уже есть флэш-накопитель с именем DISK, подключенный к моему компьютеру, и я подключаю другой флэш-накопитель, также называемый DISK, второй будет помечен как DISK_, что помешает моему сценарию). Он монтирует безопасность1 (первый раздел диска) в предпочитаемую мной точку монтирования /mnt/hd.

После безопасного подключения он использует rsync для резервного копирования диска в мою папку резервных копий (мой реальный сценарий использует rdiff-backup, а ваш может использовать любое решение для автоматического резервного копирования, которое вы предпочитаете).

Удев — ваш разработчик

Udev — очень гибкая система, позволяющая определять правила и функции способами, которые мало кто из других систем осмеливается предоставить пользователям. Изучите его, используйте и наслаждайтесь мощью POSIX.

Эта статья основана на материалах Slackermedia Handbook, на которые распространяется лицензия GNU Free Documentation License 1.3.

udev — это система пользовательского пространства, которая позволяет администратору операционной системы регистрировать обработчики пользовательского пространства для событий. События, полученные демоном udev, в основном генерируются ядром (Linux) в ответ на физические события, связанные с периферийными устройствами. Таким образом, основной целью udev является обнаружение периферийных устройств и оперативное подключение, включая действия, возвращающие управление ядру, например, загрузка модулей ядра или встроенного ПО устройства.

Являясь преемником devfsd и hotplug, udev также управляет узлами устройств в каталоге /dev, добавляя их, создавая символические ссылки и переименовывая их. udev заменяет функции hotplug и hwdetect.

udev обрабатывает отдельные события одновременно (параллельно), что приводит к потенциальному повышению производительности по сравнению со старыми системами. В то же время это может усложнить системное администрирование, поскольку, например, порядок загрузки модулей ядра не сохраняется при загрузке. Если на машине установлено несколько блочных устройств, это может проявляться в виде смены обозначений узлов устройств после перезагрузки. Например, если на машине два жестких диска, /dev/sda при следующей загрузке может стать /dev/sdb. Подробнее об этом читайте ниже.

Содержание

Установка

udev является частью systemd и поэтому устанавливается по умолчанию. Для получения информации см. systemd-udevd.service(8).

Отдельная вилка доступна как eudev AUR и eudev-git AUR .

О правилах udev

Чтобы узнать о правилах udev, обратитесь к руководству по udev(7). Также см. Написание правил udev, а в руководстве приведены некоторые практические примеры: Написание правил udev — Примеры.

пример правила udev

Ниже приведен пример правила, создающего символическую ссылку /dev/video-cam при подключении веб-камеры.

Допустим, эта камера в настоящее время подключена и загружена с именем устройства /dev/video2 . Причина написания этого правила заключается в том, что при следующей загрузке устройство может появиться под другим именем, например /dev/video0 .

Чтобы идентифицировать веб-камеру, на устройстве video4linux мы используем KERNEL=="video2" и SUBSYSTEM=="video4linux" , затем, поднимаясь на два уровня выше, мы сопоставляем веб-камеру, используя поставщика и продукт. Идентификаторы родительского USB-устройства SUBSYSTEMS=="usb" , ATTRS=="05a9" и ATTRS=="4519" .

Теперь мы можем создать соответствие правил для этого устройства следующим образом:

Здесь мы создаем символическую ссылку, используя SYMLINK+="video-cam", но мы можем легко установить пользователя OWNER="john" или группу, используя GROUP="video" или установить разрешения, используя MODE="0660" .

Если вы собираетесь написать правило, которое будет выполнять какие-либо действия при удалении устройства, имейте в виду, что атрибуты устройства могут быть недоступны. В этом случае вам придется работать с предустановленными переменными окружения устройства. Чтобы отслеживать эти переменные среды, выполните следующую команду при отключении устройства:

В выходных данных этой команды вы увидите пары значений, такие как ID_VENDOR_ID и ID_MODEL_ID , которые соответствуют ранее использовавшимся атрибутам idVendor и idProduct . Правило, использующее переменные среды устройства вместо атрибутов устройства, может выглядеть следующим образом:

Список атрибутов устройства

Чтобы получить список всех атрибутов устройства, которые вы можете использовать для написания правил, выполните следующую команду:

Замените device_name на устройство, присутствующее в системе, например /dev/sda или /dev/ttyUSB0 .

Если вы не знаете имя устройства, вы также можете перечислить все атрибуты определенного системного пути:

Чтобы сузить поиск устройства, определите класс и выполните:

Вы можете использовать символическую ссылку напрямую или то, на что она указывает, в качестве входных данных для --name . Например:

Чтобы получить путь к простому USB-устройству, которое не содержит подчиненных устройств, необходимо использовать полный путь к USB-устройству. Запустите режим монитора, а затем подключите USB-устройство, чтобы получить его:

Вы можете просто выбрать самый глубокий путь, и --attribute-walk все равно покажет все родительские атрибуты:

Проверка правил перед загрузкой

Это не будет выполнять все действия в ваших новых правилах, но, тем не менее, обработает правила символических ссылок на существующих устройствах, что может пригодиться, если вы не можете загрузить их иначе. Вы также можете напрямую указать путь к устройству, для которого вы хотите протестировать правило udev:

Загрузка новых правил

udev автоматически обнаруживает изменения в файлах правил, поэтому изменения вступают в силу немедленно, без перезапуска udev. Однако правила не запускаются автоматически на уже существующих устройствах. Устройства с возможностью «горячей» замены, такие как USB-устройства, вероятно, придется повторно подключить, чтобы новые правила вступили в силу, или, по крайней мере, выгрузить и перезагрузить модули ядра ohci-hcd и ehci-hcd и тем самым перезагрузить все USB-драйверы.

Если правила не перезагружаются автоматически:

Чтобы вручную заставить udev активировать ваши правила:

диски

Советы и рекомендации

Монтирование дисков в правилах

Для монтирования съемных дисков не вызывайте mount из правил udev. Это не рекомендуется по двум причинам:

  1. systemd по умолчанию запускает systemd-udevd.service с отдельным «пространством имен монтирования» (см. namespaces(7) ), что означает, что монтирования не будут видны остальной части системы.
  2. Даже если вы измените параметры службы, чтобы исправить это (закомментировав строки PrivateMounts и MountFlags), есть еще одна проблема, заключающаяся в том, что процессы, запущенные из Udev, завершаются через несколько секунд. В случае файловых систем FUSE, таких как NTFS-3G, mount запускает процесс пользовательского пространства для управления внутренними компонентами файловой системы; когда это будет уничтожено, вы получите ошибки «Конечная точка транспорта не подключена», если попытаетесь получить доступ к файловой системе.

Есть несколько работающих вариантов:

  • Запуск пользовательской службы systemd из правила Udev; служба systemd может вызывать сценарий, который запускает любое количество долговременных процессов (например, FUSE). Краткий пример, который автоматически монтирует USB-диски в /media, — это udev-media-automount. Вариант той же идеи объясняется в этой записи блога.
  • Используйте systemd-mount вместо mount в правиле Udev. Это рекомендуется разработчиками systemd. Например, это правило Udev должно монтировать USB-диски в /media :
  • Используйте пакет, например udisks или udiskie. Они очень мощные, но их сложно настроить. Кроме того, они предназначены для использования в однопользовательских сеансах, поскольку они делают доступными некоторые файловые системы, принадлежащие непривилегированному пользователю, чей сеанс в данный момент активен.

Доступ к программаторам прошивки и виртуальным USB-устройствам связи

Следующее правило позволит пользователям из группы пользователей получить доступ к USB-программатору USBtinyISP для микроконтроллеров AVR.

Используйте lsusb, чтобы получить идентификаторы поставщиков и продуктов для других устройств.

Выполнять, когда кабель HDMI подключен или отключен

Выполнить при подключении кабеля VGA

Некоторые менеджеры отображения хранят .Xauthority вне домашнего каталога пользователя. Вам нужно будет соответствующим образом обновить ENV. В качестве примера Диспетчер отображения GNOME выглядит следующим образом:

Установите скорость и ускорение USB-мыши на X11 через xinput на разъеме мыши

Этот раздел рассматривается на предмет удаления.

Создайте скрипт, чтобы установить нужные свойства и сделать его исполняемым, например:

Далее определите свою мышь:

В этом примере 0461 — это vendor_id, а 4d64 — это product_id.

Измените новое правило, чтобы оно соответствовало им. Общая форма:

Применительно к устройству, используемому в приведенном выше примере, это становится:

Использование ENV=="usb_device" позволяет избежать многократного срабатывания правила.

Использование ACTION=="bind" вместо ACTION=="add" необходимо для срабатывания правила позже, иначе xinput может еще не увидеть подключенную мышь.

ENV=":0.0" и ENV передает переменные среды DISPLAY и XAUTHORITY сценарию, выполняющему xinput. Отредактируйте соответствующим образом.

Обнаружение новых дисков eSATA

Если ваш диск eSATA не обнаруживается при подключении, вы можете попробовать несколько способов. Вы можете перезагрузиться с подключенным eSATA. Или вы можете попробовать:

Или вы можете установить scsiadd AUR (из AUR) и попробовать:

Надеюсь, ваш диск теперь находится в /dev . Если это не так, вы можете попробовать приведенные выше команды во время работы:

чтобы узнать, действительно ли что-то происходит.

Отметить внутренние порты SATA как eSATA

Если вы подключили отсек eSATA или другой адаптер eSATA, система все равно распознает этот диск как внутренний диск SATA. GNOME и KDE будут постоянно запрашивать ваш пароль root. Следующее правило пометит указанный порт SATA как внешний порт eSATA. При этом обычный пользователь GNOME может подключать свои диски eSATA к этому порту, как USB-накопитель, без пароля root и т. д.

Примечание: DEVPATH можно найти после подключения диска eSATA с помощью следующих команд (соответственно замените sdb):

Настройка имен статических устройств

Видеоустройство

Информацию о настройке веб-камеры см. в разделе Настройка веб-камеры.

Примечание. Использование имен, отличных от /dev/video*, нарушит предварительную загрузку v4l1compat.so и, возможно, v4l2convert.so

Принтер

Если вы используете несколько принтеров, устройства /dev/lp2 будут назначаться случайным образом при загрузке, что приведет к поломке, например. Конфигурация CUPS.

Вы можете создать следующее правило, которое будет создавать символические ссылки в /dev/lp/by-id и /dev/lp/by-path , аналогично схеме именования постоянных блочных устройств:

Идентификация диска по серийному номеру

Чтобы выполнить какое-либо действие на определенном дисковом устройстве /dev/sdX, постоянно идентифицированном его уникальным серийным номером ID_SERIAL_SHORT, отображаемым с помощью udevadm info /dev/sdX, один можно использовать приведенное ниже правило. Он передает в качестве параметра найденное имя устройства, если таковое имеется, для иллюстрации:

Выход из режима ожидания с помощью USB-устройства

Правило udev может быть полезно для включения триггеров пробуждения USB-устройства, например мыши или клавиатуры, чтобы его можно было использовать для вывода системы из спящего режима.

Примечание. По умолчанию все хост-контроллеры USB включены для пробуждения. Статус можно проверить с помощью cat /proc/acpi/wakeup.Приведенное ниже правило в этом случае не является обязательным, но его можно использовать в качестве шаблона для выполнения других действий, таких как, например, отключение функции пробуждения.

Во-первых, определите идентификатор производителя и продукта USB-устройства. Они будут использоваться для распознавания в правиле udev. Например:

Затем найдите, к чему подключено устройство, используя:

Теперь создайте правило для изменения атрибута питания/пробуждения как устройства, так и USB-контроллера, к которому оно подключено, всякий раз, когда оно добавляется:

Инициирование событий

Может быть полезно запускать различные события udev. Например, вы можете захотеть имитировать отключение USB-устройства на удаленном компьютере. В таких случаях используйте триггер udevadm:

Эта команда вызовет событие удаления USB на всех USB-устройствах с идентификатором поставщика abcd .

Запуск уведомлений на рабочем столе из правила udev

Фактическая точность этой статьи или раздела оспаривается.

Вызов внешнего скрипта, содержащего вызовы для отправки уведомлений через udev, иногда может быть сложным, поскольку уведомления никогда не отображаются на рабочем столе. Вот пример того, какие команды и переменные окружения необходимо включить в файлы для отправки уведомлений, чтобы они успешно выполнялись из правила udev.

Примечание. В этом примере некоторые переменные жестко запрограммированы, поэтому подумайте о том, чтобы сделать их переносимыми (например, $USER, а не короткое имя пользователя), как только вы поймете пример.

1) Следующее правило udev выполняет сценарий, который воспроизводит звук уведомления и отправляет уведомление на рабочий стол, когда яркость экрана изменяется в соответствии с состоянием питания ноутбука. Создайте файл:

  • USERNAME_TO_RUN_SCRIPT_AS и USERNAME необходимо заменить на короткое имя пользователя графического сеанса, в котором будет отображаться уведомление;
  • скрипт должен быть выполнен с /usr/bin/su , что сделает его владельцем пользователя графического сеанса (а не root/системы), где будет отображаться уведомление.

2) Содержимое исполняемого скрипта, запускаемого при срабатывании правила udev:

  • USERNAME_TO_RUN_SCRIPT_AS , UID_OF_USER_TO_RUN_SCRIPT_AS и USERNAME необходимо изменить на короткое имя пользователя и UID пользователя графического сеанса, в котором будет отображаться уведомление;
  • /usr/bin/sudo требуется при воспроизведении аудио через pulseaudio;
  • необходимо определить и экспортировать три переменные среды (например, XAUTHORITY, DISPLAY и DBUS_SESSION_BUS_ADDRESS) для пользователя графического сеанса, в котором будет отображаться уведомление.

Совет. См. также xpub AUR как метод получения переменных среды отображения пользователя и экспорта последних в правила udev с помощью ключа IMPORT.

3) Загрузите/перезагрузите новое правило udev (см. выше) и протестируйте его, отключив питание ноутбука.

Создание длительных процессов

Программы, запущенные udev, будут блокировать дальнейшие события от этого устройства, а любые задачи, порожденные правилом udev, будут уничтожены после завершения обработки событий. Если вам нужно создать длительный процесс с помощью udev, вы можете использовать at (например, your_command | at now или batch) или создать модуль systemd, который можно запускать непосредственно из правила udev.

Устранение неполадок

Внесение модулей в черный список

В редких случаях udev может ошибаться и загружать неправильные модули. Чтобы он этого не делал, вы можете занести модули в черный список. После внесения в черный список udev никогда не загрузит этот модуль — ни во время загрузки, ни даже позже, когда получено событие горячей замены (например, вы подключаете флэш-накопитель USB).

Вывод отладки

Чтобы получить информацию об отладке оборудования, используйте параметр ядра udev.log-priority=debug . В качестве альтернативы вы можете установить

Эту опцию также можно скомпилировать в ваши initramfs, добавив файл конфигурации в ваш массив FILES

udevd зависает при загрузке

После миграции на LDAP или обновления системы с поддержкой LDAP udevd может зависнуть при загрузке с сообщением «Запуск демона UDev». Обычно это происходит из-за того, что udevd пытается найти имя в LDAP, но безуспешно, потому что сеть еще не запущена. Решение состоит в том, чтобы обеспечить локальное присутствие всех имен системных групп.

Извлеките имена групп, указанные в правилах udev, и имена групп, фактически присутствующие в системе:

Чтобы увидеть различия, выполните параллельное сравнение:

В этом случае группа pcscd по какой-то причине отсутствует в системе. Добавьте недостающие группы. Кроме того, убедитесь, что локальные ресурсы просматриваются, прежде чем прибегать к LDAP. /etc/nsswitch.conf должен содержать следующую строку:

Некоторые устройства, которые следует рассматривать как съемные, не являются

Вам нужно создать собственное правило udev для этого конкретного устройства.Чтобы получить точную информацию об устройстве, вы можете использовать либо ID_SERIAL, либо ID_SERIAL_SHORT (не забудьте изменить /dev/sdb при необходимости):

Затем мы создаем правило в /etc/udev/rules.d/ и устанавливаем переменные либо для udisks, либо для udisks2.

Для udisks установите UDISKS_SYSTEM_INTERNAL="0" , что пометит устройство как "съемное" и, следовательно, "подходящее для автомонтирования". Подробнее см. в разделе udisks(7).

Для udisks2 установите UDISKS_AUTO="1", чтобы пометить устройство для автоматического подключения, и UDISKS_SYSTEM="0", чтобы пометить устройство как "съемное". Подробнее см. в разделе udisks(8).

Не забудьте перезагрузить правила udev с помощью элемента управления udevadm --reload . В следующий раз, когда вы подключите свое устройство, оно будет рассматриваться как внешний диск.

Проблемы со звуком, некоторые модули не загружаются автоматически

Некоторые пользователи проследили эту проблему до старых записей в /etc/modprobe.d/sound.conf. Попробуйте очистить этот файл и повторить попытку.

Примечание. Поскольку udev>=171 , модули эмуляции OSS ( snd_seq_oss , snd_pcm_oss , snd_mixer_oss ) по умолчанию не загружаются автоматически.

Поддержка IDE CD/DVD-приводов

Начиная с версии 170, udev не поддерживает приводы CD-ROM/DVD-ROM, которые загружаются как традиционные приводы IDE с модулем ide_cd_mod и отображаются как /dev/hd* . Диск по-прежнему можно использовать для инструментов, которые напрямую обращаются к оборудованию, например cdparanoia, но он невидим для программ более высокого уровня, таких как KDE.

Причиной загрузки модуля ide_cd_mod раньше других, например sr_mod, может быть, например. что у вас по какой-то причине загружен модуль piix с вашим initramfs. В этом случае вы можете просто заменить его на ata_piix в файле /etc/mkinitcpio.conf.

Идентификатор группы оптических дисководов установлен на "диск"

Если идентификатор группы вашего оптического дисковода установлен на disk и вы хотите, чтобы он был установлен на оптический , вам необходимо создать пользовательское правило udev:

Читайте также: