首先我想说,我并不是真的想修改/dev/random在产品中的访问权限,这只是一个测试来验证systemd何时在moby中运行,udev的规则在/etc/udev/rules.d/xxxx中的行为
问题1:为什么只有使用--priviledged容器时,/etc/udev/rules.d/xxx中容器的udev管理规则才有效?
如果systemd需要通过/etc/udev/rules.d/xxx使用udev来管理/dev/xxx,systemd需要什么权限?
问题2:当我使用--privilegedged启动容器时,为什么容器重新启动会修改phycalhost的/dev/xxx访问权限并使用physicalhost的/etc/udev/rules.d/xxx规则?我认为这是不合理的
使用过的分布
红帽7.2
如果出现错误报告:重现问题的步骤
启动一个没有 --privilegedged 的容器A
[root@physicalhost /home/ahao.mah]
#docker run -d --net host reg.docker.xxxxx.com/mybase/centos7u2:latest
36cc8f6759294b2b2900b313c4f978737b11671b7ab2cc185e69fba3f6a9d10c
[root@containerA /home/ahao.mah]
#docker exec -it 36cc8f6759294b2b2900b313c4f978737b11671b7ab2cc185e69fba3f6a9d10c bash
修改containerA中的udev规则:
[root@containerA /]
#cat /etc/udev/rules.d/70-test_random.rules
KERNEL=="random", GROUP="root", MODE="0665", OPTIONS="last_rule"
重启这个容器A:
[root@physicalhost /home/ahao.mah]
#docker restart 36cc8f675929
36cc8f675929
containerA 的 /dev/random 仍然是 0666,但不是 0665
[root@containerA /]
#ll /dev/random
crw-rw-rw- 1 root root 1, 8 Aug 8 11:34 /dev/random
目前我不知道为什么 /etc/udev/rules.d/xxx 规则在没有 --privileges 的容器中无效?
使用--privilege启动一个containerB
[root@physicalhost /home/ahao.mah]
#docker run -d --net host --privileged reg.docker.xxxxx.com/mybase/centos7u2:latest
[root@containerB /home/ahao.mah]
#docker exec -it 1853437e8d2ea7018475b2328a10f1625da8b0c667941d69d912598325dc830d bash
现在containerB的/dev/random默认访问权限也是0666,但是我想修改containerB的/dev/random访问权限为0660,那么我需要在/etc/udev/rules.d/xxx中使用udev规则
[root@containerB /]
#ll /dev/random
crw-rw-rw- 1 root root 1, 8 Aug 8 11:40 /dev/random
[root@containerB /]
#vim /etc/udev/rules.d/70-test_random.rules
KERNEL=="random", GROUP="root", MODE="0660", OPTIONS="last_rule"
现在physicalhost的/dev/random默认访问权限也是0666,但我将physical的/dev/random访问权限修改为0777
[root@physicalhost /]
#cat /etc/udev/rules.d/70-test_random.rules
#KERNEL=="random", GROUP="root", MODE="0777", OPTIONS="last_rule"
[root@physicalhost /]
#ll /dev/random
#crw-rw-rw- 1 root root 1, 8 Aug 8 11:40 /dev/random
重启容器B:
[root@physicalhost /home/ahao.mah]
#docker restart 1853437e8d2e
1853437e8d2e
容器B的/dev/random和物理主机的/dev/access都改变了!
[root@containerB /]
#ll /dev/random
crw-rw---- 1 root root 1, 8 Aug 8 11:41 /dev/random
[root@physicalhost /home/ahao.mah]
#ll /dev/random
crwxrwxrwx 1 root root 1, 8 Aug 8 11:43 /dev/random
我的看法:
- 我认为这与在 docker priv 中运行的 systemd 有关
- 当使用 --privileges 运行时,在 docker 中运行的 systemd 不应通过 /etc/udev/rules.d/xxx 修改物理主机的 /dev/xxx 访问权限
- 当没有 --privileges 运行时,在 docker 中运行的 systemd 应该可以通过 /etc/udev/rules.d/xxx 修改容器的 /dev/xxx 访问权限
答案1
我得到了我的解决方案,当通过--privileged创建一个containerA时,该containerA具有/sys rw访问权限,并且服务systemd-udev-trigger.serivce可以成功执行。这意味着 udevadm 可以触发 uevent 到 /sys/devices///uevent和物理主机也可以获取这个uevent,然后物理使用它的/etc/udev/rules.d/xxx
udevadm 触发器的目的是告诉内核为所有存在的设备发送事件。它通过写入 /sys/devices/ 来实现这一点//uevent。这需要将sysfs以读写方式挂载在/sys上。