slugos-init: make /linuxrc use disk uuids, remove .recovery stuff in 0.10
authorJohn Bowler <jbowler@nslu2-linux.org>
Tue, 31 Jan 2006 09:29:38 +0000 (09:29 +0000)
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>
Tue, 31 Jan 2006 09:29:38 +0000 (09:29 +0000)
 - the /boot/disk bootstrap now mounts -U uuid if one is available from
   turnup.  turnup checks disk for blkids and no longer complains about
   .recovery, /boo/* no longer create .recovery or check for it on boot;
   disconnect the disk or the network to boot to flash on a semi broken
   system.

packages/slugos-init/files/boot/disk
packages/slugos-init/files/functions
packages/slugos-init/files/turnup
packages/slugos-init/slugos-init_0.10.bb

index f603d0f..6077a92 100644 (file)
@@ -15,15 +15,19 @@ if test -n "$1"
 then
        device="$1"
        shift
-       echo "boot: rootfs: mount $* $device"
+       echo "boot: rootfs: mount $* $device [$UUID]"
        #
        # wait if required
        test "$sleep" -gt 0 && sleep "$sleep"
        #
        # Mount read-write because before exec'ing init
-       # this script creates the '.recovery' link to
-       # detect failed boot.  No file type is given to
-       if mount "$@" "$device" /mnt
+       # If a UUID is given (in the environment) this
+       # is used in preference to the device, but if
+       # the UUID mount fails a standard device mount
+       # is attempted.
+       if      test -n "$UUID" &&
+               mount "$@" -U "$UUID" /mnt ||
+               mount "$@" "$device" /mnt
        then
                # checkmount checks for sh, init and no
                # .recovery plus either mnt or initrd
index d7e5c99..d631579 100644 (file)
@@ -155,9 +155,8 @@ checkif(){
 #  boot with this as root.  Returns success if it appears ok.
 checkmount(){
        # basic test for init (the kernel will try to load this)
-       # but require a shell in bin/sh and no .recovery too
-       test    \( ! -f "$1/.recovery" \) -a \
-               \( -d "$1/mnt" \) -a \
+       # but require a shell in bin/sh too
+       test    \( -d "$1/mnt" \) -a \
                \( -x "$1/bin/sh" -o -h "$1/bin/sh" \) -a \
                \( -x "$1/usr/sbin/chroot" -o -h "$1/usr/sbin/chroot" -o \
                   -x "$1/sbin/chroot" -o -h "$1/sbin/chroot" \) -a \
@@ -218,7 +217,6 @@ swivel(){
                        echo -n 80 >/mnt/class/leds/ready/frequency
                        echo -n 80 >/mnt/class/leds/status/frequency
                        umount /mnt
-                       sleep 10 >/.recovery
                        sync;sync;sync
                        exit 1"
        fi
index 19c5af1..d276486 100644 (file)
@@ -88,6 +88,7 @@ get_flash() {
 #
 # check_rootfs [-i] <root fs directory>
 #  Make sure the candidate rootfs is empty
+#  Environment: rootdev=device or NFS root path
 check_rootfs() {
        local fcount
 
@@ -100,15 +101,24 @@ check_rootfs() {
                fcount="$(find "$1" ! -type d -print | wc -l)"
                test "$fcount" -eq 0 && return 0
 
-               echo "turnup: $1: partition contains existing files, specify -f to overwrite" >&2
+               echo "turnup: $rootdev: partition contains existing files, specify -f to overwrite" >&2
                return 1;;
        *)      checkmount "$1" && return 0
 
-               echo "turnup: $1: partition does not seem to be a valid root partition" >&2
-               if test -f "$1"/.recovery
-               then
-                       echo "  $1/.recovery exists: fix the partition then remove it" >&2
-               fi
+               echo "turnup: $rootdev: partition does not seem to be a valid root partition" >&2
+               echo "  The partition must contain a full operating system.  To ensure that" >&2
+               echo "  this is the case it is checked for the following, all of which must" >&2
+               echo "  exist for the bootstrap to work:" >&2
+               echo
+               echo "  1) A directory /mnt." >&2
+               echo "  2) A command line interpreter program in /bin/sh." >&2
+               echo "  3) The program chroot in /sbin or /usr/sbin." >&2
+               echo "  4) The program init in /sbin, /etc or /bin." >&2
+               echo
+               echo "  One or more of these items is missing.  Mount $rootdev on /mnt" >&2
+               echo "  and examine its contents.  You can use turnup disk|nfs -i -f" >&2
+               echo "  to copy this operating system onto the disk, but it may overwrite" >&2
+               echo "  files on the disk." >&2
                return 1;;
        esac
 }
@@ -315,16 +325,17 @@ setup_fstab() {
 }
 
 #
-# boot_rootfs <boot type> <flash file system> <sleep time> <device> [options]
+# boot_rootfs <boot type> <flash file system> <sleep time> (<device> <uuid>|<nfsroot>) [options]
 #  Change the flash partition (not the current root!) to boot off
 #  the new root file system
 boot_rootfs() {
-       local type ffs sleep device opt
+       local type ffs sleep device uuid opt
 
        type="$1"
        ffs="$2"
        sleep="$3"
        device="$4"
+       uuid=
 
        # test this first as the test does not depend on the correctness
        # of the other arguments
@@ -344,7 +355,8 @@ boot_rootfs() {
                        echo "turnup: boot_rootfs($ffs, $type, $device): expected block device" >&2
                        return 1
                }
-               shift 2;;
+               uuid="$3"
+               shift 3;;
        nfs)    shift 2;;
        flash)  ;;
        ram)    ;;
@@ -384,6 +396,7 @@ boot_rootfs() {
        *)      {       echo '#!/bin/sh'
                        echo 'leds beep'
                        test "$sleep" -gt 0 && echo -n "sleep='$sleep' "
+                       test -n "$uuid" && echo -n "UUID='$uuid' "
                        echo -n "exec '/boot/$type' '$device'"
                        for opt in "$@"
                        do
@@ -416,7 +429,7 @@ boot_rootfs() {
 # disk [-m] [-i] [-s<time>] <device> {options}
 #  Carefully copy the flash file system to the named device.
 disk() {
-       local setup_type sleep init device new ffs fst fso
+       local setup_type sleep init device uuid new ffs fst fso
 
        setup_type=disk
        sleep=0
@@ -444,6 +457,9 @@ disk() {
        }
        shift
 
+       # find the uuid if available
+       uuid="$(blkid -c /dev/null -s UUID -o value "$device")"
+
        # make temporary directories for the mount points
        new="/tmp/rootfs.$$"
        ffs="/tmp/flashdisk.$$"
@@ -464,16 +480,27 @@ disk() {
        status=1
        fst=
        fso="$(fsoptions "$@")"
-       if mount "$@" "$device" "$new"
+       if      if test -n "$uuid"
+               then
+                       mount "$@" -U "$uuid" "$new"
+               else
+                       mount "$@" "$device" "$new"
+               fi
        then
                fst="$(fstype "$new")"
                umount "$new" ||
                        echo "turnup disk: $device($new): umount does not seem to work" >&2
        fi
 
-       if test -n "$fst" && mount -t "$fst" -o "$fso" "$device" "$new"
+       if test -n "$fst" &&
+               if test -n "$uuid"
+               then
+                       mount -t "$fst" -o "$fso" -U "$uuid" "$new"
+               else
+                       mount -t "$fst" -o "$fso" "$device" "$new"
+               fi
        then
-               if check_rootfs $init "$new" && {
+               if rootdev="$device" check_rootfs $init "$new" && {
                        test -z "$init" || {
                                copy_rootfs "$ffs" "$new" &&
                                setup_rootfs "$setup_type" "$new" "$ffs"/etc/device_table
@@ -501,7 +528,7 @@ disk() {
                if test $status -eq 0
                then
                        # memsticks boot like disks, so ignore the -m
-                       boot_rootfs disk "$ffs" "$sleep" "$device" -t "$fst" -o "$fso"
+                       boot_rootfs disk "$ffs" "$sleep" "$device" "$uuid" -t "$fst" -o "$fso"
                fi
        else
                echo "turnup disk: $device($*): unable to mount device on $new" >&2
@@ -509,6 +536,8 @@ disk() {
                if test -n "$fst"
                then
                        echo "  options used: -t $fst -o $fso [error in this script]" >&2
+                       test -n "$uuid" &&
+                               echo "  uuid: $uuid (passed with -U)" >&2
                fi
        fi
 
@@ -611,7 +640,7 @@ nfs() {
        then
                if :>"$new"/ttt && test -O "$new"/ttt && rm "$new"/ttt
                then
-                       if check_rootfs $init "$new" && {
+                       if rootdev="$nfsroot" check_rootfs $init "$new" && {
                                test -z "$init" || {
                                        copy_rootfs "$ffs" "$new" &&
                                        setup_rootfs nfs "$new" "$ffs"/etc/device_table
index 06d8b7d..179e5a7 100644 (file)
@@ -4,7 +4,7 @@ PRIORITY = "required"
 LICENSE = "GPL"
 DEPENDS = "base-files devio"
 RDEPENDS = "busybox devio"
-PR = "r50"
+PR = "r51"
 
 SRC_URI = "file://boot/flash \
           file://boot/disk \