X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=start_udev;h=a2d20c0e1c89c0513472a1825f415d5e676063fc;hb=bbd3dce101654d50be85f5dd9c7b4307a00a6d83;hp=d50eb7f9130d5a80f6822a5030028426effbff0f;hpb=ab4c8ae1b3fb27fa3d2141547cf44b9e3c8c39f2;p=packages%2Fsystemd.git diff --git a/start_udev b/start_udev index d50eb7f..a2d20c0 100644 --- a/start_udev +++ b/start_udev @@ -8,12 +8,12 @@ # # Released under the GPL v2 only. # -# This needs to be run at the earliest possible point in the boot +# 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 +# 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, @@ -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,17 +35,19 @@ 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%/} 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 - case "$type" in - L) ln -s $arg1 $udev_root/$name ;; - D) mkdir -p $udev_root/$name ;; - M) mknod -m 600 /dev/$name $arg1 ;; - *) echo "links.conf: unparseable line ($type $name $arg1)" ;; - esac + [ "$type" -a "$name" -a ! -e "$udev_root/$name" -a ! -L "/dev/$name" ] ||continue + case "$type" in + L) ln -s $arg1 $udev_root/$name ;; + D) mkdir -p $udev_root/$name ;; + M) mknod -m 600 /dev/$name $arg1 ;; + *) echo "links.conf: unparseable line ($type $name $arg1)" ;; + esac done [ -d /lib/udev/devices ] && cp -a /lib/udev/devices/* /dev/ >/dev/null 2>&1 || : [ -d /lib64/udev/devices ] && cp -a /lib64/udev/devices/* /dev/ >/dev/null 2>&1 || : @@ -53,13 +55,25 @@ make_extra_nodes () { kill_udevd() { if [ -x /sbin/pidof ]; then - pid=`/sbin/pidof -x udevd` + pid=$(/sbin/pidof -x udevd) [ -n "$pid" ] && kill $pid fi } set_hotplug_handler() { - echo "" > /proc/sys/kernel/hotplug + 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 } export ACTION=add @@ -68,57 +82,58 @@ ret=0 show "Starting udev" busy -# mount the tmpfs on ${udev_root%/}, if not already done -LANG=C awk "\$2 == \"${udev_root%/}\" && \$3 == \"tmpfs\" { 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" - fi - 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 - mount -n -o mode=0755 -t tmpfs none "$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" - fi +# 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 + $? )) + + # relocate submounts + for dir in $submounts; do + mount -n --move $udev_root/$dir $devdir/$dir + ret=$(( $ret + $? )) + done + + if [ "$submounts" ]; then + mount -n --move $devdir $udev_root + rmdir $devdir + fi } kill_udevd > "$udev_root/null" 2>&1 - # Start udevd daemon - $udevd --daemon - ret=$(( $ret + $? )) - - # Making extra nodes - make_extra_nodes - ret=$(( $ret + $? )) - -if [ -f "/sys/class/tty/console/uevent" ]; then +# Start udevd daemon +$udevd --daemon +ret=$(( $ret + $? )) + +# Making extra nodes +make_extra_nodes +ret=$(( $ret + $? )) - # Setting default hotplug handler +if [ -f "/sys/class/tty/console/uevent" ]; then + # Setting default hotplug handler set_hotplug_handler ret=$(( $ret + $? )) # retrigger all events - # Udev find's it's own way of making this dir + # 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 + udevadm trigger ret=$(( $ret + $? )) - + # wait for the events to finish - udevadm settle + udevadm settle ret=$(( $ret + $? )) else echo "Kernel too old for this udev version"