core/udev/start_udev
2006-02-23 17:19:35 +00:00

171 lines
4.0 KiB
Plaintext

# 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