#!/sbin/itype # This is a i file, used by initng parsed by install_service # NAME: udev # DESCRIPTION: The Linux Userspace Device filesystem # WWW: http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html virtual system/udev { critical; need = system/udev/filldev system/udev/udevd; also_start = system/udev/move_rules system/udev/retry_failed; } # start the udev daemon daemon system/udev/udevd { critical; need = system/udev/mountdev system/initial/mountvirtfs; respawn; exec daemon = /sbin/udevd; } # copy the rules generated before / was mounted read-write service system/udev/move_rules { need = system/udev/udevd system/mountroot/rootrw; script start = { for file in /dev/.udev/tmp-rules--* do dest=${file##*tmp-rules--} [ "$dest" = '*' ] && break { /bin/cp $file /etc/udev/rules.d/$dest rm -f $file } & done wait }; } service system/udev/retry_failed { need = system/udev/udevd system/mountfs/essential system/udev/move_rules; script start = { [ -x "/sbin/udevtrigger" ] || exit 0 # Check if it supports the --retry-failed argument before # calling. /sbin/udevtrigger --help 2>&1 | grep -q -- --retry-failed && /sbin/udevtrigger --retry-failed exit 0 }; } service system/udev/mountdev { critical; need = system/initial/mountvirtfs; script start = { error() { echo "${*}" >&2 exit 1 } [ -e /proc/filesystems ] || error "udev requires a mounted procfs, not started." /bin/grep -q '[[:space:]]tmpfs$' /proc/filesystems || error "udev requires tmpfs support, not started." [ -d /sys/block ] || error "udev requires a mounted sysfs, not started." # mount a tmpfs over /dev, if somebody did not already do it /bin/grep -Eq "^[^[:space:]]+[[:space:]]+/dev[[:space:]]+tmpfs[[:space:]]+" /proc/mounts && exit 0 if ! /bin/mount -n -o size=$tmpfs_size,mode=0755 -t tmpfs udev /dev then /bin/umount -n /etc/udev error "udev in /dev his own filesystem (tmpfs), not started." fi # Make some default static onces, so we are sure they will exist. /bin/mknod -m0666 /dev/null c 1 3 /bin/mknod -m0666 /dev/zero c 1 5 /bin/mknod /dev/console c 5 1 # Send SIGHUP to initng, will reopen /dev/initctl and # /dev/initng. # we can't assume that initng has pid 1, e.g. when booting # from initrd # (NOTE: this happen only on a few distros, and is weird) /bin/killall -HUP initng exit 0 }; } # fill /dev service system/udev/filldev { critical; need = system/udev/udevd; script start = { ln -sf input/mice /dev/mouse # Copy contents of /etc/udev/devices and /lib/udev/devices for devdir in /etc/udev/devices /lib/udev/devices; do if [ -d "$devdir" ] then { cd $devdir && tar c . | tar x --directory=/dev/ } & fi done #Don't know why, but this seems to be needed on Fedora... /bin/ln -snf /proc/self/fd /dev/fd #Parse through stuff in /etc/udev/makedev.d to add nodes xargs_simple () { ARGS="" while read line; do ARGS="$ARGS $line" done if [ -n "$ARGS" ]; then "$@" $ARGS fi } for i in /etc/udev/makedev.d/*.nodes; do if [ -f "$i" ]; then ( /bin/sed -e 's,#.*,,g' "$i" | \ xargs_simple /usr/sbin/MAKEDEV -x ) & fi done if [ ! -e /etc/udev/links.conf -a ! -d /lib/udev/devices ] then # Some manually, just to be sure. /bin/ln -snf /proc/self/fd /dev/fd & /bin/ln -snf fd/0 /dev/stdin & /bin/ln -snf fd/1 /dev/stdout & /bin/ln -snf fd/2 /dev/stderr & /bin/ln -snf /proc/kcore /dev/core & /bin/ln -snf /proc/asound/oss/sndstat /dev/sndstat & wait fi # udevtrigger is available since udev 088 # udevsettle is available since udev 090 # if this directories are not present /dev will not be updated by udev /bin/mkdir -p /dev/.udev/db/ /dev/.udev/queue/ # send hotplug events /sbin/udevtrigger # wait for the udevd childs to finish /sbin/udevsettle chmod 0666 /dev/null }; }