Как получить события 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.