# Copyright 1999-2005 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # modified for crux 12.20.2005 (jaeger) udev_version() { local version=0 if [[ -x /sbin/udev ]] ; then version=$(/sbin/udev -V) # We need it without a leading '0', else bash do the wrong thing version=${version##0} # Older udevs will print nothing [[ -z ${version} ]] && version=0 fi echo "${version}" } # This works for 2.6.15 kernels or greater trigger_events() { list="" # if you want real coldplug (with all modules being loaded for all # devices in the system), uncomment out the next line. #list="$list $(echo /sys/bus/*/devices/*/uevent)" list="$list $(echo /sys/class/*/*/uevent)" list="$list $(echo /sys/block/*/uevent /sys/block/*/*/uevent)" for i in $list; do case "$i" in */device/uevent) # skip followed device symlinks continue ;; */class/mem/*|*/class/tty/*) first="$first $i" ;; */block/md*) last="$last $i" ;; */*) default="$default $i" ;; esac done # trigger the sorted events for i in $first $default $last; do echo "add" > "$i" done } populate_udev() { # populate /dev with devices already found by the kernel #if [ "$(get_KV)" -gt "$(KV_to_int '2.6.14')" ] ; then #ebegin "Populating /dev with existing devices through uevents" #trigger_events #eend 0 #else echo "Populating /dev with existing devices with udevstart..." /sbin/udevstart #fi # loop until everything is finished # there's gotta be a better way... echo "Letting udev process events..." loop=0 while test -d /dev/.udev/queue; do sleep 0.1; test "$loop" -gt 300 && break loop=$(($loop + 1)) done #einfo "loop = $loop" return 0 } seed_dev() { # Seed /dev with some things that we know we need echo "Seeding /dev with needed nodes..." # copy over any persistant things cp --preserve=all --recursive --update /lib/udev/devices/* /dev # Not provided by sysfs but needed ln -snf /proc/self/fd /dev/fd ln -snf fd/0 /dev/stdin ln -snf fd/1 /dev/stdout ln -snf fd/2 /dev/stderr [[ -e /proc/kcore ]] && ln -snf /proc/kcore /dev/core # Create problematic directories mkdir -p /dev/{pts,shm} } main() { # Setup temporary storage for /dev #echo "Mounting /dev for udev" #if [[ ${RC_USE_FSTAB} == "yes" ]] ; then #mntcmd=$(get_mount_fstab /dev) #else #unset mntcmd #fi #if [[ -n ${mntcmd} ]] ; then #try mount -n ${mntcmd} #else #if egrep -qs tmpfs /proc/filesystems ; then mntcmd="tmpfs" #else #mntcmd="ramfs" #fi # many video drivers require exec access in /dev #92921 mount -n -t ${mntcmd} udev /dev -o exec,nosuid,mode=0755 #fi #eend $? # Selinux lovin; /selinux should be mounted by selinux-patched init #if [[ -x /sbin/restorecon && -c /selinux/null ]] ; then #restorecon /dev &> /selinux/null #fi # Actually get udev rolling #if [[ ${RC_DEVICE_TARBALL} == "yes" && \ #-s /lib/udev-state/devices.tar.bz2 ]] ; then #ebegin "Populating /dev with saved device nodes" #try tar -jxpf /lib/udev-state/devices.tar.bz2 -C /dev #eend $? #fi seed_dev # Setup hotplugging (if possible) echo -n "Setting up hotplug agent... " if [[ -e /proc/sys/kernel/hotplug ]] ; then #if [ "$(get_KV)" -gt "$(KV_to_int '2.6.14')" ] ; then #einfo " Using netlink for hotplug events..." #echo "" > /proc/sys/kernel/hotplug if [[ $(udev_version) -ge "48" ]] ; then echo "/sbin/udevsend" echo "/sbin/udevsend" > /proc/sys/kernel/hotplug elif [[ -x /sbin/hotplug ]] ; then echo "/sbin/hotplug" else echo "/sbin/udev" echo "/sbin/udev" > /proc/sys/kernel/hotplug fi fi #eend 0 echo "Starting udevd..." /sbin/udevd --daemon #eend $? populate_udev # Create nodes that udev can't echo "Finalizing udev configuration..." [[ -x /sbin/dmsetup ]] && /sbin/dmsetup mknodes &>/dev/null [[ -x /sbin/lvm ]] && \ /sbin/lvm vgscan -P --mknodes --ignorelockingfailure &>/dev/null [[ -x /sbin/evms_activate ]] && /sbin/evms_activate -q &>/dev/null #eend 0 # Same thing as /dev/.devfsd touch /dev/.udev } main # vim:ts=4