Use docker run -idt -v /dev:/dev --privileged --name delete ubuntu:18.04 /bin/bash
to new a container, and in container use apt-get install -y udev
to install udev.
When start udev, it reports next:
root@0947408dab9b:~# service udev start
* udev does not support containers, not started
Then, I change the init script in /etc/init.d/udev
, comments next 2 parts:
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
Then, re-execute 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 ]
Then, I verify the udev in container with some udev rules added, and unplug/plug some usb device, I saw it works.
So, my question is: why in udev init script disable this in container, it's really works... Possible any special scenario I'm not aware?
UPDATE:
Also add tests next:
1. I add a simple rule next:
root@0947408dab9b:/dev# cat /etc/udev/rules.d/100.rules
ACTION=="add", SYMLINK+="thisistestfile"
2. service udev restart
3. Unplug/Plug the usb mouse
We could see there is a file with the name "thisistestfile" in /dev
:
root@0947408dab9b:/dev# ls -alh /dev/thisistestfile
lrwxrwxrwx 1 root root 13 May 28 08:58 /dev/thisistestfile -> input/event12
udev is a generic device manager running as a daemon on a Linux system and listening (via a netlink socket) to uevents the kernel sends out if a new device is initialized or a device is removed from the system.
udev is a replacement for the Device File System (DevFS) starting with the Linux 2.6 kernel series. It allows you to identify devices based on their properties, like vendor ID and device ID, dynamically. udev runs in userspace (as opposed to devfs which was executed in kernel space).
To check whether mdev is working or not , First check in /sbin/ whether mdev is present or not. If it is not present then probably mdev is not configured properly, or else if it is present then check whether hotplug handler has been set properly. i.e inside /proc/sys/kernel/hotplug it should be /sbin/mdev written.
RULES FILES. The udev rules are read from the files located in the system rules directory /lib/udev/rules. d, the volatile runtime directory /run/udev/rules. d and the local administration directory /etc/udev/rules.
udev
disabled in containers, it's really worksudev is a generic device manager running as a daemon on a Linux system and listening (via a netlink socket) to uevents the kernel sends out if a new device is initialized or a device is removed from the system. udev
is now part of systemd
.
I think it is not about udev
but controversy between docker
and systemd
developers. Daniel Walsh has a good article series about this topic. I highly recommend this one and this one. Basically, common systems usually have a init system that running as PID 1
. Upstream docker
says any process can run as PID 1
in a container. This process is your application and they are recommending to run every application in a separate container. The systemd
developers believe the opposite. They say you should always run an init system as PID
1 in any environment. They state that PID 1
provides services to the processes inside the container that are part of the Linux API.
Both sides are making it hard to run systemd
in a docker
container even though like you said it's really works
.
If you want to learn more about the conflict here is another good article.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With