]> git.pld-linux.org Git - packages/systemd.git/blobdiff - start_udev
- rel 1; works on my laptop
[packages/systemd.git] / start_udev
old mode 100644 (file)
new mode 100755 (executable)
index 5b03b4b..bf64dc5
@@ -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
@@ -74,58 +98,78 @@ get_dev_mounts() {
        }' /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
 awk "\$2 == \"$udev_root\" && \$3 == \"devtmpfs\" { exit 1 }" /proc/mounts && {
-       # mount to temporary location to be able to move submounts, if any
-       devdir=$(mktemp -d ${TMPDIR:-/tmp}/tmpXXXXXX)
+       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 + $? ))
 
        # relocate submounts
-       for dir in $(get_dev_mounts); do
+       for dir in $submounts; do
                mount -n --move $udev_root/$dir $devdir/$dir
                ret=$(( $ret + $? ))
        done
 
-       mount -n --move $devdir $udev_root
+       if [ "$submounts" ]; then
+               mount -n --move $devdir $udev_root
+               rmdir $devdir
+       fi
 }
 
 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
This page took 0.208136 seconds and 4 git commands to generate.