使用docker run -idt -v /dev:/dev --privileged --name delete ubuntu:18.04 /bin/bash新的容器,并在容器使用apt-get install -y udev安装的udev。
当启动 udev 时,它报告下一个:
root@0947408dab9b:~# service udev start
* udev does not support containers, not started
Run Code Online (Sandbox Code Playgroud)
然后,我更改了 init 脚本/etc/init.d/udev,评论了接下来的两部分:
1) 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
2) Comments next:
#if [ ! -w /sys ]; then
# log_warning_msg "udev does not support containers, not started"
# exit 0
#fi
Run Code Online (Sandbox Code Playgroud)
然后,重新执行service udev start:
root@0947408dab9b:/etc/init.d# service udev start
* Starting the hotplug events dispatcher systemd-udevd starting version 237
[ OK ]
* Synthesizing the initial hotplug events... [ OK ]
* Waiting for /dev to be fully populated... [ OK ]
Run Code Online (Sandbox Code Playgroud)
然后,我验证容器中的 udev 添加了一些 udev 规则,并拔出/插入一些 USB 设备,我看到它有效。
所以,我的问题是:为什么在 udev init 脚本中在容器中禁用它,它确实有效......可能有任何我不知道的特殊情况?
更新:
接下来还要添加测试:
1.我接下来添加一个简单的规则:
root@0947408dab9b:/dev# cat /etc/udev/rules.d/100.rules
ACTION=="add", SYMLINK+="thisistestfile"
Run Code Online (Sandbox Code Playgroud)
2.服务udev重启
3.拔/插USB鼠标
我们可以看到有一个名为“thisistestfile”的文件/dev:
root@0947408dab9b:/dev# ls -alh /dev/thisistestfile
lrwxrwxrwx 1 root root 13 May 28 08:58 /dev/thisistestfile -> input/event12
Run Code Online (Sandbox Code Playgroud)
udev在容器中禁用,它确实有效udev是一个通用设备管理器,在 Linux 系统上作为守护进程运行,并侦听(通过 netlink 套接字)内核在初始化新设备或从系统中删除设备时发出的 uevents。udev现在是的一部分 systemd。
我认为这不是关于,而是与开发者udev之间的争议。Daniel Walsh有一个关于这个主题的好文章系列。我强烈推荐这个和这个。基本上,常见的系统通常都有一个以. Upstream表示任何进程都可以像在容器中一样运行。这个过程是您的应用程序,他们建议在单独的容器中运行每个应用程序。开发商的看法恰恰相反。他们说你应该在任何环境中始终将 init 系统作为1 运行。他们指出,它为容器内的进程提供服务,这些进程是 Linux API 的一部分。dockersystemdPID 1dockerPID 1systemdPIDPID 1
即使像你说的那样,双方都使得systemd在容器中运行变得困难。dockerit's really works
如果您想了解有关冲突的更多信息,请阅读另一篇好文章。
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |