#!/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 # we need to unmount /dev/pts/ and remount it later over the devtmpfs proc unmount_devpts { if mountpoint -q /dev/pts/ { umount -n -l /dev/pts/ } if mountpoint -q /dev/shm/ { umount -n -l /dev/shm/ } } # mount a devtmpfs over /dev, if somebody did not already do it proc mount_devtmpfs { if grep -E -q "^[^[:space:]]+ /dev devtmpfs" /proc/mounts { mount -n -o remount,size=$tmpfs_size,mode=0755 -t devtmpfs devtmpfs /dev return } if ! mount -n -o size=$tmpfs_size,mode=0755 -t devtmpfs devtmpfs /dev { log_failure_msg "udev requires devtmpfs support, not started" log_end_msg 1 } return 0 } proc create_dev_makedev { if test -e /sbin/MAKEDEV { ln -sf /sbin/MAKEDEV /dev/MAKEDEV } else { ln -sf /bin/true /dev/MAKEDEV } } # If the initramfs does not have /run, the initramfs udev database must # be migrated from /dev/.udev/ to /run/udev/. proc move_udev_database { test -e "/dev/.udev/" || return 0 test ! -e /run/udev/ || return 0 test -e /run/ || return 0 mountpoint -q /run/ || return 0 mv /dev/.udev/ /run/udev/ || true } proc supported_kernel { matchstr $[uname -r] { 2.[012345].*|2.6.[0-9]|2.6.[0-9][!0-9]* { return 1 } 2.6.[12][0-9]|2.6.[12][0-9][!0-9]* { return 1 } 2.6.3[0-1]|2.6.3[0-1][!0-9]* { return 1 } } return 0 } # shell version of /usr/bin/tty proc my_tty { test -x /bin/readlink || return 0 test -e /proc/self/fd/0 || return 0 readlink --silent /proc/self/fd/0 || true } proc warn_if_interactive { if test $RUNLEVEL = "S" -a $PREVLEVEL = "N" { return } global TTY := $[my_tty] if test -z $TTY -o $TTY = "/dev/console" -o $TTY = "/dev/null" { return } printf "\n\n\nIt has been detected that the command\n\n\t$0 $ifsjoin(Argv)\n\n" printf "has been run from an interactive shell.\n" printf "It will probably not do what you expect, so this script will wait\n" printf "60 seconds before continuing. Press ^C to stop it.\n" printf "RUNNING THIS COMMAND IS HIGHLY DISCOURAGED!\n\n\n\n" sleep 60 } ############################################################################## test -x /sbin/udevd || exit 0 global PATH := '"/sbin:/bin'" # defaults global tmpfs_size := '"10M'" if test -e /etc/udev/udev.conf { source /etc/udev/udev.conf } source /lib/lsb/init-functions if ! supported_kernel { log_failure_msg "udev requires a kernel >= 2.6.32, not started" log_end_msg 1 } if test ! -e /proc/filesystems { log_failure_msg "udev requires a mounted procfs, not started" log_end_msg 1 } if ! grep -q '[[:space:]]devtmpfs$' /proc/filesystems { log_failure_msg "udev requires devtmpfs support, not started" log_end_msg 1 } if test ! -d /sys/class/ { log_failure_msg "udev requires a mounted sysfs, not started" log_end_msg 1 } if test ! -e /sys/kernel/uevent_helper { log_failure_msg "udev requires hotplug support, not started" log_end_msg 1 } if ! ps --no-headers --format args ax | egrep -q '^\[' { log_warning_msg "udev does not support containers, not started" exit 0 } if test -d /sys/class/mem/null -a ! -L /sys/class/mem/null || \ test -e /sys/block -a ! -e /sys/class/block { log_warning_msg "CONFIG_SYSFS_DEPRECATED must not be selected" log_warning_msg "Booting will continue in 30 seconds but many things will be broken" sleep 30 } # 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. matchstr $1 { start { if init_is_upstart !2 >/dev/null { exit 1 } if mountpoint -q /dev/ { global TMPFS_MOUNTED := '1' } elif test -e "/dev/.udev/" { log_warning_msg ".udev/ already exists on the static /dev" } if test ! -e "/dev/.udev/" -a ! -e "/run/udev/" { warn_if_interactive } echo > /sys/kernel/uevent_helper move_udev_database if test -z $TMPFS_MOUNTED { unmount_devpts mount_devtmpfs test -d /proc/1 || mount -n /proc } # clean up parts of the database created by the initramfs udev udevadm info --cleanup-db # set the SELinux context for devices created in the initramfs test -x /sbin/restorecon && /sbin/restorecon -R /dev # /dev/null must be created before udevd is started /lib/udev/create_static_nodes || true log_daemon_msg "Starting the hotplug events dispatcher" "udevd" if udevd --daemon { log_end_msg $Status } else { log_warning_msg $Status log_warning_msg "Waiting 15 seconds and trying to continue anyway" sleep 15 } log_action_begin_msg "Synthesizing the initial hotplug events" if udevadm trigger --action=add { log_action_end_msg $Status } else { log_action_end_msg $Status } create_dev_makedev # wait for the udevd childs to finish log_action_begin_msg "Waiting for /dev to be fully populated" if udevadm settle { log_action_end_msg 0 } else { log_action_end_msg 0 'timeout' } } stop { log_daemon_msg "Stopping the hotplug events dispatcher" "udevd" if start-stop-daemon --stop --name udevd --user root --quiet --oknodo --retry 5 { log_end_msg $Status } else { log_end_msg $Status } } restart { if init_is_upstart !2 >/dev/null { exit 1 } log_daemon_msg "Stopping the hotplug events dispatcher" "udevd" if start-stop-daemon --stop --name udevd --user root --quiet --oknodo --retry 5 { log_end_msg $Status } else { log_end_msg $Status || true } log_daemon_msg "Starting the hotplug events dispatcher" "udevd" if udevd --daemon { log_end_msg $Status } else { log_end_msg $Status } } reload|force-reload { udevadm control --reload-rules } status { status_of_proc /sbin/udevd udevd && exit 0 || exit $Status } * { echo "Usage: /etc/init.d/udev {start|stop|restart|reload|force-reload|status}" > !2 exit 1 } } exit 0