#!/bin/sh -e PATH="/usr/sbin:/usr/bin:/sbin:/bin" UDEVSTART=/sbin/udevstart # default maximum size of the /dev ramfs ramfs_size="1M" [ -x $UDEVSTART ] || exit 0 . /etc/udev/udev.conf case "$(uname -r)" in 2.[012345].*) echo "udev requires a kernel >= 2.6, not started." exit 0 ;; esac if ! grep -q '[[:space:]]ramfs$' /proc/filesystems; then echo "udev requires ramfs support, not started." exit 0 fi if [ ! -e /proc/sys/kernel/hotplug ]; then echo "udev requires hotplug support, not started." exit 0 fi ############################################################################## # we need to unmount /dev/pts/ and remount it later over the ramfs unmount_devpts() { if mountpoint -q /dev/pts/; then umount -l /dev/pts/ fi if mountpoint -q /dev/shm/; then umount -l /dev/shm/ fi } # mount a ramfs over /dev, if somebody did not already do it mount_ramfs() { if grep -E -q "^[^[:space:]]+ /dev ramfs" /proc/mounts; then return 0 fi # /.dev is used by /sbin/MAKEDEV to access the real /dev directory. # if you don't like this, remove /.dev/. [ -d /.dev ] && mount --bind /dev /.dev echo -n "Mounting a ramfs over /dev..." mount -n -o size=$ramfs_size,mode=0755 -t ramfs none /dev echo "done." } # I hate this hack. -- Md make_extra_nodes() { grep '^[^#]' /etc/udev/links.conf | \ while read type name arg1; do [ "$type" -a "$name" -a ! -e "/dev/$name" -a ! -L "/dev/$name" ] ||continue case "$type" in L) ln -s $arg1 /dev/$name ;; D) mkdir -p /dev/$name ;; M) mknod --mode=600 /dev/$name $arg1 ;; *) echo "unparseable line ($type $name $arg1)" ;; esac done } ############################################################################## if [ "$udev_root" != "/dev/" ]; then echo "WARNING: udev_root != /dev/" case "$1" in start) if [ -e "$udev_root/.udev.tdb" ]; then if mountpoint -q /dev/; then echo "FATAL: udev is already active on $udev_root." exit 1 else echo "WARNING: .udev.tdb already exists on the old $udev_root!" fi fi mount -n -o size=$ramfs_size,mode=0755 -t ramfs none $udev_root echo -n "Creating initial device nodes..." $UDEVSTART echo "done." ;; stop) start-stop-daemon -K -x /sbin/udevd echo -n "Unmounting $udev_root..." # unmounting with -l should never fail if umount -l $udev_root; then echo "done." else echo "failed." fi ;; restart|force-reload) $0 stop $0 start ;; *) echo "Usage: /etc/init.d/udev {start|stop|restart|force-reload}" exit 1 ;; esac exit 0 fi # udev_root != /dev/ ############################################################################## # When modifying this script, do not forget that between the time that # the new /dev has been mounted and udevstart 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.tdb" ]; then if mountpoint -q /dev/; then echo "FATAL: udev is already active on $udev_root." exit 1 else echo "WARNING: .udev.tdb already exists on the old $udev_root!" fi fi unmount_devpts mount_ramfs ACTION=add echo -n "Creating initial device nodes..." $UDEVSTART make_extra_nodes echo "done." # /etc/init.d/mountvirtfs start ;; stop) start-stop-daemon -K -x /sbin/udevd unmount_devpts echo -n "Unmounting /dev..." # unmounting with -l should never fail if umount -l /dev; then echo "done." umount -l /.dev || true # /etc/init.d/mountvirtfs start else echo "failed." fi ;; restart|force-reload) start-stop-daemon -K -x /sbin/udevd echo -n "Recreating device nodes..." ACTION=add $UDEVSTART make_extra_nodes echo "done." ;; *) echo "Usage: /etc/init.d/udev {start|stop|restart|force-reload}" exit 1 ;; esac exit 0