如何从 Docker 容器中获取主机的 udev 事件?
Posted
技术标签:
【中文标题】如何从 Docker 容器中获取主机的 udev 事件?【英文标题】:How to get host's udev events from a Docker container? 【发布时间】:2018-09-16 03:53:56 【问题描述】:在 Docker 容器中,我正在寻找一种方法来获取主机上的 udev 事件。
使用udevadm monitor
,它只在容器中发回主机的内核事件。
问题是是否有办法检测主机的 udev 事件或将主机的事件转发到容器?
【问题讨论】:
【参考方案1】:这就是我让我的容器通过 udev 接收主机事件的方式:
docker run --net=host -v /run/udev/control:/run/udev/control
--net=host 允许容器和主机通过PF_NETLINK 套接字进行操作,udev 监视器使用这些套接字接收内核事件(找到here)
/run/udev/control 是一个文件,udev 监视器使用它来检查 udevd 是否已经在运行。如果不存在,则禁用监视。
【讨论】:
是的,这是一种制作方法,但不是理想的方法,因为主机模式不安全。【参考方案2】:就像上面的答案指出的那样:我们可以启用--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系统,所以每个操作都应该在容器中进行。以上是关于如何从 Docker 容器中获取主机的 udev 事件?的主要内容,如果未能解决你的问题,请参考以下文章