Почему мои правила udev не работают внутри работающего док-контейнера?

У меня есть правила udev, написанные для создания SYMLINKS, когда устройство подключено. Правила работают нормально на хост-машине, но когда я запускаю контейнер с такими же правилами, установленными в /etc/udev/rules.d, они не работают внутри моего контейнера.

Я пытаюсь определить, когда подключен внешний диск, и создать соответствующую символическую ссылку. /dev/sdX создается при загрузке контейнера, если диск присутствовал во время docker run, но он не появится после команды запуска и не исчезнет после извлечения диска.

Вот пример правила, которое отлично работает на хост-машине:

KERNEL=="sd?", SYMLINK+="test_%k"

2 ответа

Решение

Я понял. То, что я видел в интернете - это монтировать хост /dev внутри контейнера:

docker run -v=/dev:/dev (Примечание: не безопасно)

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

Однако, если я настрою правило udev на хост-машине для создания устройств в уникальном подкаталоге, например /dev/foo/sdX Я могу тогда просто поделиться dev/foo с моим контейнером:

docker run -v=/dev/foo:/dev/foo

Теперь, когда я вставляю диск, который соответствует моему правилу udev, хост-машина создает символическую ссылку в /dev/foo/sdX, который теперь вдруг виден моему контейнеру. Когда диск удален, /dev/foo/sdX также исчезает.


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

Это зависит от того, с каким устройством вы хотите работать.

Udev в контейнерах упоминается в

Особенно последняя ссылка дает подсказки, как отладить ситуацию.

Вы можете отслеживать события, связанные с udev, используя:

$ udevadm monitor

А для удовольствия вы можете вызвать события, позвонив:

$ udevadm trigger --subsystem=net --action=change

Поддержка докера для udev явно ограничена, так как докер не работает как среда виртуализации во всех аспектах.

Другие вопросы по тегам