Как перезагрузить правила udev без перезагрузки?


210

Как перезагружать правила udev, чтобы вновь созданные могли функционировать?

Я использую Arch Linux, и у меня нет udevstartкоманды здесь.

Тоже проверил /etc/rc.d, службы udev там нет.


1
Обратите внимание, что в более поздних версиях udev отказались от поддержки inotify, поэтому перезагрузка правил изменений необходима чаще в эти дни.
Колин Гатри

Что такое udev? Это менеджер /dev?
Сандбург

1
@Sandburg, да, он работает по принципу plug-n-play в системах Linux.
Аарон Д. Мараско

Ответы:


231
# udevadm control --reload-rules && udevadm trigger

4
Вам нужно udevtriggerпотом?
Нильс

38
@Nils На самом деле, вам может понадобиться udevtrigger(или, скорее, udevadm triggerв большинстве дистрибутивов) вместо этого (или подключить устройство и включить его обратно). --reload-rulesпочти всегда бесполезен, поскольку это происходит автоматически.
Жиль

12
udevadm triggerсделал трюк на CentOS 6 для меня.
astrostl

3
udevtriggerили udevadm triggerне работал для меня. Я обнаружил, что некоторые устройства будут работать после выгрузки и загрузки модуля для одного и того же (при условии, что это загружаемый модуль). Я обнаружил, что не обязательно перезагружать систему. Пример для сетевого устройства, я rmmod ixgbe, rmmod tg3, rmmod e1000тогда modprobe ixgbe, modprobe tg3, в modprobe e1000зависимости от типа сетевого драйвера.
энтузиаст

1
Ни одна из вещей, упомянутых среди ответов, не сработала для меня в Debian Jessie (8.0). То, что сработало, ip link set $oldname name $newnameупоминается здесь . В моем случае мне нужно было заменить имя iface lanна мостовое iface (для KVM), и, следовательно, оригинал - теперь лежащий в основе - iface должен был вернуть свое старое имя eth1обратно. Итак, хитрость была в следующем: 1) обрушить ифакс; 2) исправить настройки сети; 3) обновить файл правил именования udev; 4) переименовать iface используя ip link...; 5) поднять мост.
kostix

69

Udev использует механизм inotify для отслеживания изменений в каталоге правил, как в библиотеке, так и в локальных деревьях конфигурации (обычно расположенных в /lib/udev/rules.dи /etc/udev/rules.d). Поэтому в большинстве случаев вам не нужно ничего делать, когда вы меняете файл правил.

Вам нужно только явно уведомить демон udev, если вы делаете что-то необычное, например, если у вас есть правило, включающее файлы в другом каталоге. Затем вы можете использовать обычное соглашение для запроса демонов о перезагрузке их конфигурации: отправьте SIGHUP ( pkill -HUP udevd). Или вы можете использовать udevadmкоманду: udevadm control --reload-rules.

Однако следует помнить, что разные версии udev исторически имели разные триггеры для автоматической перезагрузки правил. Так что если сомневаетесь, звоните udevadm control --reload-rules: это все равно не причинит вреда.

Правила udev применяются только при добавлении устройства. Если вы хотите повторно применить правила к устройству, которое уже подключено, вам нужно сделать это явным образом, вызывая udevadm triggerправильные опции, соответствующие устройству (ам), конфигурация которого была изменена, например udevadm trigger --attr-match=vendor='Yoyodyne' --attr-match=model='Frobnicator 300'.


1
Использует ли systemd udev команду inotify для отслеживания изменений правил?
Крейг МакКуин

inotifyМеханизм не всегда поймать изменения файла правил Udev. Например, когда я использую cat > 10-name.rulesдля изменения файла правил путем вставки содержимого, я должен перезагрузить правила вручную, используя udevadm. Проверено на растяжке Распбиана.
Даниэль К.

@DanielK. Изменилось ли это недавно? IIRC Я проверил как systemd udev, так и не systemd udev, когда опубликовал этот ответ, и оба использовали inotify, поэтому он --reload-rulesбыл необходим только в редких случаях.
Жиль

@Gilles: возможно, мой пример выше (перезапись существующего файла правил с помощью перенаправления оболочки) можно считать «необычным случаем». Когда я изменил этот файл с помощью редактора, например, vi, inotifyмеханизм сработал.
Даниэль К.

