#!/sbin/runscript # Copyright 1999-2008 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 description="Run udevd and create the device-nodes" [ -e /etc/udev/udev.conf ] && . /etc/udev/udev.conf . /lib/udev/shell-compat.sh rc_coldplug=${rc_coldplug:-${RC_COLDPLUG:-YES}} depend() { if [ -f /etc/init.d/sysfs ]; then # require new enough openrc with sysinit being extra runlevel # on linux we just check if sysfs init-script exists # this is to silence out ugly warnings about not-existing sysfs script provide dev need sysfs udev-mount udev-dev-tarball before checkfs fsck fi } cleanup() { # fail more gracely and not leave udevd running start-stop-daemon --stop --exec /sbin/udevd exit 1 } disable_hotplug_agent() { if [ -e /proc/sys/kernel/hotplug ]; then echo "" >/proc/sys/kernel/hotplug fi } root_link() { /lib/udev/write_root_link_rule } persistent_net_switch() { # this function disables rules files # by creating new files with the same name # in a temp rules directory with higher priority local d=/dev/.udev/rules.d if yesno "${persistent_net_disable:-no}"; then mkdir -p "$d" echo "# This file disables persistent-net due to /etc/conf.d/udev" \ > "$d"/75-persistent-net-generator.rules fi } start_udevd() { # load unix domain sockets if built as module, Bug #221253 if [ -e /proc/modules ] ; then modprobe -q unix 2>/dev/null fi ebegin "Starting udevd" start-stop-daemon --start --exec /sbin/udevd -- --daemon eend $? } # populate /dev with devices already found by the kernel populate_dev() { if get_bootparam "nocoldplug" ; then rc_coldplug="NO" ewarn "Skipping udev coldplug as requested in kernel cmdline" fi ebegin "Populating /dev with existing devices through uevents" if yesno "${rc_coldplug}"; then udevadm trigger else # Do not run any init-scripts, Bug #206518 udevadm control --env do_not_run_plug_service=1 # only create device nodes udevadm trigger --attr-match=dev # run persistent-net stuff, bug 191466 udevadm trigger --subsystem-match=net fi eend $? ebegin "Waiting for uevents to be processed" udevadm settle --timeout=60 eend $? udevadm control --env do_not_run_plug_service= return 0 } display_hotplugged_services() { local svcfile= svc= services= for svcfile in "${RC_SVCDIR}"/hotplugged/*; do svc="${svcfile##*/}" [ -x "${svcfile}" ] || continue # do not display this - better: do only inject it later :) [ "$svc" = "udev-postmount" ] && continue services="${services} ${svc}" done [ -n "${services}" ] && einfo "Device initiated services:${HILITE}${services}${NORMAL}" } inject_postmount_initd() { if ! mark_service_hotplugged udev-postmount; then IN_HOTPLUG=1 /etc/init.d/udev-postmount start >/dev/null 2>&1 fi #einfo "Injected udev-postmount service" } check_persistent_net() { # check if there are problems with persistent-net local syspath= devs= problem=false for syspath in /sys/class/net/*_rename*; do if [ -d "${syspath}" ]; then devs="${devs} ${syspath##*/}" problem=true fi done ${problem} || return 0 eerror "UDEV: Your system has a problem assigning persistent names" eerror "to these network interfaces: ${devs}" einfo "Checking persistent-net rules:" # the sed-expression lists all duplicate lines # from the input, like "uniq -d" does, but uniq # is installed into /usr/bin and not available at boot. dups=$( RULES_FILE='/etc/udev/rules.d/70-persistent-net.rules' . /lib/udev/rule_generator.functions find_all_rules 'NAME=' '.*' | \ tr ' ' '\n' | \ sort | \ sed '$!N; s/^\(.*\)\n\1$/\1/; t; D' ) if [ -n "${dups}" ]; then ewarn "The rules create multiple entries assigning these names:" eindent ewarn "${dups}" eoutdent else ewarn "Found no duplicate names in persistent-net rules," ewarn "there must be some other problem!" fi return 1 } check_udev_works() { # should exist on every system, else udev failed if [ ! -e /dev/zero ]; then eerror "Assuming udev failed somewhere, as /dev/zero does not exist." return 1 fi return 0 } start() { # do not run this on too old baselayout - udev-addon is already loaded! if [ ! -e /lib/librc.so -a -f /etc/init.d/sysfs ]; then eerror "The $SVCNAME init-script is written for baselayout-2!" eerror "Please do not use it with baselayout-1!". return 1 fi _start display_hotplugged_services inject_postmount_initd } _start() { root_link persistent_net_switch disable_hotplug_agent start_udevd || cleanup populate_dev || cleanup check_persistent_net check_udev_works || cleanup return 0 } stop() { ebegin "Stopping udevd" start-stop-daemon --stop --exec /sbin/udevd eend $? }