--- trunk/udev/udev.rc 2012/04/02 13:08:14 1724 +++ trunk/udev/udev.rc 2012/07/30 18:10:19 1868 @@ -1,5 +1,5 @@ #!/bin/bash -# $Header: /root/magellan-cvs/src/udev/udev.rc,v 1.2 2010-08-18 00:57:31 niro Exp $ +# $Id$ udev_version() { @@ -8,17 +8,22 @@ 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 udev's will print nothing - [[ -z ${version} ]] && version=0 elif [[ -x /sbin/udevd ]] then version=$(/sbin/udevd --version) - version=${version##0} - [[ -z ${version} ]] && version=0 + elif [[ -x /lib/udev/udevd ]] + then + version=$(/lib/udev/udevd --version) + elif [[ -x /usr/lib/systemd/systemd-udevd ]] + then + version=$(/usr/lib/systemd/systemd-udevd --version) fi + # We need it without a leading '0', else bash do the wrong thing + version=${version##0} + # Older udev's will print nothing + [[ -z ${version} ]] && version=0 + echo "${version}" } @@ -26,35 +31,23 @@ { local opts - # tell modprobe.sh to be verbose to $CONSOLE - echo CONSOLE=${CONSOLE} > /dev/.udev_populate - # populate /dev with devices already found by the kernel rc_print " Populating /dev with existing devices through uevents ..." if [[ ${RC_COLDPLUG} = yes ]] then - /sbin/udevadm trigger + udevadm trigger else # do not run any init-scripts - /sbin/udevadm control --env do_not_run_plug_service=1 + udevadm control --property=do_not_run_plug_service=1 - # only create device nodes - /sbin/udevadm trigger --attr-match=dev - - # run persistent-net stuff - /sbin/udevadm trigger --subsystem-match=net + udevadm trigger --type=subsystems --action=add + udevadm trigger --type=devices --action=add fi evaluate_retval - # loop until everything is finished - rc_print " Letting udev process events ..." - /sbin/udevadm settle --timeout=60 - evaluate_retval - # unset this variable - /sbin/udevadm control --env do_not_run_plug_service= + udevadm control --property=do_not_run_plug_service= - rm -f /dev/.udev_populate return 0 } @@ -63,26 +56,14 @@ # seed /dev with some things that we know we need rc_print " Seeding /dev with needed nodes ..." ( - [ ! -c /dev/console ] && mknod /dev/console c 5 1 - [ ! -c /dev/tty1 ] && mknod /dev/tty1 c 4 1 - [ ! -c /dev/null ] && mknod /dev/null c 1 3 + [ ! -c /dev/console ] && mknod -m 600 /dev/console c 5 1 + [ ! -c /dev/tty1 ] && mknod -m 620 /dev/tty1 c 4 1 + [ ! -c /dev/tty ] && mknod -m 666 /dev/tty c 5 0 + [ ! -c /dev/null ] && mknod -m 666 /dev/null c 1 3 # create kmsg too, so udev can add its start-message to dmesg [ -c /dev/kmsg ] || mknod -m 660 /dev/kmsg c 1 11 - # copy over any persistant things - if [[ -d /lib/udev/devices ]] - then - cp -RPp /lib/udev/devices/* /dev 2>/dev/null - fi - - # 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 /dev/shm ) @@ -92,27 +73,51 @@ # main function start_devicemanager() { + local udev_prefix="" + local udev_daemon="" + + # get the right daemon and prefix for newer udev/systemd-udev installations + if [ -x /sbin/udevd ] + then + udev_daemon="/sbin/udevd" + udev_prefix="" + elif [ -x /lib/udev/udevd ] + then + udev_daemon="/lib/udev/udevd" + udev_prefix="" + elif [ -x /usr/lib/systemd/systemd-udevd ] + then + udev_daemon="/usr/lib/systemd/systemd-udevd" + udev_prefix="/usr" + fi + # check if /dev/console exists outside tmpfs [ -c /dev/console ] ; need_redirect=$? # create a ramdisk for populating udev - rc_print "Mounting udev at /dev ..." - # many video drivers needed exec access - fstype=ramfs - # tmpfs was suggested by Greg Kroah-Hartman - kernel_supports_fs tmpfs && fstype=tmpfs - # mount devtmpfs if supported - kernel_supports_fs devtmpfs && fstype=devtmpfs - mount -n -t ${fstype} udev /dev -o exec,nosuid,mode=0755,size=10M - evaluate_retval + if [[ -z $(grep '[[:space:]]/dev[[:space:]]' /proc/self/mountinfo) ]] + then + rc_print "Mounting udev at /dev ..." + # many video drivers needed exec access + fstype=ramfs + # tmpfs was suggested by Greg Kroah-Hartman + kernel_supports_fs tmpfs && fstype=tmpfs + # mount devtmpfs if supported + kernel_supports_fs devtmpfs && fstype=devtmpfs + mount -n -t ${fstype} dev /dev -o exec,nosuid,mode=0755,size=10M + evaluate_retval + fi - # if a device tarball exists load it and if it is activated + # if a device tarball exists load it but only if it is activated in the config rc_print "Configurating system to use udev ..." if [[ ${RC_DEVICE_TARBALL} = yes ]] then - rc_print " Populating /dev with saved device nodes ..." - tar -jxpf /lib/udev/state/devices.tar.bz2 -C /dev - evaluate_retval + if [[ -f ${udev_prefix}/lib/udev/state/devices.tar.bz2 ]] + then + rc_print " Populating /dev with saved device nodes ..." + tar -jxpf ${udev_prefix}/lib/udev/state/devices.tar.bz2 -C /dev + evaluate_retval + fi fi # other needed device nodes with udev @@ -138,14 +143,18 @@ if [ ${need_redirect} -eq 1 ] then # we need to open fds 0 1 2 - start-stop-daemon --start --exec /sbin/udevd -- --daemon /dev/console 2>/dev/console + start-stop-daemon --start --exec "${udev_daemon}" -- --daemon /dev/console 2>/dev/console else - start-stop-daemon --start --exec /sbin/udevd -- --daemon + start-stop-daemon --start --exec "${udev_daemon}" -- --daemon fi evaluate_retval # write root_link rule - /lib/udev/write_root_link_rule + if [ -x ${udev_prefix}/lib/udev/write_root_link_rule ] + then + ${udev_prefix}/lib/udev/write_root_link_rule + fi + # populate udev device nodes populate_udev @@ -162,7 +171,21 @@ stop_devicemanager() { + local udev_daemon="" + + # get the right daemon and prefix for newer udev/systemd-udev installations + if [ -x /sbin/udevd ] + then + udev_daemon="/sbin/udevd" + elif [ -x /lib/udev/udevd ] + then + udev_daemon="/lib/udev/udevd" + elif [ -x /usr/lib/systemd/systemd-udevd ] + then + udev_daemon="/usr/lib/systemd/systemd-udevd" + fi + rc_print "Stopping udevd daemon ..." - start-stop-daemon --stop --exec /sbin/udevd + start-stop-daemon --stop --exec "${udev_daemon}" evaluate_retval }