4.0 KiB
Executable File
#!/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() {
if [ -f /etc/udev/links.conf ]; then
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 -m 600 /dev/$name $arg1
;;
*)
echo "unparseable line ($type $name $arg1)"
;;
esac
done
fi
}
##############################################################################
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