コンテナで実行するときに udev ルールを使用して /dev/xxx を管理する方法

コンテナで実行するときに udev ルールを使用して /dev/xxx を管理する方法

まず、本番環境で/dev/randomのアクセス権を変更したくないことをお伝えしたいと思います。これは、systemdがmobyで実行されていることを確認するためのテストであり、udevの規則は/ etc / udev /にあります。 rule.d/xxxxの動作

質問 1: /etc/udev/rules.d/xxx のコンテナの udev 管理ルールが --privileged コンテナが使用されている場合にのみ有効なのはなぜですか?

systemdがudevを使用して/etc/udev/rules.d/xxxを介して/ dev/xxxを管理する必要がある場合、systemdにはどのような権限が必要ですか?

Q2:--privilegedgedを使用してコンテナを起動したときにコンテナを再起動すると、phycalhostの/dev/xxxアクセス権が変更され、Physicalhostの/etc/udev/rules.d/xxxルールを使用するのはなぜですか?私はこれが不合理だと思います。

使用された分布

Red Hat 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

現在、--privilegesがないコンテナで/etc/udev/rules.d/xxxルールが無効な理由がわかりません。

--privilegeを使用してコンテナBを起動する

[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

私の視点では:

  1. 私はこれがdocker privで実行されているsystemdに関連していると思います。
  2. --privileges で実行する場合、docker で実行されている systemd は、/etc/udev/rules.d/xxx を介して物理ホストの /dev/xxx アクセス権を変更しないでください。
  3. --privilegesなしで実行する場合、dockerで実行されるsystemdは/etc/udev/rules.d/xxxを介してコンテナの/dev/xxxアクセス権を変更できる必要があります。

答え1

--privilegedでコンテナAを作成すると、コンテナAに/ sys rwアクセス権があり、systemd-udev-trigger.serivceサービスが正常に実行できるというソリューションがありました。これは、udevadmがueventを/ sys / devices /としてトリガーできることを意味します。//ueventと物理ホストもこのueventを取得し、/etc/udev/rules.d/xxxを物理的に使用できます。

udevadm トリガーの目的は、カーネルに既存のすべてのデバイスにイベントを送信するよう指示することです。 /sys/devices/ に書き込んでこれを行います。//uevent。これを行うには、読み取り/書き込みモードで/ sysにsysfsをマウントする必要があります。

関連情報