diff options
Diffstat (limited to 'generic/etc/init.d/udev')
-rw-r--r-- | generic/etc/init.d/udev | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/generic/etc/init.d/udev b/generic/etc/init.d/udev new file mode 100644 index 000000000..cdce003a3 --- /dev/null +++ b/generic/etc/init.d/udev @@ -0,0 +1,112 @@ +#! /bin/sh +# +# start_udev +# +# script to initialize /dev by using udev. +# +# Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com> +# +# Released under the GPL v2 only. +# +# This needs to be run at the earliest possible point in the boot +# process. +# +# Based on the udev init.d script +# +# Thanks go out to the Gentoo developers for proving +# that this is possible to do. +# +# Yes, it's very verbose, feel free to turn off all of the echo calls, +# they were there to make me feel better that everything was working +# properly during development... +# + +. /etc/udev/udev.conf + +prog=udev +sysfs_dir=/sys +bin=/sbin/udev +udevd=/sbin/udevd + +run_udev () { + export ACTION=add + + # handle block devices and their partitions + for i in ${sysfs_dir}/block/*; do + # add each drive + export DEVPATH=${i#${sysfs_dir}} + echo "$DEVPATH" + $bin block + + # add each partition, on each device + for j in $i/*; do + if [ -f $j/dev ]; then + export DEVPATH=${j#${sysfs_dir}} + echo "$DEVPATH" + $bin block + fi + done + done + # all other device classes + for i in ${sysfs_dir}/class/*; do + for j in $i/*; do + if [ -f $j/dev ]; then + export DEVPATH=${j#${sysfs_dir}} + CLASS=`echo ${i#${sysfs_dir}} | \ + cut --delimiter='/' --fields=3-` + echo "$DEVPATH" + $bin $CLASS + fi + done + done + return 0 +} + +make_extra_nodes () { + # there are a few things that sysfs does not export for us. + # these things go here (and remember to remove them in + # remove_extra_nodes() + # + # Thanks to Gentoo for the initial list of these. + ln -snf /proc/self/fd $udev_root/fd + ln -snf /proc/self/fd/0 $udev_root/stdin + ln -snf /proc/self/fd/1 $udev_root/stdout + ln -snf /proc/self/fd/2 $udev_root/stderr + ln -snf /proc/kcore $udev_root/core + + mkdir $udev_root/pts + mkdir $udev_root/shm +} + +# don't use udev if sysfs is not mounted. +if [ ! -d $sysfs_dir/block ]; then + echo "error: sysfs not mounted" + exit 1 +fi + +echo "mounting... ramfs at $udev_root" +mount -n -t ramfs none $udev_root + +# propogate /udev from /sys +echo "creating initial udev device nodes:" + +# You can use the shell scripts above by calling run_udev or execute udevstart +# which does the same thing, but much faster by not using shell. +# only comment out one of the following lines. +#run_udev +/sbin/udevstart + +echo "making extra nodes" +make_extra_nodes + +echo /sbin/udevsend > /proc/sys/kernel/hotplug + +if [ -f "$udevd" ]; then + $udevd & +fi + +# We can only mount /dev/pts after initialising udev +mount /dev/pts + +echo "udev startup is finished" +exit 0 |