#!/bin/sh -e ### BEGIN INIT INFO # Provides: udev # Required-Start: mountkernfs # Required-Stop: # Default-Start: S # Default-Stop: # Short-Description: Start udevd, populate /dev and load drivers. ### END INIT INFO # This script is based on Debian's. COLDPLUG=no COLDPLUG_TARBALL="/lib/udev/devices.tar.gz" for x in $(cat /proc/cmdline); do case $x in coldplug) COLDPLUG=yes ;; esac done # we need to unmount /dev/pts/ and remount it later over the tmpfs unmount_devpts() { if mountpoint -q /dev/pts/; then umount -n -l /dev/pts/ fi if mountpoint -q /dev/shm/; then umount -n -l /dev/shm/ fi } # mount a tmpfs over /dev, if somebody did not already do it mount_tmpfs() { if grep -q "/dev tmpfs" /proc/mounts; then return fi if ! mount -n -o size=$tmpfs_size,mode=0755 -t tmpfs udev /dev; then echo "udev requires tmpfs support, not started." exit 1 fi return 0 } create_dev_makedev() { if [ -e /sbin/MAKEDEV ]; then ln -sf /sbin/MAKEDEV /dev/MAKEDEV else ln -sf /bin/true /dev/MAKEDEV fi } make_extra_nodes() { ret=1 if [ "$(echo /lib/udev/devices/*)" != "/lib/udev/devices/*" ]; then cp -a /lib/udev/devices/* /$1/ ret=0 fi [ -e /etc/udev/links.conf ] || return $ret grep '^[^#]' /etc/udev/links.conf | \ while read type name arg1; do [ "$type" -a "$name" -a ! -e "/$1/$name" -a ! -L "/$1/$name" ] || continue case "$type" in L) ln -s $arg1 /$1/$name ;; D) mkdir -p /$1/$name ;; M) mknod -m 600 /$1/$name $arg1 ;; *) echo "links.conf: unparseable line ($type $name $arg1)" >&2 ;; esac done return $ret } ############################################################################## [ -x /sbin/udevd ] || exit 0 PATH="/sbin:/bin" # defaults tmpfs_size="2M" udev_root="/dev" if [ -e /etc/udev/udev.conf ]; then . /etc/udev/udev.conf fi ############################################################################## # When modifying this script, do not forget that between the time that the # new /dev has been mounted and udevadm trigger has been run there will be # no /dev/null. This also means that you cannot use the "&" shell command. case "$1" in start) if [ -e "$udev_root/.udev/" ]; then if mountpoint -q $udev_root/; then TMPFS_MOUNTED=1 else echo ".udev/ already exists on the static $udev_root!" fi fi echo > /sys/kernel/uevent_helper if [ -z "$TMPFS_MOUNTED" ]; then unmount_devpts mount_tmpfs else # and clean up the database of the initramfs udev rm -rf /dev/.udev/ fi # /dev/null must be created before udevd is started if ! make_extra_nodes "$udev_root"; then COLDPLUG=yes fi if [ ! -f "$COLDPLUG_TARBALL" ]; then COLDPLUG=yes fi # if this directory is not present /dev will not be updated by udev mkdir -p /dev/.udev/db/ echo "Startting the hotplug events dispatcher" udevd --daemon mkdir -p /dev/.udev/queue/ /dev/.udev/rules.d/ create_dev_makedev if [ $COLDPLUG != "no" ]; then echo "Synthesizing the initial hotplug events" udevadm trigger # wait for the udevd childs to finish echo "Waiting for /dev to be fully populated" if udevadm settle; then echo 'done' else echo 'timeout' fi fi ;; stop) echo "Stopping the hotplug events dispatcher" start-stop-daemon --stop --name udevd --quiet --oknodo ;; restart) echo "Stopping the hotplug events dispatcher" start-stop-daemon --stop --name udevd --quiet --oknodo echo "Startting the hotplug events dispatcher" udevd --daemon ;; reload|force-reload) udevadm control --reload_rules ;; *) echo "Usage: /etc/init.d/udev {start|stop|restart|reload|force-reload}" exit 1 ;; esac exit 0