【发布时间】:2018-09-16 03:53:56
【问题描述】:
在 Docker 容器中,我正在寻找一种方法来获取主机上的 udev 事件。
使用udevadm monitor,它只在容器中发回主机的内核事件。
问题是是否有办法检测主机的 udev 事件或将主机的事件转发到容器?
【问题讨论】:
在 Docker 容器中,我正在寻找一种方法来获取主机上的 udev 事件。
使用udevadm monitor,它只在容器中发回主机的内核事件。
问题是是否有办法检测主机的 udev 事件或将主机的事件转发到容器?
【问题讨论】:
这就是我让我的容器通过 udev 接收主机事件的方式:
docker run --net=host -v /run/udev/control:/run/udev/control
--net=host 允许容器和主机通过PF_NETLINK 套接字进行操作,udev 监视器使用这些套接字接收内核事件(找到here)
/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.
【讨论】:
/etc/init.d/udev 中找不到第 2) 部分。除了service udev start,我是否必须在容器内做任何事情?
/etc/init.d/udev在容器中的,它是针对主机的单独的udev系统,所以每个操作都应该在容器中进行。