@DanielK. Ах, это приятно знать. Это не редкий случай: некоторые редакторы сохраняют файл, переписывая (с Vim и Emacs, это зависит от того, как они настроены). Странно, что udev обрабатывает только один случай - для меня это похоже на ошибку, потому что я не могу придумать причину относиться к ним по-другому.
Жиль

19

Я добавляю это, потому что однажды мне это понадобится ... снова.

Иногда вы получаете неправильное совпадение номеров устройств Ethernet и MAC-адресов. Иногда это действительно важно, например, при работе на виртуальной машине, и каждому устройству назначается отдельная VLAN.

  1. Отключите сетевые интерфейсы, затем
  2. изменить /etc/udev/rules.d/70-persistent-net.rules(или его эквивалент)
  3. перезагрузить с udevadm control --reload-rules
  4. повторно запустить с udevadm trigger --attr-match=subsystem=net
  5. довести сетевые интерфейсы вверх.

Я был удивлен, насколько хорошо это сработало.


6
на Red Hat:service network stop && udevadm control --reload-rules; udevadm trigger --attr-match=subsystem=net; service network start
Александр Торстлинг

1
При тестировании Debian 'udevadm trigger --attr-match = subsystem = net' не работает. Я должен был отключить и подключить USB-карту только тогда, когда udev запустил новое правило.
Трисмегистос

Я хотел бы поспорить, Трисмегистос, что отключение / подключение похоже на удаление и перезагрузку сетевого драйвера, согласно ответу Клейтона Дьюкса.
Майк С

12

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

Вы можете запускать правила udev вручную для определенных устройств. Это относится только к дистрибутивам, связанным с redhat (centos fedora и т. Д. И т. Д.)

После внесения соответствующих изменений в файл правил ( /etc/udev/rules.d/whateveryoucalledyourrules) вы можете changeперейти к событию устройства.

echo change > /sys/block/devname/partname1/uevent

Это заставит читать правило udev ТОЛЬКО для этого устройства. Гораздо лучше и более целенаправленный, на мой взгляд.


4

Для меня ниже последовательность команд сработала как хотелось.

Я сделал изменения, /etc/udev/rules.d/70-persistent-net.rulesчтобы изменить ethномер и перезагрузить их без перезагрузки.

/etc/init.d/networking stop
/etc/init.d/udev stop
udevadm control --reload-rules
/etc/init.d/udev start
/etc/init.d/networking start

После этого он был успешно загружен во время выполнения без перезагрузки компьютера.

Любые предложения или рекомендации по этому поводу приветствуются, так как я обнаружил это самостоятельно, прочитав страницы руководства.


2

Я добавляю правильный ответ здесь, потому что мне потребовалось некоторое время, чтобы заметить это в комментарии от @enthusiasticgeek. Все, что вам нужно сделать (при условии, что вы находитесь на консоли сервера - ясно, что это плохо, если вы в ssh'd!):

  1. Получите список используемых интерфейсных модулей:

cat /etc/udev/rules.d/70-persistent-net.rules | grep "PCI device" | perl -pe 's/.*\((\w+)\).*/$1/g'| uniq

В моем случае igbтак оно и есть.

  1. введите sudo rmmod igb(замените igbдрайвером карты, полученным на шаге 1.

затем отредактируйте по /etc/udev/rules.d/70-persistent-net.rulesмере необходимости, затем снова загрузите модуль modprobe igb, снова заменив его своим igb.


Это, в сочетании с ответом Отеуса, было секретным соусом, который позволил мне исправить конфигурацию сетевой карты Mellanox без перезагрузки компьютера. Я полагаю, что загрузка драйвера и чтение udevadm файла persistent-net.rules примерно сродни действиям системы при загрузке.
Майк С

0

в случае нескольких сетей

cat /etc/udev/rules.d/70-persistent-net.rules | grep "PCI device" | awk '{print $NF}'|sed -e 's/(//g' -e 's/)//g'| uniq > /tmp/listnet
rm -rf /etc/udev/rules.d/70-persistent-net.rules 
for i in $(cat /tmp/listnet); do rmmod $i; modprobe $i;done
service network restart
rm -rf /tmp/listnet
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.