如何从 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 事件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 udev 规则在运行的 docker 容器中不起作用?

如何从主机获取 Docker 容器的 IP 地址

如何从docker容器中获取docker主机的IP地址

如何从 docker 容器内的主机工作站获取 aws 凭据

如何解决docker宿主机无法访问容器中的服务

如何使用nodejs获取节点docker容器中的主机主目录路径?