Files
poky/meta/recipes-core/udev/files/init
Richard Purdie 29d6678fd5 Major layout change to the packages directory
Having one monolithic packages directory makes it hard to find things
and is generally overwhelming. This commit splits it into several
logical sections roughly based on function, recipes.txt gives more
information about the classifications used.

The opportunity is also used to switch from "packages" to "recipes"
as used in OpenEmbedded as the term "packages" can be confusing to
people and has many different meanings.

Not all recipes have been classified yet, this is just a first pass
at separating things out. Some packages are moved to meta-extras as
they're no longer actively used or maintained.

Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
2010-08-27 15:29:45 +01:00

5.4 KiB
Executable File

#!/bin/sh -e

UDEVSTART=/sbin/udevstart

defaults

tmpfs_size="10M" udev_root="/dev"

[ -x $UDEVSTART ] || exit 0

. /etc/udev/udev.conf

##############################################################################

we need to unmount /dev/pts/ and remount it later over the tmpfs

unmount_devpts() { if mountpoint -q /dev/pts/; then umount -l /dev/pts/ fi

if mountpoint -q /dev/shm/; then umount -l /dev/shm/ fi }

mount a tmpfs over /dev, if somebody did not already do it

mount_tmpfs() { if grep -E -q "^[^[:space:]]+ /dev tmpfs" /proc/mounts; then return 0 fi

/dev/.static/dev/ is used by MAKEDEV to access the real /dev/ directory.

/etc/udev/ is recycled as a temporary mount point because it's the only

directory which is guaranteed to be available.

mount -n -o bind /dev /etc/udev

if ! mount -n -o size=$tmpfs_size,mode=0755 -t tmpfs tmpfs /dev; then umount /etc/udev echo "udev requires tmpfs support, not started." exit 1 fi

using ln to test if /dev works, because touch is in /usr/bin/

if ln -s test /dev/test-file; then rm /dev/test-file else echo "udev requires tmpfs support, not started." umount /etc/udev umount /dev exit 1 fi

mkdir -p /dev/.static/dev chmod 700 /dev/.static/

The mount options in busybox are non-standard...

if test -x /bin/mount.util-linux then /bin/mount.util-linux --move /etc/udev /dev/.static/dev elif test -x /bin/busybox then busybox mount -n -o move /etc/udev /dev/.static/dev else echo "udev requires an identifiable mount command, not started." umount /etc/udev umount /dev exit 1 fi }

I hate this hack. -- Md

make_extra_nodes() { [ -e /etc/udev/links.conf ] || return 0 grep '^[^#]' /etc/udev/links.conf |
while read type name arg1; do [ "$type" -a "$name" -a ! -e "/dev/$name" -a ! -L "/dev/$name" ] ||continue case "$type" in L) ln -s $arg1 /dev/$name ;; D) mkdir -p /dev/$name ;; M) mknod -m 600 /dev/$name $arg1 ;; *) echo "links.conf: unparseable line ($type $name $arg1)" ;; esac done }

this function is duplicated in preinst, postinst and d-i

supported_kernel() { case "$(uname -r)" in 2.[012345].|2.6.[0-9]|2.6.[0-9][!0-9]) return 1 ;; 2.6.1[01]|2.6.1[01][!0-9]*) return 1 ;; esac return 0 }

shell version of /usr/bin/tty

my_tty() { [ -x /bin/readlink ] || return 0 [ -e /proc/self/fd/0 ] || return 0 readlink --silent /proc/self/fd/0 || true }

warn_if_interactive() { if [ "$RUNLEVEL" = "S" -a "$PREVLEVEL" = "N" ]; then return 0 fi

TTY=$(my_tty) if [ -z "$TTY" -o "$TTY" = "/dev/console" ]; then return 0 fi

printf "\n\n\nIt has been detected that the command\n\n\t$0 $*\n\n" printf "has been run from an interactive shell.\n" printf "It will probably not do what you expect, so this script will wait\n" printf "60 seconds before continuing. Press ^C to stop it.\n" printf "RUNNING THIS COMMAND IS HIGHLY DISCOURAGED!\n\n\n\n" sleep 60 }

##############################################################################

if ! supported_kernel; then echo "udev requires a kernel >= 2.6.12, not started." exit 1 fi

if [ ! -e /proc/filesystems ]; then echo "udev requires a mounted procfs, not started." exit 1 fi

if ! grep -q ':space:tmpfs$' /proc/filesystems; then echo "udev requires tmpfs support, not started." exit 1 fi

if [ ! -d /sys/class/ ]; then echo "udev requires a mounted sysfs, not started." exit 1 fi

if [ ! -e /proc/sys/kernel/hotplug ] && [ ! -e /sys/kernel/uevent_helper ]; then echo "udev requires hotplug support, not started." exit 1 fi

##############################################################################

When modifying this script, do not forget that between the time that

the new /dev has been mounted and udevstart has been run there will be

no /dev/null. This also means that you cannot use the "&" shell command.

case "$1" in start) if [ -e "$udev_root/.udevdb" ]; then if mountpoint -q /dev/; then TMPFS_MOUNTED=1 else echo ".udevdb already exists on the old $udev_root!" fi fi warn_if_interactive

#echo /sbin/udevsend > /proc/sys/kernel/hotplug
if [ -e /sys/kernel/uevent_helper ] ; then
  echo "" > /sys/kernel/uevent_helper
else
  echo "" > /proc/sys/kernel/hotplug
fi
udevsend
if [ "$UDEV_DISABLED" = "yes" ]; then
  echo "udev disabled on the kernel command line, not started."
  exit 0
fi

if [ ! "$TMPFS_MOUNTED" ]; then
  unmount_devpts
  mount_tmpfs
  [ -d /proc/1 ] || mount -n /proc
  # if this directory is not present /dev will not be updated by udev
  mkdir /dev/.udevdb/
  echo "Creating initial device nodes..."
  udevstart
fi
make_extra_nodes
;;

stop) warn_if_interactive start-stop-daemon --stop --exec /sbin/udevd --quiet unmount_devpts if [ -d /dev/.static/dev/ ]; then umount -l /dev/.static/dev/ || true fi echo "Unmounting /dev..." # unmounting with -l should never fail if ! umount -l /dev; then exit 1 fi ;; restart|force-reload) start-stop-daemon --stop --exec /sbin/udevd --quiet log_begin_msg "Recreating device nodes..." udevstart make_extra_nodes log_end_msg 0 ;; *) echo "Usage: /etc/init.d/udev {start|stop|restart|force-reload}" exit 1 ;; esac

exit 0