udev (Русский)
Состояние перевода: На этой странице представлен перевод статьи udev. Дата последней синхронизации: 11 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
udev — работающая в пространстве пользователя система, с помощью которой системный администратор может создавать обработчики событий. События, получаемые udev, обычно генерируются ядром Linux в ответ на физические события, происходящие с периферийными устройствами. Например, при обнаружении периферийных устройств или «горячем» подключении udev может выполнить определённые действия, в том числе и вернуть управление ядру, если необходима загрузка модулей или прошивок.
Подобно предшественникам, утилитам devfsd и hotplug, udev управляет файлами устройств в каталоге /dev , добавляя их, переименовывая и создавая символические ссылки. udev полностью замещает функционал hotplug и hwdetect.
Обработка событий в udev происходит параллельно, что теоретически улучшает производительность старых систем. С другой стороны, это может усложнить администрирование. Так, при перезапуске системы порядок загрузки модулей ядра может измениться, а при наличии в машине нескольких блочных устройств могут поменяться названия их файлов. Например, для системы с двумя жёсткими дисками файл /dev/sda после перезагрузки может превратиться в /dev/sdb .
Установка
udev входит в состав systemd и установлен по умолчанию. Подробнее см. systemd-udevd.service(8) .
Существует также отдельный от systemd форк, который можно установить с пакетом eudev AUR [ссылка недействительна: package not found] или eudev-git AUR [ссылка недействительна: package not found] .
О правилах udev
Создаваемые системным администратором правила udev хранятся в каталоге /etc/udev/rules.d/ . Названия файлов правил должны заканчиваться суффиксом .rules. Правила из пакетов программ при установке помещаются в каталог /usr/lib/udev/rules.d/ . Если в каталогах /usr/lib и /etc находятся два файла правил с одинаковыми именами, то файл в /etc будет иметь приоритет.
Правила udev подробно описаны в руководстве udev(7) . Также стоит изучить статью Создание правил udev (англ.) и приведённые в ней практические примеры: Создание правил udev — Примеры (англ.).
Пример правила udev
Ниже приведён пример правила, которое создаёт символическую ссылку /dev/video-cam , когда к компьютеру подключается веб-камера.
Предположим, мы выяснили, что для подключённой камеры создан файл устройства /dev/video2 . Причина, по которой мы создаем это правило, заключается в том, что при следующей загрузке веб-камере может быть присвоено другое имя, например, /dev/video0 .
$ udevadm info --attribute-walk --path=$(udevadm info --query=path --name=/dev/video2)
Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/pci0000:00/0000:00:04.1/usb3/3-2/3-2:1.0/video4linux/video2': KERNEL=="video2" SUBSYSTEM=="video4linux" . looking at parent device '/devices/pci0000:00/0000:00:04.1/usb3/3-2/3-2:1.0': KERNELS=="3-2:1.0" SUBSYSTEMS=="usb" . looking at parent device '/devices/pci0000:00/0000:00:04.1/usb3/3-2': KERNELS=="3-2" SUBSYSTEMS=="usb" ATTRS=="05a9" ATTRS=="OmniVision Technologies, Inc." ATTRS=="unknown" ATTRS=="4519" ATTRS=="00" ATTRS=="USB Camera" .
Мы используем параметры веб-камеры KERNEL==»video2″ и SUBSYSTEM==»video4linux» , затем мы возьмем идентификаторы производителя и изделия родительского USB-устройства SUBSYSTEMS==»usb» , ATTRS==»05a9″ и ATTRS==»4519″ для сопоставления:
/etc/udev/rules.d/83-webcam.rules
KERNEL=="video[0-9]*", SUBSYSTEM=="video4linux", SUBSYSTEMS=="usb", ATTRS=="05a9", ATTRS=="4519", SYMLINK+="video-cam"
В примере мы создали символическую ссылку, используя параметр SYMLINK+=»video-cam» . Мы можем также легко задать владельца ( OWNER=»john» ), группу ( GROUP=»video» ), или установить права доступа к файлу ссылки ( MODE=»0660″ ).
Если вы намереваетесь создать правило, которое делает что-нибудь при удалении устройства, имейте в виду, что атрибуты устройства могут стать недоступны. В этом случае вам необходимо использовать специальный набор переменных окружения. Чтобы отобразить эти переменные, выполните следующую команду при отсоединении устройства:
$ udevadm monitor --environment --udev
В выводе команды вы увидите значения параметров устройства, например, ID_VENDOR_ID и ID_MODEL_ID , которые соответствуют использованным ранее идентификаторам производителя и изделия. Правило, которое использует переменные окружения устройства, может выглядеть следующим образом:
/etc/udev/rules.d/83-webcam-removed.rules
ACTION=="remove", SUBSYSTEM=="usb", ENV=="05a9", ENV=="4519", RUN+="''/path/to/your/script''"
Список атрибутов устройства
Чтобы вывести все атрибуты устройства, которые вы можете использовать в написании правил udev, выполните:
$ udevadm info --attribute-walk --name=имя_устройства
Замените имя_устройства текущим именем файла устройства, например, /dev/sda или /dev/ttyUSB0 .
Если вы не знаете имя файла устройства, вы можете также вывести все атрибуты по конкретному системному пути:
$ udevadm info --attribute-walk --path=/sys/class/backlight/acpi_video0
Чтобы сузить поле поиска, определите класс устройства и выполните:
$ ls /dev/класс/by-id
Найденную символическую ссылку (или файл, на который она указывает) можно использовать в параметре —name :
$ udevadm info --attribute-walk --name=/dev/input/by-id/usb-foostan_Corne-event-kbd
Проверка правил перед загрузкой
# udevadm test $(udevadm info -q path -n имя_устройства) 2>&1
Вы можете также указать прямой системный путь до устройства:
# udevadm test /sys/class/backlight/acpi_video0/
Загрузка новых правил
udev способен определять наличие изменений в файлах правил автоматически, поэтому изменения сразу вступают в силу без необходимости перезапуска udev. Однако, новые правила не будут применены сразу к уже подключенным устройствам. Устройства с возможностью горячей замены, например, устройства USB, могут быть просто переподключены для применения к ним новых правил. Также вы можете перезагрузить модули ядра ohci-hcd и ehci-hcd , что автоматически приведет к перезагрузке всех драйверов для каждого USB-устройства.
Если правила не перезагружаются автоматически, выполните:
# udevadm control --reload-rules
Чтобы вручную заставить udev применить ваши правила, выполните:
# udevadm trigger
udisks
Советы и рекомендации
Монтирование съёмных устройств
Монтировать съёмные устройства с помощью команды mount в правиле udev не стоит по двум причинам: (1) systemd по умолчанию запускает systemd-udevd.service с отдельным «пространством имён монтирования» (см. namespaces(7) ), что означает, что данное устройство не будет видно из остальной системы. (2) Чтобы этого не происходило, можно закомментировать параметры PrivateMounts и MountFlags в файле службы, но тогда проявится другая проблема: запускаемые udev процессы система будет убивать по истечении нескольких секунд. В случае файловых систем FUSE, вроде NTFS, «монтирование» запустит в пространстве пользователя процесс для работы с файловой системой; затем процесс будет уничтожен и при попытке доступа к ФС вы получите ошибку Transport endpoint not connected .
Есть несколько возможных решений:
- Из правила udev запускается пользовательская служба systemd; служба запустит сценарий, который, в свою очередь, может породить любое количество долгосрочных процессов (вроде FUSE). В качестве примера можно использовать утилиту udev-media-automount, разработанную для быстрого и надёжного автоматического монтирования устройств. Другой вариант той же идеи предложен в этом сообщении.
- В правилах udev вместо команды mount можно использовать systemd-mount , как рекомендуют разработчики systemd. Пример монтирования USB-дисков в каталоге /media :
ACTION=="add", SUBSYSTEMS=="usb", SUBSYSTEM=="block", ENV=="filesystem", RUN+="/usr/bin/systemd-mount --no-block --automount=yes --collect $devnode /media"
- Программы вроде udisks или udiskie. Мощные утилиты, хоть и с довольно сложной настройкой. Нужно учитывать, что они работают для одного пользовательского сеанса: доступ к некоторым файловым системам предоставляется только тому пользователю, сеанс которого активен в данный момент.
Доступ к программаторам и виртуальным COM-портам
Следующий набор правил даст возможность пользователям, входящим в группу users , получить доступ к USB-программаторам микроконтроллеров AVR USBtinyISP:
/etc/udev/rules.d/50-usbtinyisp.rules
SUBSYSTEMS=="usb", ATTRS=="1781", ATTRS=="0c9f", GROUP="users", MODE="0660" SUBSYSTEMS=="usb", ATTRS=="16c0", ATTRS=="0479", GROUP="users", MODE="0660"
Идентификаторы производителя и изделия для других устройств можно узнать с помощью утилиты lsusb.
Выполнение команд при подключении VGA-монитора
Создайте правило /etc/udev/rules.d/95-monitor-hotplug.rules со следующим содержимым, чтобы запускать arandr при каждом подключении VGA-монитора:
KERNEL=="card0", SUBSYSTEM=="drm", ENV=":0", ENV , RUN+="/usr/bin/arandr"
Некоторые экранные менеджеры размещают файл .Xauthority вне домашнего каталога пользователя. В этом случае параметр ENV необходимо соответствующим образом изменить. Например, значение переменной XAUTHORITY для GNOME Display Manager:
$ printenv XAUTHORITY
/run/user/1000/gdm/Xauthority
Определение новых накопителей eSATA
Если ваш накопитель eSATA не был определен системой при подключении, вы можете перезагрузить систему, не отключая кабель устройства, либо, если перезагрузка нежелательна, выполнить:
# echo 0 0 0 | tee /sys/class/scsi_host/host*/scan
Еще один вариант заключается в использовании утилиты scsiadd AUR из AUR:
# scsiadd -s
Накопитель должен появиться в /dev . Если это не так, попробуйте выполнить:
# udevadm monitor
до и после вышеприведенных команд и посмотреть, происходит ли что-нибудь.
Определение внутренних портов SATA как внешних
Если вы подключили eSATA-адаптер, система все еще будет распоздавать его как внутренний SATA-накопитель. GNOME и KDE будут постоянно запрашивать пароль администратора. Следующее правило помечает все указанные SATA-порты как порты eSATA, благодаря чему обычные пользователи смогут подключать свой накопитель eSATA к этому порту как USB-накопитель без запроса пароля администратора:
/etc/udev/rules.d/10-esata.rules
DEVPATH=="/devices/pci0000:00/0000:00:1f.2/host4/*", ENV="0"
Примечание: Узнать правильное значение параметра DEVPATH вы можете с помощью следующих команд (вместо /dev/sdb укажите ваше устройство):
$ udevadm info --query=path /dev/sdb
/devices/pci0000:00/0000:00:1f.2/host4/target4:0:0/4:0:0:0/block/sdb
$ find /sys/devices/ -name sdb
/sys/devices/pci0000:00/0000:00:1f.2/host4/target4:0:0/4:0:0:0/block/sdb
Установка постоянных имен устройств
Из-за асинхронного способа загрузки модулей, они инициализируются в разном порядке от загрузки к загрузке. Это приводит к случайному переименованию устройств при каждом запуске. Чтобы задать постоянные имена вашим устройствам, можно создать специальное правило udev. Смотрите также статьи Постоянные имена для блочных устройств и Настройка сети#Смена имени интерфейса.
Видеоустройства
Процедура установки веб-камеры описана в статье Webcam setup.
При загрузке веб-камерам присваиваются случайные имена вида /dev/video* . Рекомендуемое решение состоит в создании символических ссылок с использованием правила udev (подобно правилу в разделе #Пример правила udev):
/etc/udev/rules.d/83-webcam.rules
KERNEL=="video[0-9]*", SUBSYSTEM=="video4linux", SUBSYSTEMS=="usb", ATTRS=="05a9", ATTRS=="4519", SYMLINK+="video-cam1" KERNEL=="video[0-9]*", SUBSYSTEM=="video4linux", SUBSYSTEMS=="usb", ATTRS=="046d", ATTRS=="08f6", SYMLINK+="video-cam2"
Примечание: Использование имен, отличных от /dev/video* , может помешать загрузке v4l1compat.so , и, возможно, v4l2convert.so .
Принтеры
Если у вас несколько принтеров, им будут случайным образом присвоены имена вида /dev/lp[0-9] , что, например, может помешать серверу CUPS правильно настроить устройства. Вы можете создать следующее правило, которое будет создавать постоянные символические ссылки в каталогах /dev/lp/by-id и /dev/lp/by-path подобно схеме, приведенной в статье Постоянные имена для блочных устройств:
/etc/udev/rules.d/60-persistent-printer.rules
ACTION=="remove", GOTO="persistent_printer_end" # Это не должно понадобиться #KERNEL!="lp*", GOTO="persistent_printer_end" SUBSYSTEMS=="usb", IMPORT="usb_id" ENV!="printer", GOTO="persistent_printer_end" ENV=="?*", SYMLINK+="lp/by-id/$envОпределение диска по серийному номеру
Действия с дисковыми устройствами /dev/sdX можно выполнять на основании серийного номера ID_SERIAL_SHORT , который можно узнать из вывода команды udevadm info /dev/sdX . Примерное правило udev для этого случая приведено ниже. В параметре RUN сценарию передаётся имя устройства; это сделано исключительно в иллюстративных целях:
/etc/udev/rules.d/69-disk.rulesACTION=="add", KERNEL=="sd[a-z]", ENV= , RUN+Пробуждение при активности USB-устройства
С помощью правила udev можно настроить систему выходить из режима сна при активности USB-устройств, например, мыши или клавиатуры.
Примечание: По умолчанию в контроллере USB функциональность пробуждения включена. Проверить это можно командой cat /proc/acpi/wakeup . В этом случае правило ниже оказывается ненужным, но его всё же можно использовать в качестве образца для каких-либо других действий, например — для отключения той же wakeup-функциональности.
Первым делом определите идентификаторы производителя и изделия для вашего устройства:
$ lsusb | grep LogitechBus 007 Device 002: ID 046d:c52b Logitech, Inc. Unifying ReceiverЗатем найдите, куда данное устройство подключено:
$ grep c52b /sys/bus/usb/devices/*/idProduct/sys/bus/usb/devices/1-1.1.1.4/idProduct:c52bНаконец, создайте правило, которое при подключении будет изменять атрибут power/wakeup как для устройства, так и для USB-контроллера, к которому оно подключено:
/etc/udev/rules.d/50-wake-on-device.rulesACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS= , ATTRS= , ATTR="enabled", ATTR1-1.1.1.4/power/wakeup>="enabled"Генерирование событий
Может быть полезно сгенерировать различные события udev. Например, вы хотите симулировать отключение USB-устройства на удалённой машине. В таких случаях, используйте udevadm trigger :
# udevadm trigger --verbose --type=subsystems --action=remove --subsystem-match=usb --attr-match="idVendor=abcd"Эта команда симулирует отключение всех USB-устройств с указанным идентификатором поставщика idVendor .
Уведомления на рабочем столе
Заставить правильно работать из правила udev сценарий, содержащий команду notify-send , может оказаться непростой задачей, потому что уведомления не будут выводиться на рабочий стол. Ниже показано, какие файлы, команды и переменные окружения необходимо задйствовать, чтобы notify-send работала как положено.
Примечание: В примерах ниже некоторые значения указаны явно. Когда вы будете писать свои правила и сценарии, их лучше делать портируемыми — например, использовать переменную $USER вместо явного указания имени пользователя и т.п.
1) Следующее правило udev запускает сценарий, создающий графическое и звуковое уведомление, когда яркость экрана меняется в зависимости от способа питания ноутбука:
/etc/udev/rules.d/99-backlight_notification.rules# Правило на случай переключения на работу от батареи ACTION=="change", SUBSYSTEM=="power_supply", ATTR=="Mains", ATTR=="0", ENV=":0", ENV="/home/USERNAME/.Xauthority" RUN+="/usr/bin/su USERNAME_TO_RUN_SCRIPT_AS -c /usr/local/bin/brightness_notification.sh" # Правило на случай переключения на работу от кабеля ACTION=="change", SUBSYSTEM=="power_supply", ATTR=="Mains", ATTR=="1", ENV=":0", ENV="/home/USERNAME/.Xauthority" RUN+="/usr/bin/su USERNAME_TO_RUN_SCRIPT_AS -c /usr/local/bin/brightness_notification.sh"
- USERNAME_TO_RUN_SCRIPT_AS и USERNAME необходимо заменить на имя пользователя, который запустил графический сеанс;
- сценарий должен запускаться командой /usr/bin/su , чтобы его владельцем считался не root, а пользователь, который запустил графический сеанс и для которого будут выводиться уведомления.
2) Содержимое сценария, который запускается правилом udev:
/usr/local/bin/brightness_notification.sh#!/usr/bin/env bash export XAUTHORITY=/home/USERNAME_TO_RUN_SCRIPT_AS/.Xauthority export DISPLAY=:0 export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/UID_OF_USER_TO_RUN_SCRIPT_AS/bus" /usr/bin/sudo -u USERNAME_TO_RUN_SCRIPT_AS /usr/bin/paplay --server=/run/user/UID_OF_USER_TO_RUN_SCRIPT_AS/pulse/native /home/USERNAME/.i3/sounds/Click1.wav > /dev/null 2>&1 /usr/bin/notify-send --icon=/usr/share/icons/gnome/256x256/status/battery-full-charging.png 'Changing Power States' --expire-time=4000
- USERNAME_TO_RUN_SCRIPT_AS , UID_OF_USER_TO_RUN_SCRIPT_AS и USERNAME необходимо заменить на имя и идентификатор пользователя, запустившего графический сеанс;
- команда /usr/bin/sudo воспроизводит звуковое уведомление с помощью pulseaudio;
- для пользователя, запустившего графический сеанс, в котором будут отображаться уведомления, необходимо определить и экспортировать три переменные окружения ( XAUTHORITY , DISPLAY и DBUS_SESSION_BUS_ADDRESS ).
Совет: С помощью xpub AUR можно собрать переменные графического окружения пользователя и экспортировать их в правило udev ключом IMPORT .
3) Загрузите/перезагрузите новое правило udev и проверьте, как оно работает, выдернув или подключив кабель питания ноутбука.
Создание долгосрочных процессов
Программы, запущенные udev, блокируют последующие события от данного устройства, а любые процессы, порождённые правилом udev, завершаются сразу после обработки события. Если вы хотите запустить долгосрочный процесс с помощью udev, то либо используйте at (например, ваша_команда | at now или batch ), либо создайте юнит systemd, который можно запустить из правила udev.
Решение проблем
Добавление модулей в черный список
Иногда udev может ошибочно загружать неправильные модули ядра. Чтобы избежать этого, добавьте такие модули в чёрный список. Если модуль находится в чёрном списке, udev будет игнорировать его как при загрузке, так и при более позднем "горячем" подключении внешнего устройства (например, USB-носителя).
Отладочная печать
Если задать параметр ядра udev.log-priority=debug , то аппаратное обеспечение будет выдавать отладочную информацию. Другой способ — задать параметр
/etc/udev/udev.confudev_log="debug"Чтобы добавить эту опцию в initramfs, укажите файл настроек udev в строке FILES
/etc/mkinitcpio.confFILES=". /etc/udev/udev.conf"после чего сгенерируйте initramfs.
udevd вылетает при загрузке
После миграции на LDAP или обновления системы, использующей LDAP, udevd может начать аварийно завершаться в момент загрузки системы с сообщением "Starting UDev Daemon". Обычно это происходит потому, что udevd пытается определить имя через LDAP, но не может, так как в этот момент еще не установлено подключение к сети.
Необходимо, чтобы все используемые в LDAP группы были продублированы локально. Получить имена групп, используемых в правилах udev, и имена групп, присутствующих в системе, можно командами:
# grep -Fr GROUP /etc/udev/rules.d/ /usr/lib/udev/rules.d/ | sed 's:.*GROUP="\([-a-z_]\\)".*:\1:' | sort -u >udev_groups # cut -d: -f1 /etc/gshadow /etc/group | sort -u >present_groupsВывод будет записан в файлы present_groups и udev_groups . Чтобы увидеть различия, выполните построчное сравнение командой diff:
# diff -y present_groups udev_groups . network < nobody < ntp < optical optical power | pcscd rfkill < root root scanner scanner smmsp < storage storage .В данном примере группа pcscd по какой-то причине отсутствует в системе. Все такие группы необходимо добавить в систему. Также убедитесь, что имена всех локальных ресурсов разрешены, прежде чем возвращаться к LDAP. Файл /etc/nsswitch.conf должен содержать следующую строку:
group: files ldapУстройство является съемным, однако не признается таковым
Создайте правило udev для конкретного устройства. Чтобы получить подробную информацию об устройстве вы можете либо использовать ID_SERIAL , либо ID_SERIAL_SHORT (не забудьте поменять /dev/sdb если нужно):
$ udevadm info /dev/sdb | grep ID_SERIALТеперь установите UDISKS_AUTO="1" , чтобы пометить устройство для автоматического монтирования и UDISKS_SYSTEM="0" , чтобы пометить устройство как съёмное. Подробнее см. udisks(8)
/etc/udev/rules.d/99-removable.rulesENV= , ENV="1", ENV="0"Перезагрузите правила udev командой udevadm control --reload . Теперь ваше устройство будет распознаваться как съёмное.
Проблемы с автоматической загрузкой модулей аудиоустройств
Некоторые пользователи испытывают проблемы с загрузкой модулей звуковых устройств, для которых остались старые записи в /etc/modprobe.d/sound.conf . Чистка файла от таких записей может помочь.
Примечание: Начиная с версии udev 171, модули эмуляции OSS ( snd_seq_oss , snd_pcm_oss и snd_mixer_oss ) больше не загружаются автоматически.
Поддержка дисководов IDE
Начиная с версии 170, udev не поддерживает устройства CD-ROM/DVD-ROM, загружаемые как обычные IDE дисководы модулем ide_cd_mod и отображаемые в системе как /dev/hd* . Дисковод доступен только программам, которые обращаются к устройству напрямую, таким как cdparanoia, но невидим для более высокоуровневых программ вроде KDE.
Причина, по которой загрузка модуля ide_cd_mod имеет приоритет перед другими модулями, например, sr_mod , может заключаться в том, что по какой-либо причине модуль piix загружается в вашем initramfs. В этом случае вы можете просто заменить его в файле /etc/mkinitcpio.conf на ata_piix .
Оптические дисководы имеют неверный group ID
Если значение group ID вашего дисковода установлено как disk , но вы хотите, чтобы оно было optical , вам следует создать такое правило:
/etc/udev/rules.d# permissions for IDE CD devices SUBSYSTEMS=="ide", KERNEL=="hd[a-z]", ATTR=="1", ATTRS=="cdrom*", GROUP="optical" # permissions for SCSI CD devices SUBSYSTEMS=="scsi", KERNEL=="s[rg][0-9]*", ATTRS=="5", GROUP="optical"Смотрите также
- udev(7)
- Введение в udev (англ.)
- Почтовая рассылка udev (англ.)
- Сценарии udev (англ.)
- Правила udev (англ.)
- Организация устройств и модулей в LFS (англ.)
- GUI и переменные экрана в правилах udev (англ.)
Retrieved from "https://wiki.archlinux.org/index.php?title=Udev_(Русский)&oldid=785934"
Переименовываются интерфейсы
Добрый день. Подскажите пожалуйста, такая проблема: Вставляю новую сетевую карту PCI в разъем. Редактирую файл /etc/udev/rules.d/70-persistent-net.rules - мак, имя интерфейса, система Ubuntu 16.04 переименовывает один из интерфейсов в rename5. При чем переименовывает не новую карту, а одну из стоявших. Маки разные, аппаратные с коробки.
korshun_199
02.06.21 12:37:00 MSKтакое бывает, когда к моменту переименования имя еще занято
Bloody ★★
( 02.06.21 12:39:57 MSK )
Ответ на: комментарий от Bloody 02.06.21 12:39:57 MSK
спасибо
Но имена пробовал менять не раз, безрезультатно
korshun_199
( 02.06.21 12:41:20 MSK ) автор топика
Ответ на: спасибо от korshun_199 02.06.21 12:41:20 MSKменять на что? попробуйте назвать интерфейсы new1, new2 etc
Bloody ★★
( 02.06.21 12:43:38 MSK )Обычно такое бывает с устройствами у которых одинаковые МАС-адреса. Например, с usb модемами Huawei E3372h.
Покажите содержимое вашего файла /etc/udev/rules.d/70-persistent-net.rules
vdk10
( 02.06.21 12:50:21 MSK )
Ответ на: комментарий от Bloody 02.06.21 12:43:38 MSK
Пробовал
Последняя запись в файле eth4. Ставлю дополнительную сетевую, добавляю сроку, её мак и имя eth5. eth5 определяется правильно, а eth4 переименовывается в rename5. Маки разные, с коробки, имена менял.
korshun_199
( 02.06.21 12:52:06 MSK ) автор топика
Ответ на: Пробовал от korshun_199 02.06.21 12:52:06 MSKпопробуйте назвать интерфейсы new1, new2 и вы вернетесь к моему первому сообщению, когда udev пытается назвать сетевку eth4, это имя еще занято.
Bloody ★★
( 02.06.21 12:55:16 MSK )
Ответ на: комментарий от vdk10 02.06.21 12:50:21 MSK
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR=="f4:f2:6d:02:38:b3", ATTR=="0x0", ATTR=="1", KERNEL=="eth*", NAME="eth1" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR=="3c:84:6a:cc:62:02", ATTR=="0x0", ATTR=="1", KERNEL=="eth*", NAME="eth2" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR=="1c:1b:0d:c7:26:41", ATTR=="0x0", ATTR=="1", KERNEL=="eth*", NAME="eth3" SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR=="18:d6:c7:06:ae:12", ATTR=="0x0", ATTR=="1", KERNEL=="eth*", NAME="eth4"korshun_199
( 02.06.21 12:56:16 MSK ) автор топика
Ответ на: комментарий от Bloody 02.06.21 12:55:16 MSK
Но менял уже от балды , попробую еще раз, может что то не замечаю, хотя уже пробовал по разному
korshun_199
( 02.06.21 12:58:33 MSK ) автор топика
Ответ на: Ок от korshun_199 02.06.21 12:58:33 MSKне используйте префикс eth в имени
Bloody ★★
( 02.06.21 13:03:01 MSK )net.ifnames=0 в параметры ядра, и пошло всё это системдэшное говно нахер.
anonymous
( 02.06.21 13:08:44 MSK )
Ответ на: комментарий от anonymous 02.06.21 13:08:44 MSK
давно уже
korshun_199
( 02.06.21 13:12:01 MSK ) автор топика
Я тоже с этим сталкивался на древнем пролианте. Мне помог этот пост:
afanasiy ★★★★
( 02.06.21 14:04:01 MSK )
Ответ на: комментарий от afanasiy 02.06.21 14:04:01 MSKЯ тоже с этим сталкивался на древнем пролианте. Мне помог этот пост:
Тут совет использовать 70-persistent-net.rules и, в нём, eth. Вот с этим eth, с некоторых пор, засада ввиду
Только это не объясняет появление rename* в описанном случае. Разве что пытались обойти нововведение, и что-то пошло не так. В общем 70-persistent-net.rules и какой-нибудь ether вместо eth должны помочь. Ну или new, как уже советовали.
AS ★★★★★
( 02.06.21 15:24:27 MSK )
Ответ на: комментарий от afanasiy 02.06.21 14:04:01 MSK
Завтра продолжение банкета с бубнами, отпишусь шо и как
korshun_199
( 02.06.21 15:54:28 MSK ) автор топика
Ответ на: комментарий от AS 02.06.21 15:24:27 MSKда тут дело даже не в нововведениях, как я понял топикстартера, у него используется классическое именование интерфейсов, но не устраивает порядок в котором присвоены номера. Прикол в том, что сначала ядро накидало имен в порядки инициализации устройств, а потом udev не может переименовать, потому как для ротации внутри одного префикса «eth», нужно сначала все выкинуть в другой (например в «temp»), а потом вернуть в другом порядке в «eth». Вот только для этого придется расчехлять исходники udev и переписывать.
Bloody ★★
( 02.06.21 16:18:21 MSK )
Ответ на: комментарий от Bloody 02.06.21 16:18:21 MSKпотому как для ротации внутри одного префикса «eth», нужно сначала все выкинуть в другой (например в «temp»), а потом вернуть в другом порядке в «eth». Вот только для этого придется расчехлять исходники udev и переписывать.
Именно об этом и речь. Раньше udev это умел, потом этот кусок кода выкинули из него (о чём ссылка на баг на freedesktop собственно). Соответственно, если eth0 и eth1 не принципиальны, в 70-persistent-net.rules можно написать NAME=«ether0» и NAME=«ether1» соответственно.
AS ★★★★★
( 02.06.21 16:22:09 MSK )
Последнее исправление: AS 02.06.21 16:23:05 MSK (всего исправлений: 1)
Если не используются predictable names, то в общем случае НЕЛЬЗЯ называть сетевухи по старинке через eth*. Точнее явного запрета нет, но при достаточном количестве сетевых картах возможна гонка процессов их переименования - например определились ЯДРОМ разом 2 сетевые карты как eth0 и eth1, затем стартуют ПАРАЛЛЕЛЬНО скрипты переименования которые пытаются переименовать(согласно правила udev) eth0 в eth1, а eth1 - например в eth5. Но вот беда - в момент работы скрипта переименования eth0 в eth1, eth1 еще не переименован, поэтому эта операция завершается с ошибкой.
Если сетевух всего 2, такая ситуация маловероятна(но возможна) - скрипты успевают отработать. И она растет с ростом количества сетевух.
TL;DR - в современных дистрибутивах Linux если ты хочешь свои именования сетевух, жестко прибитые по MAC(или какому другому признаку) -> откажись от имен eth*. Я, например, использую lan*.
P.S. Тред не читай - сразу отвечай 🙂
Pinkbyte ★★★★★
( 03.06.21 19:02:34 MSK )
Последнее исправление: Pinkbyte 03.06.21 19:04:48 MSK (всего исправлений: 3)Настройка udev rules в Linux
Начнём с небольшого введения для новичков. Философия Unix гласит, что всё есть файл. Таким образом, файлы в Unix - это не только информация, хранимая на жёстком диске, но и устройства. Да, в Linux жёсткий диск, мышь, клавиатура, флешка, сетевой адаптер и другие устройства имеют свои файлы, с помощью которых с ними и взаимодействуют различные системные программы.
Все файлы устройств хранятся в каталоге /dev. Этот каталог генерируется во время загрузки специальным сервисом - udev. Происходит это на основе подключённых к компьютеру устройств и определённых правил. По умолчанию в udev уже заложены все необходимые для нормальной работы устройств правила. Но некоторые пользователи хотят самим настраивать устройства и выбирать им имена и права доступа. Кроме того, понимание процесса генерации файлов устройств даёт возможность глубже понять работу операционной системы.
Правила udev помогут вам, если вы хотите:
- переименовать устройство, например жёсткий диск или сетевую карту;
- создать дополнительное имя для устройства;
- поменять права доступа к устройству;
- установить владельца и группу;
- выполнить скрипт при подключении или отключении устройства.
Table of Contents
- Общая информация про udev
- Как переименовать устройство в Linux
- Как переименовать сетевую карту
- Как запустить скрипт при подключении устройства
- Отладка правил
- Выводы
Общая информация про udev
Правила udev хранятся в папке /etc/udev/rules.d. Файл правил обязательно должен иметь расширение .rules. Обычно в этой папке уже есть несколько файлов udev rules, но их трогать не рекомендуется, для своих правил лучше создать отдельный файл, например:
Правило udev состоит из нескольких пар ключ - значение, разделённых запятой. Одни ключи используются для проверки соответствия устройства определённому правилу. В таких ключах используется знак == для разделения пары, например: SUBSYSTEM == "block". Это значит, что правило будет применено, только если значение ключа SUBSYSTEM для этого устройства равно block. Другие ключи используются для указания действия, если все условия соответствия выполняются. Для разделения пар в таких ключах используется знак равно " mydisk". Ну и полностью правило:
SUBSYSTEM=="block", ATTR(size)=="1343153213", NAME="mydisk"
Это правило выполниться только для устройства подсистемы block и с размером 1343153213 байт. Откуда брать эти значения, мы рассмотрим ниже, а пока разберёмся, что же значат те или иные ключи. Сначала ключи соответствия:
- SUBSYSTEM - подсистема устройства;
- KERNEL - имя, выдаваемое устройству ядром;
- DRIVER - драйвер, обслуживающий устройство;
- ATTR - sysfs-атрибут устройства;
- SUBSYSTEMS - подсистема родительского устройства.
Устройство может иметь родительские устройства, например, жёсткий диск имеет родительское устройство SSCI, которое в свою очередь имеет родительское устройство - шину BUS. Иногда необходимо получить информацию от родительского устройства. Для этого используются ключи SUBSYSTEMS, KERNELS, DRIVERS, ATTRS соответственно.
Для действий используются ключи:
- NAME - установить имя файла устройства;
- SYMLINK - альтернативное имя устройства;
- RUN - выполнить скрипт при подключении устройства;
- GROUP - группа, у которой есть доступ к файлу;
- OWNER - владелец файла устройства;
- MODE - маска прав доступа.
Рассмотрим подробнее ключ ATTR. Он позволяет получить информацию об устройстве, доступную в sysfs. Например, ATTR=13413423124, если размер устройства равен 13413423124. Посмотреть все возможные sysfs-параметры для устройства можно непосредственно в файловой системе /sys. Например, для диска /dev/sda есть каталог /sys/block/sda/, в котором можно найти файлы size, stat, ro, range и т д. Также посмотреть все возможные udev- параметры для устройства можно с помощью утилиты udevadm. Например, для диска /dev/sda:
udevadm info -a -n sda1
Опция -n задаёт имя устройства, -p - путь в sysfs. Например, то же самое получим, если выполнить:
udevadm info -a -p /sys/block/sda/sda1
Как переименовать устройство в Linux
Теперь на основе полученной из udevadm информации можем составить udev rules для добавления альтернативного имени диска:
SUBSYSTEM=="block", ATTR=="976773168", SYMLINK+="root"
Или смены названия:
SUBSYSTEM=="block", ATTR=="976773168", name="root"
Получим устройство /dev/root, которое будет указывать на корневой раздел (sda1), то же самое можно сделать для привода оптических дисков:
udevadm info -a -p /sys/block/sr0
Затем добавляем правило на основе модели:
SUBSYSTEM=="block", ATTRS=="DVDRAM GH22NS70 ", SYMLINK+="cdrom"
После перезагрузки появится файл устройства /dev/cdrom. Хотя, конечно, это можно сделать без udev, прописав в автозагрузку команду создания символической ссылки:
ln -s /dev/sr0 /dev/cdrom
Как переименовать сетевую карту
Настройка udev Linux на этом не заканчивается. Сетевая карта - тоже устройство и тоже управляется udev. Файлы сетевых устройств хранятся в /sys/class/net. Поэтому получаем информацию о ней с помощью udevadm:
udevadm info -a -p /sys/class/net/enp24s0
И создаём правило, например на основе mac-адреса:
SUBSYSTEM=="net", ATTR=="00:d8:61:16:a5:a5", NAME="eth0"
Перезагружаем компьютер, и теперь устройство называется eth0.
Как запустить скрипт при подключении устройства
Например, мы хотим автоматически скопировать все данные с флешки при её подключении к компьютеру. Мы знаем, что флешка будет называться /dev/sdb, тогда можно создать правило udev такого вида:
При подключении флешки выполнится скрипт /usr/bin/my_script и сделает необходимые действия. Нужно заметить, что скрипт не должен выполняться слишком долго, так как udev остановится и будет ожидать завершения его работы.
Отладка правил
Если вы не уверены, правильно ли составлено правило, можно воспользоваться командой udevadm test для проверки. В единственном параметре нужно передать путь sysfs-устройства. Например, проверим наше правило для жёсткого диска:
udevadm test /sys/block/sda
Среди многочисленного вывода видим строчку:
creating link '/dev/root' to '/dev/sda'
Значит всё работает, и настройка udev выполнена успешно. Если же в правиле допустить синтаксическую ошибку, например UBSYSTEM вместо SUBSYSTEM, udevadm test выдаст что-то подобное:
read rules file: /etc/udev/rules.d/10-local.rules
unknown key 'UBSYSTEM' in /etc/udev/rules.d/10-local.rules:2
invalid rule '/etc/udev/rules.d/10-local.rules:2'Здесь мы видим саму причину ошибки, неверный ключ, а также файл и строку, в которой допущена ошибка.
Выводы
На этом всё. Теперь вы знаете, как создать правило udev и взять под полный контроль все ваши устройства. Если нужна более подробная информация по созданию и использованию правил udev, читайте официальную документацию по udev в man.
Etc udev rules d как назвать файл
Сообщение Salavat » 17 мар 2015 15:08
Доброго времени суток.
После установки сетевые порты определяются как em1 и p2p1.
Логически их лучше назвать, допустим, lan0 и wan0. Но файл /etc/udev/rules.d/70-persistent-net.rules отсутствует, а команда для его генерации sudo udevadm trigger --action=add не работает (ошибки тоже не выдает). В курсе, это баг самой системы?Сообщения: 2 Зарегистрирован: 24 мар 2015 11:30
Re: Как переименовать сетевые порты на Ubuntu Server 14.04.2
Сообщение crux » 24 мар 2015 12:24
Чтобы переименовать сетевые интерфейсы в Ubuntu с помощью udev нужно создать файл /etc/udev/rules.d/70-persistent-net.rules.
Его можно создать вручную, если знаете синтаксис. Есть также скрипт, который идёт вместе с udev: /lib/udev/write_net_rules. Его можно вызвать так:$ sudo INTERFACE=eth0 INTERFACE_NAME=lan0 MATCHADDR=00:ab:c0:de:ca:fe /lib/udev/write_net_rulesСгенерируется файл /etc/udev/rules.d/70-persistent-net.rules такого содержимого:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR=="00:ab:c0:de:ca:fe", KERNEL=="eth*", NAME="lan0"В данном примере задаётся привязка имени интерфейса к его mac-адресу. Надо не забыть в файле /etc/network/interfaces исправить имя интерфейса на новое.
Чтобы не перезагружать систему для вступления новых правил в действие, можно выполнить простые команды по переименованию:
$ sudo ip link set eth0 down $ sudo ip link set eth0 name lan0 $ sudo ip link set lan0 up




