Как получить события udev хоста из контейнера Docker?

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

Вопрос в том, есть ли способ обнаружить события udev хоста или переслать событие хоста в контейнеры?

1 ответ

Вот как я заставил мой контейнер получать события хоста от udev:

docker run --net=host -v /run/udev/control:/run/udev/control

--net = host позволяет контейнеру и хосту работать через сокеты PF_NETLINK, которые используются монитором udev для получения событий ядра (находится здесь)

/ run / udev / control - это файл, который монитор udev использует для проверки, запущен ли уже udevd. Если он не существует, мониторинг отключен.

Как указано выше, мы могли бы включить --net=host, но host network не предлагается по нескольким известным причинам.

На самом деле эта проблема возникает только потому, что ей нужно NETLINK для связи между ядром и пользовательским пространством, но если не использовать host network, хост и контейнер будут в разных netns, поэтому включите udev в контейнере может сделать их в тех же сетях, которые тогда не нужно использовать host network.

Когда мы столкнулись с этой проблемой, мы сделали следующее:

# apt-get install udev

# vim /etc/init.d/udev to comment some special settings:

    1) Comments next:
    #if [ ! -e "/run/udev/" ]; then
    #    warn_if_interactive
    #fi

    2) Comments next:
    #if ! ps --no-headers --format args ax | egrep -q '^\['; then
    #    log_warning_msg "udev does not support containers, not started"
    #    exit 0
    #fi

# root@e751e437a8ba:~# service udev start
  [ ok ] Starting hotplug events dispatcher: systemd-udevd.
  [ ok ] Synthesizing the initial hotplug events (subsystems)...done.
  [ ok ] Synthesizing the initial hotplug events (devices)...done.
  [ ok ] Waiting for /dev to be fully populated...done.
Другие вопросы по тегам