#!/bin/sh -e PATH="/sbin:/bin" UDEVSTART=/sbin/udevstart # default maximum size of the /dev tmpfs tmpfs_size="1M" [ -x $UDEVSTART ] || exit 0 . /etc/udev/udev.conf case "$(uname -r)" in 2.[012345].*) echo "udev requires a 2.6.x kernel, not started." exit 0 ;; esac if ! grep -q '[[:space:]]tmpfs$' /proc/filesystems; then echo "udev requires tmpfs support, not started." exit 0 fi if [ ! -e /proc/sys/kernel/hotplug ]; then echo "udev requires hotplug support, not started." exit 0 fi if [ "$udev_root" != "/dev/" ]; then echo "udev_root != /dev/, not started. Please check /etc/udev/udev.conf." exit 0 fi ############################################################################## # we need to unmount /dev/pts/ and remount it later over the tmpfs 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 tmpfs over /dev, if somebody did not already do it mount_tmpfs() { if grep -E -q "^[^[:space:]]+ /dev tmpfs" /proc/mounts; then return 0 fi # /.dev is used by /sbin/MAKEDEV to access the real /dev directory. # if you don't like it just remove it. [ -d /.dev ] && mount --bind /dev /.dev echo -n "Mounting a tmpfs over /dev..." mount -n -o fscontext=system_u:object_r:device_t,size=$tmpfs_size,mode=0755 -t tmpfs 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 } # 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) unmount_devpts mount_tmpfs ACTION=add echo -n "Creating initial device nodes..." $UDEVSTART make_extra_nodes # all extra nodes created we must do the security contexts on them, oh dear. if [ -x /sbin/restoredevicefiles ]; then /sbin/restoredevicefiles fi echo "done." ;; remove) # I'm not sure this is useful ACTION=remove echo -n "Removing device nodes..." old_synthesize_events echo "done." ;; stop) start-stop-daemon --stop --exec /sbin/udevd --oknodo --quiet 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) 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