# Copyright 1999-2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 [ -e /etc/udev/udev.conf ] && . /etc/udev/udev.conf rc_coldplug=${rc_coldplug:-${RC_COLDPLUG:-YES}} rc_device_tarball=${rc_device_tarball:-${RC_DEVICE_TARBALL:-NO}} mount_dev_directory() { # No options are processed here as they should all be in /etc/fstab ebegin "Mounting /dev for udev" if fstabinfo --quiet /dev; then mount -n /dev else # Some devices require exec mount -n -t tmpfs -o exec,nosuid,mode=0755,size=10M none /dev fi eend $? } unpack_device_tarball() { # Actually get udev rolling if yesno "${rc_device_tarball}" && \ [ -s /lib64/udev/state/devices.tar.bz2 ] then ebegin "Populating /dev with saved device nodes" tar -jxpf /lib64/udev/state/devices.tar.bz2 -C /dev eend $? fi } seed_dev() { # Seed /dev with some things that we know we need ebegin "Seeding /dev with needed nodes" # creating /dev/console and /dev/tty1 to be able to write # to $CONSOLE with/without bootsplash before udevd creates it [ -c /dev/console ] || mknod /dev/console c 5 1 [ -c /dev/tty1 ] || mknod /dev/tty1 c 4 1 # udevd will dup its stdin/stdout/stderr to /dev/null # and we do not want a file which gets buffered in ram [ -c /dev/null ] || mknod /dev/null c 1 3 # copy over any persistant things if [ -d /lib64/udev/devices ]; then cp -RPp /lib64/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 eend 0 } start_udev() { ebegin "Starting udevd" start-stop-daemon --start --exec /sbin/udevd -- --daemon eend $? } populate_udev() { # populate /dev with devices already found by the kernel if get_bootparam "nocoldplug" ; then rc_coldplug="NO" ewarn "Skipping udev coldplug as requested in kernel cmdline" fi # at this point we are already sure to use kernel 2.6.15 or newer ebegin "Populating /dev with existing devices through uevents" if yesno "${rc_coldplug}"; then udevtrigger else # only create device nodes udevtrigger --attr-match=dev # run persistent-net stuff, bug 191466 udevtrigger --subsystem-match=net fi eend $? ebegin "Letting udev process events" udevsettle --timeout=60 eend $? rm -f /dev/.udev_populate return 0 } check_persistent_net() { # check if there are problems with persistent-net local syspath= devs= problem=false for syspath in /sys/class/net/*_rename*; do if [ -d "${syspath}" ]; then devs="${devs} ${syspath##*/}" problem=true fi done ${problem} || return 0 eerror "UDEV: Your system has a problem assigning persistent names" eerror "to these network interfaces: ${devs}" einfo "Checking persistent-net rules:" # the sed-expression lists all duplicate lines # from the input, like "uniq -d" does, but uniq # is installed into /usr/bin and not available at boot. dups=$( RULES_FILE='/etc/udev/rules.d/70-persistent-net.rules' . /lib64/udev/rule_generator.functions find_all_rules 'NAME=' '.*' | \ tr ' ' '\n' | \ sort | \ sed '$!N; s/^\(.*\)\n\1$/\1/; t; D' ) if [ -n "${dups}" ]; then ewarn "The rules create multiple entries assigning these names:" eindent ewarn "${dups}" eoutdent else ewarn "Found no duplicate names in persistent-net rules," ewarn "there must be some other problem!" fi return 1 } # FIXME # Instead of this script testing kernel version, udev itself should # Maybe something like udevd --test || exit $? mount_dev_directory || exit $? # Create a file so that our rc system knows it's still in sysinit. # Existance means init scripts will not directly run. # rc will remove the file when done with sysinit. touch /dev/.rcsysinit # Selinux lovin; /selinux should be mounted by selinux-patched init if [ -x /sbin/restorecon -a -c /selinux/null ]; then restorecon /dev > /selinux/null fi unpack_device_tarball seed_dev if [ -e /proc/sys/kernel/hotplug ]; then echo "" >/proc/sys/kernel/hotplug fi start_udev || exit $? /lib64/udev/write_root_link_rule populate_udev check_persistent_net # trigger executing initscript when /etc is writable IN_HOTPLUG=1 /etc/init.d/udev-postmount start >/dev/null 2>&1 # udev started successfully exit 0