#! /bin/sh # # start_udev # # script to initialize /dev by using udev. # # Copyright (C) 2004 Greg Kroah-Hartman # # 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... # prog=udev sysfs_dir=/sys bin=/sbin/udev udevd=/sbin/udevd udev_root="/dev" 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 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 > /dev/null 2>&1 echo "making extra nodes" make_extra_nodes # check if udevd is already running if [ `pidof -o %PPID /sbin/udevd` ]; then grep -v "/dev/shm" /etc/mtab | grep -v "/dev/pts" > /etc/mtab mount /dev/pts mount /dev/shm else echo "start udev daemon" /sbin/udevd --daemon > /dev/null 2>&1 fi # Make udevsend the hotplug multiplexer for newer kernels case "$(uname -r)" in 2.6.[0-9]|2.6.[0-9][!0-9]*) ;; *) if [ -f "/sys/class/tty/console/uevent" ]; then # trigger the sorted events echo -e '\000\000\000\000' > /proc/sys/kernel/hotplug else echo "/sbin/udevsend" > /proc/sys/kernel/hotplug fi ;; esac echo "udev startup is finished!" exit 0