【问题标题】:How to get host's udev events from a Docker container?如何从 Docker 容器中获取主机的 udev 事件?
【发布时间】:2018-09-16 03:53:56
【问题描述】:

在 Docker 容器中,我正在寻找一种方法来获取主机上的 udev 事件。
使用udevadm monitor,它只在容器中发回主机的内核事件。

问题是是否有办法检测主机的 udev 事件或将主机的事件转发到容器?

【问题讨论】:

    标签: docker events 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系统,所以每个操作都应该在容器中进行。
    猜你喜欢
    • 2014-05-21
    • 2016-10-12
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多