SlugOS init files: fixed network boot code for dsmg600 and added delay to ifup
authorMike Westerhof <mwester@dls.net>
Mon, 2 Jul 2007 17:05:02 +0000 (17:05 +0000)
committerMike Westerhof <mwester@dls.net>
Mon, 2 Jul 2007 17:05:02 +0000 (17:05 +0000)
(fix dhcp timeout before link negotiation complete) for network boot.  Added
kexec boot script (no turnup support yet, manual only).

packages/slugos-init/files/boot/kexec [new file with mode: 0644]
packages/slugos-init/files/boot/network
packages/slugos-init/files/functions
packages/slugos-init/files/modulefunctions
packages/slugos-init/slugos-init_0.10.bb

diff --git a/packages/slugos-init/files/boot/kexec b/packages/slugos-init/files/boot/kexec
new file mode 100644 (file)
index 0000000..c5b428c
--- /dev/null
@@ -0,0 +1,159 @@
+#!/bin/sh
+#
+# Loads the specified kernel and kexecs it.
+# 
+# The access method and path from which to fetch the kernel
+# is specified in "$1" and "$2":
+#
+# flash      /boot/zImage-ixp4xxbe
+# nfs        spike:/home/slug/vmlinuz
+# wget       http://devserv/kernels/vmlinuzbe
+# wget       ftp://ftpserv/pub/zImage
+# /dev/sda1  /kernels/zImage-test
+# UUID       /kernels/zImage-test
+#
+# Command-line options for the new kernel are in "$3".
+
+# Use the standard init path (see /etc/init.d/rcS)
+export PATH=/sbin:/bin:/usr/sbin:/usr/bin
+
+# Wait at least a short while for the disks...
+if [ ! "$sleep" -gt 0 ] ; then
+    sleep=1
+fi
+
+# Load the helper functions
+. /etc/default/functions
+. /etc/default/modulefunctions
+
+leds boot system
+
+if [ -n "$1" -a -n "$2" ] ; then
+
+       method="$1"
+       shift
+       kpath="$1"
+       shift
+       if [ -n "$1" ] ; then
+           kcmdline="$1"
+           shift
+       fi
+       kexec_image=
+       need_umount=0
+       do_kexec=0
+
+       mount -t proc proc /proc
+
+       case "$method" in
+
+           flash )
+               echo "Loading kexec kernel directly from \"$kpath\"..."
+               kexec_image="$kpath"
+               ;;
+
+           wget )
+               if /boot/network ; then
+                   echo "mounting tmpfs partition..."
+                   if mount -t tmpfs tmpfs /mnt ; then
+                       need_umount=1
+                       echo "Loading kexec kernel using wget \"$kpath\"..."
+                       wget -P /mnt "$kpath"
+                       t=`basename "$kpath"`
+                       kexec_image="/mnt/$t"
+                   fi
+               fi
+               ;;
+
+           nfs )
+               if /boot/network ; then
+                   echo "Loading kexec kernel using nfs \"$kpath\"..."
+                   echo "mounting nfs partition..."
+                   if mount -o ro,nolock -t nfs `dirname "$kpath"` /mnt ; then
+                       need_umount=1
+                       t=`basename "$kpath"`
+                       kexec_image="/mnt/$t"
+                   fi
+               fi
+               ;;
+
+           /dev/* )
+               echo "Loading kexec kernel using disk \"$kpath\"..."
+               loaddiskmods
+               sleep "$sleep"
+               echo "mounting partition \"$method\"..."
+               if mount -o ro "$method" /mnt ; then
+                   need_umount=1
+                   kexec_image="/mnt/$kpath"
+               fi
+               ;;
+
+           UUID )
+               echo "Loading kexec kernel using disk UUID \"$kpath\"..."
+               loaddiskmods
+               sleep "$sleep"
+               if [ -n "$UUID" ] ; then
+               echo "mounting partition UUID \"$UUID\"..."
+                   if mount -o ro -U "$UUID" /mnt ; then
+                       need_umount=1
+                       kexec_image="/mnt/$kpath"
+                   fi
+               fi
+               ;;
+
+           * )
+               echo "Unrecognized method: \"$method\""
+               ;;
+
+       esac
+
+       if [ -n "$kexec_image" -a -f "$kexec_image" ] ; then
+           if kexec -l "$kexec_image" ; then
+               do_kexec=1
+           fi
+       else
+           echo "Unable to load \"$kexec_image\""
+       fi
+
+       if [ $do_kexec -eq 1 -a -n "$kcmdline" ] ; then
+           echo "Attempting to mount /sys (sysfs)..."
+           if mount -t sysfs sysfs /sys ; then
+               echo "Setting command line:"
+               echo " \"$kcmdline\""
+               echo "$kcmdline" > /sys/kernel/kexec_cmdline
+               echo "unmounting /sys..."
+               umount /sys
+           else
+               do_kexec=0
+           fi
+       fi
+
+       if [ $need_umount -eq 1 ] ; then
+           echo "unmounting /mnt..."
+           umount /mnt
+       fi
+
+       if [ $do_kexec -eq 1 ] ; then
+           echo "Remounting root as read-only..."
+           mount -o remount,ro /
+           echo "Invoking \"kexec -f -e\" ..."
+           kexec -f -e
+           echo "ERROR!"
+           # We should never return here!  At this point, things are not
+           # too well.  Remount the root as rw, and fallback.
+           echo "Remounting root as read-write..."
+           mount -o remount,rw /
+       fi
+else
+       echo "Usage: $0 flash|nfs|wget|UUID|/dev/<partition> <path-or-URL> [cmdline]"
+fi
+
+# fallback - use the flash boot
+echo "Falling back to flash boot..."
+leds beep -f 1000 -r 2
+exec /boot/flash
+
+# fallback to the fallback
+leds boot system panic
+exec <>/dev/console >&0 2>&0
+test -x /bin/sh && exec /bin/sh
+exit 1
\ No newline at end of file
index 599250e..9aa295e 100644 (file)
@@ -8,6 +8,11 @@
 # function!
 . /etc/default/functions
 #
+# We may need to load the network driver modules here
+. /etc/default/modulefunctions
+loadnetmods
+#
+#
 # Now all the information for booting should be in the configuration
 # file.  Config the loopback and network interfaces.
 ifconfig lo 127.0.0.1 up
index c329171..18f4009 100644 (file)
@@ -274,6 +274,8 @@ ifup(){
        if test "$(config boot)" != static
        then
                test -n "$hostname" && HOSTNAME="-H $hostname"
+               # Pause a moment in case link negotiation takes a while
+               sleep 3
                # The script writes the required shell variable assignments
                # to file descriptor 9
                eval $(udhcpc -i "$iface" -n -q -r "$ip" $HOSTNAME -s /boot/udhcpc.script 9>&1 >/dev/null)
index dbb9ab5..784f6ef 100644 (file)
@@ -21,7 +21,14 @@ loaddiskmods(){
 }
 
 loadnetmods(){
-       true
+       case "$(machine)" in
+            dsmg600)
+                modprobe via-velocity
+                ;;
+           *)
+               true
+               ;;
+       esac
 }
 
 loadmiscmods(){
index 8e08a3d..9748f13 100644 (file)
@@ -4,12 +4,13 @@ PRIORITY = "required"
 LICENSE = "GPL"
 DEPENDS = "base-files devio"
 RDEPENDS = "busybox devio"
-PR = "r86"
+PR = "r87"
 
 SRC_URI = "file://boot/flash \
           file://boot/disk \
           file://boot/nfs \
           file://boot/ram \
+          file://boot/kexec \
           file://boot/network \
           file://boot/udhcpc.script \
           file://initscripts/fixfstab \
@@ -35,7 +36,7 @@ SBINPROGS = ""
 USRSBINPROGS = ""
 CPROGS = "${USRSBINPROGS} ${SBINPROGS}"
 SCRIPTS = "turnup reflash leds sysconf"
-BOOTSCRIPTS = "flash disk nfs ram network udhcpc.script"
+BOOTSCRIPTS = "flash disk nfs ram kexec network udhcpc.script"
 INITSCRIPTS = "syslog.buffer syslog.file syslog.network zleds\
        leds_startup rmrecovery sysconfsetup umountinitrd.sh\
        fixfstab loadmodules.sh"