# System hotplug handled by udev, mdevd, or mdev (preferred order) # # Your system usually has either udevd, mdev, or mdevd. They probe the system # for devices, loading modules and any firmware needed. Since the bootstrap # often needs to be synchronized carefully, we suggest using your system log # daemon as the barrier for all other services. E.g.: # # service if:udevd [S0123456789] syslogd -F -- System log daemon # service if:mdev [S0123456789] syslogd -F -- System log daemon # service if:mdevd [S0123456789] syslogd -F -- System log daemon # # This provdes a condition that can act as a barrier for all # other services. Notice the `if:` statement and the condition for starting # syslogd is only considered if either udevd or mdev (service) is loaded and # is guaranteed to run after each respective run stanza have completed. # # Override this file by copying it to /etc/finit.d/, using the same name, then # change the contents any way you like, it can even be empty. # Check for systemd-udevd and eudev, if we find both, we opt for the latter. service nowarn cgroup.system name:udevd notify:none env:-/etc/default/udevd pid:udevd log \ [S12345789] /lib/systemd/systemd-udevd $UDEVD_ARGS -- Device event daemon (udev) service nowarn cgroup.system name:udevd notify:none env:-/etc/default/udevd pid:udevd log \ [S12345789] udevd $UDEVD_ARGS -- Device event daemon (udev) # Wait for udevd to start, then trigger coldplug events and module loading. # The last 'settle' call waits for it to finalize processing all uevents. run nowarn if:udevd cgroup.init :1 [S] log udevadm settle -t 0 -- run nowarn if:udevd cgroup.init :2 [S] log udevadm control --reload -- run nowarn if:udevd cgroup.init :3 [S] log udevadm trigger -c add -t devices -- Requesting device events run nowarn if:udevd cgroup.init :4 [S] log udevadm trigger -c add -t subsystems -- Requesting subsystem events run nowarn if:udevd cgroup.init :5 [S] log udevadm settle -t 30 -- Waiting for udev to finish # If udevd is not available, check for mdevd. Unlike plain 'mdev -df', the # mdevd-coldplug process exits when mdevd has completed. So the condition # (same as for plain mdev below) can be relied on as a # barrier for services that, e.g., need to probe for switchcore ports or PHYs # that require firmware loading before they show up. service nowarn conflict:udevd,mdev cgroup.init notify:none if:!udevd \ [S12345789] notify:s6 mdevd -O 4 -D %n -- Device event daemon (mdevd) run nowarn conflict:udevd,mdev cgroup.init name:coldplug \ [S] mdevd-coldplug -- Cold plugging system # If neither udevd or mdevd are available, fall back to mdev. The new daemon # mode calls `mdev -s` internally but does not create a PID file when that is # done, so synchronization with coldplug is fragile. service nowarn conflict:udevd,mdevd cgroup.init notify:none if:!udevd,!mdevd \ [S12345789] mdev -df -S -- Device event daemon (mdev) # Trigger a replay of all uevents from boot, before userspace was up and the # filesystem mounted. Compared to udevd, we don't know when 'mdev -df' has # finished processing all events, i.e., depending on is # not an indicator of all devices having been (re)discovered and fully set up. run nowarn conflict:udevd,mdevd cgroup.init name:coldplug if:mdev \ [S] @pkglibexecdir@/coldplug -- Cold plugging system