diff options
author | Richard Purdie <rpurdie@rpsys.net> | 2005-09-20 14:49:36 +0000 |
---|---|---|
committer | OpenEmbedded Project <openembedded-devel@lists.openembedded.org> | 2005-09-20 14:49:36 +0000 |
commit | eb992319a0a412435289e60b5e666da07133d1f5 (patch) | |
tree | 1cee9b6e532cf1c859026c1b740ffb01c4b86285 /packages/udev/files/init | |
parent | c838ad939cd52d897390eefb9b578cd654b9e98d (diff) |
udev: Rearrange the udev files into a more logical structure. Create copies of the rules we're using rather than the distributed version due to links to external scripts. Add mount.sh which attempts to mount block devices using pmount if available, falling back to mount if not. Fix the --mode switch to mknod in the init script.
Diffstat (limited to 'packages/udev/files/init')
-rwxr-xr-x | packages/udev/files/init | 234 |
1 files changed, 126 insertions, 108 deletions
diff --git a/packages/udev/files/init b/packages/udev/files/init index 16efb31542..c290661c72 100755 --- a/packages/udev/files/init +++ b/packages/udev/files/init @@ -1,36 +1,18 @@ #!/bin/sh -e -PATH="/usr/sbin:/usr/bin:/sbin:/bin" - UDEVSTART=/sbin/udevstart -# default maximum size of the /dev ramfs -ramfs_size="1M" +# defaults +tmpfs_size="10M" +udev_root="/dev" [ -x $UDEVSTART ] || exit 0 . /etc/udev/udev.conf -case "$(uname -r)" in - 2.[012345].*) - echo "udev requires a kernel >= 2.6, not started." - exit 0 - ;; -esac - -if ! grep -q '[[:space:]]ramfs$' /proc/filesystems; then - echo "udev requires ramfs support, not started." - exit 0 -fi - -if [ ! -e /proc/sys/kernel/hotplug ]; then - echo "udev requires hotplug support, not started." - exit 0 -fi - ############################################################################## -# we need to unmount /dev/pts/ and remount it later over the ramfs +# 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/ @@ -41,132 +23,169 @@ unmount_devpts() { fi } -# mount a ramfs over /dev, if somebody did not already do it -mount_ramfs() { - if grep -E -q "^[^[:space:]]+ /dev ramfs" /proc/mounts; then +# 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 is used by /sbin/MAKEDEV to access the real /dev directory. - # if you don't like this, remove /.dev/. - [ -d /.dev ] && mount --bind /dev /.dev + # /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 - echo -n "Mounting a ramfs over /dev..." - mount -n -o size=$ramfs_size,mode=0755 -t ramfs none /dev - echo "done." + mkdir -p /dev/.static/dev + chmod 700 /dev/.static/ + mount -n -o move /etc/udev /dev/.static/dev } # I hate this hack. -- Md make_extra_nodes() { - if [ -f /etc/udev/links.conf ]; then + [ -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 "unparseable line ($type $name $arg1)" - ;; + 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 - fi +} + +# 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 [ "$udev_root" != "/dev" ]; then - echo "WARNING: udev_root != /dev" +if ! supported_kernel; then + echo "udev requires a kernel >= 2.6.12, not started." + exit 1 +fi -case "$1" in - start) - if [ -e "$udev_root/.udev.tdb" ]; then - if mountpoint -q /dev/; then - echo "FATAL: udev is already active on $udev_root." - exit 1 - else - echo "WARNING: .udev.tdb already exists on the old $udev_root!" - fi - fi - mount -n -o size=$ramfs_size,mode=0755 -t ramfs none $udev_root - echo -n "Creating initial device nodes..." - $UDEVSTART - echo "done." - ;; - stop) - start-stop-daemon -K -x /sbin/udevd - echo -n "Unmounting $udev_root..." - # unmounting with -l should never fail - if umount -l $udev_root; then - echo "done." - else - echo "failed." - fi - ;; - restart|force-reload) - $0 stop - $0 start - ;; - *) - echo "Usage: /etc/init.d/udev {start|stop|restart|force-reload}" - exit 1 - ;; -esac +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 - exit 0 -fi # udev_root != /dev/ +if [ ! -d /sys/class/ ]; then + echo "udev requires a mounted sysfs, not started." + exit 1 +fi + +if [ ! -e /proc/sys/kernel/hotplug ]; 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/.udev.tdb" ]; then + if [ -e "$udev_root/.udevdb" ]; then if mountpoint -q /dev/; then - echo "FATAL: udev is already active on $udev_root." - exit 1 + TMPFS_MOUNTED=1 else - echo "WARNING: .udev.tdb already exists on the old $udev_root!" + echo ".udevdb already exists on the old $udev_root!" fi fi - unmount_devpts - mount_ramfs - ACTION=add - echo -n "Creating initial device nodes..." - $UDEVSTART + warn_if_interactive + + #echo /sbin/udevsend > /proc/sys/kernel/hotplug + echo "" > /proc/sys/kernel/hotplug + 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 - echo "done." -# /etc/init.d/mountvirtfs start ;; stop) - start-stop-daemon -K -x /sbin/udevd + warn_if_interactive + start-stop-daemon --stop --exec /sbin/udevd --quiet unmount_devpts - echo -n "Unmounting /dev..." + 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 - echo "done." - umount -l /.dev || true -# /etc/init.d/mountvirtfs start - else - echo "failed." + if ! umount -l /dev; then + exit 1 fi ;; restart|force-reload) - start-stop-daemon -K -x /sbin/udevd - echo -n "Recreating device nodes..." - ACTION=add - $UDEVSTART + start-stop-daemon --stop --exec /sbin/udevd --quiet + log_begin_msg "Recreating device nodes..." + udevstart make_extra_nodes - echo "done." + log_end_msg 0 ;; *) echo "Usage: /etc/init.d/udev {start|stop|restart|force-reload}" @@ -175,4 +194,3 @@ case "$1" in esac exit 0 - |