X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=start_udev;h=bf64dc55b3135c427e04ba82fc25514a97f844f9;hb=refs%2Fheads%2Fsystemd-208;hp=81663567312733ea446112858dba82ecbced35a1;hpb=7e0b60143901b24adea6154517afac72934207ba;p=packages%2Fsystemd.git diff --git a/start_udev b/start_udev old mode 100644 new mode 100755 index 8166356..bf64dc5 --- a/start_udev +++ b/start_udev @@ -21,7 +21,7 @@ # properly during development... # default value, if no config present. -udev_root="/dev/" +udev_root="/dev" sysfs_dir="/sys" udevd_timeout=8 @@ -35,8 +35,32 @@ udevd_timeout=8 prog=udev bin=/sbin/udev udevd=/lib/udev/udevd +# trim traling slash, code expects it not to be there +udev_root=${udev_root%/} + +create_static_nodes() { + /sbin/kmod static-nodes --format=tmpfiles | \ + while read type file mode uid gid age dev ; do + case $type in + d|D) + mkdir -p --mode=$mode $file + ;; + *) + oldIFS=$IFS + IFS=":" + set -- $dev + maj=$1 + min=$2 + IFS=$oldIFS + mknod --mode=$mode $file $type $maj $min + ;; + esac + [ $uid = "-" ] || chown $uid $file + [ $gid = "-" ] || chgrp $gid $file + done +} -make_extra_nodes () { +make_extra_nodes() { grep '^[^#]' /etc/udev/links.conf | \ while read type name arg1; do [ "$type" -a "$name" -a ! -e "$udev_root/$name" -a ! -L "/dev/$name" ] ||continue @@ -62,70 +86,90 @@ set_hotplug_handler() { echo "" > /proc/sys/kernel/hotplug } +# find subdirs mounted under $udev_root +get_dev_mounts() { + awk -vudev_root="$udev_root/" ' + BEGIN { + len = length(udev_root); + } + + substr($2, 1, len) == udev_root { + print substr($2, len + 1) + }' /proc/mounts +} + +show "Starting udev"; busy + export ACTION=add prog=udev ret=0 -show "Starting udev" -busy -# mount the devtmpfs on ${udev_root%/}, if not already done -LANG=C awk "\$2 == \"${udev_root%/}\" && \$3 == \"devtmpfs\" { exit 1 }" /proc/mounts && { - - if LANG=C fgrep -q "none ${udev_root%/}/pts " /proc/mounts; then - PTSDIR=$(mktemp -d ${TMPDIR:-/tmp}/tmpXXXXXX) - mount --move $udev_root/pts "$PTSDIR" +# mount the devtmpfs on $udev_root, if not already done +awk "\$2 == \"$udev_root\" && \$3 == \"devtmpfs\" { exit 1 }" /proc/mounts && { + submounts=$(get_dev_mounts) + + if [ "$submounts" ]; then + # mount to temporary location to be able to move submounts + # this needs writable TMPDIR:-/tmp, so it won't work in early boot + # but fix is simple: use initramfs instead of romfs + devdir=$(mktemp -d ${TMPDIR:-/tmp}/tmpXXXXXX) + else + devdir=$udev_root fi + mount -n -o mode=0755 -t devtmpfs devtmpfs "$devdir" + ret=$(( $ret + $? )) - if LANG=C fgrep -q "none ${udev_root%/}/shm " /proc/mounts; then - SHMDIR=$(mktemp -d ${TMPDIR:-/tmp}/tmpXXXXXX) - mount --move $udev_root/shm "$SHMDIR" - fi + # relocate submounts + for dir in $submounts; do + mount -n --move $udev_root/$dir $devdir/$dir + ret=$(( $ret + $? )) + done - mount -n -o mode=0755 -t devtmpfs devtmpfs "$udev_root" - mkdir -m 0755 $udev_root/pts - mkdir -m 0755 $udev_root/shm - if [ -n "$PTSDIR" ]; then - mount --move "$PTSDIR" $udev_root/pts - rmdir "$PTSDIR" - fi - if [ -n "$SHMDIR" ]; then - mount --move "$SHMDIR" $udev_root/shm - rmdir "$SHMDIR" + if [ "$submounts" ]; then + mount -n --move $devdir $udev_root + rmdir $devdir fi - - ret=$(( $ret + $? )) } kill_udevd > "$udev_root/null" 2>&1 +# Create required static device nodes for the current kernel +create_static_nodes + # Start udevd daemon -$udevd --daemon -ret=$(( $ret + $? )) +$udevd --daemon; rc=$? +test $rc -eq 0 && ok || fail +ret=$(( $ret + $rc )) # Making extra nodes -make_extra_nodes -ret=$(( $ret + $? )) +show "Setup extra nodes"; busy +make_extra_nodes; rc=$? +test $rc -eq 0 && ok || fail +ret=$(( $ret + $rc )) -if [ -f "/sys/class/tty/console/uevent" ]; then +if [ -f /sys/class/tty/console/uevent ]; then # Setting default hotplug handler set_hotplug_handler ret=$(( $ret + $? )) # retrigger all events - # Udev finds it's own way of making this dir - # and making it by hand makes udevsettle - # work forever - #mkdir -p /dev/.udev/queue - udevadm trigger - ret=$(( $ret + $? )) + show "Retrigger subsystems events"; busy + /sbin/udevadm trigger --type=subsystems --action=add; rc=$? + test $rc -eq 0 && ok || fail + ret=$(( $ret + $rc )) + + show "Retrigger devices events"; busy + /sbin/udevadm trigger --type=devices --action=add; rc=$? + test $rc -eq 0 && ok || fail + ret=$(( $ret + $rc )) # wait for the events to finish - udevadm settle - ret=$(( $ret + $? )) + show "udevadm settle"; busy + /sbin/udevadm settle; rc=$? + test $rc -eq 0 && ok || fail + ret=$(( $ret + $rc )) else echo "Kernel too old for this udev version" fi -ret=$(( $ret + $? )) -[ $ret -eq 0 ] && ok || fail -exit 0 +exit $ret