[oe-commits] org.oe.dev initramfs-module-bootmenu: Interactive boot location selection for initramfs-uniboot.

pfalcon commit openembedded-commits at lists.openembedded.org
Thu Nov 22 19:44:47 UTC 2007


initramfs-module-bootmenu: Interactive boot location selection for initramfs-uniboot.
* For now, supports booting from ext2/ext3 partitions and from ext2/ext3 loopback
images placed on vfat partition.

Author: pfalcon at openembedded.org
Branch: org.openembedded.dev
Revision: b4fb0e02c0de82a5593a04d6a92a465545d17e15
ViewMTN: http://monotone.openembedded.org/revision/info/b4fb0e02c0de82a5593a04d6a92a465545d17e15
Files:
1
packages/initrdscripts/files/30-bootmenu.sh
packages/initrdscripts/initramfs-module-bootmenu_1.0.bb
Diffs:

#
# mt diff -rd33b5e7d8adf44c150a42d6cf996f125f0597d0f -rb4fb0e02c0de82a5593a04d6a92a465545d17e15
#
# 
# 
# add_file "packages/initrdscripts/files/30-bootmenu.sh"
#  content [dcac7a351d81139c5e5c42d7115e7df562f936a1]
# 
# add_file "packages/initrdscripts/initramfs-module-bootmenu_1.0.bb"
#  content [8f8e42c6e5c128c065b336db59a056006457d5b6]
# 
============================================================
--- packages/initrdscripts/files/30-bootmenu.sh	dcac7a351d81139c5e5c42d7115e7df562f936a1
+++ packages/initrdscripts/files/30-bootmenu.sh	dcac7a351d81139c5e5c42d7115e7df562f936a1
@@ -0,0 +1,154 @@
+# If root is explicitly specified, skip interactive selection
+if [ -z "$ROOT_DEVICE" ]; then
+##############################
+
+E="\033["
+MOUNTLOC="tmp"
+LOOP_IMG_MASK='*.img'
+
+if ! (echo " " | read -n1 foo) >/dev/null 2>&1; then
+    echo "'read' command lacks -n switch support, aborting" 
+    exit 1
+fi
+
+mkdir -p $MOUNTLOC
+
+list=""
+
+add_menu_item()
+{
+    if [ -n "$list" ]; then
+	list="$list\n"
+    fi
+	
+    list="$list$1"
+}
+
+show_menu() {
+    echo -e -n "${E}3;0H"
+    cnt=0
+    echo -e $list | \
+    while read l; do
+        if [ $cnt == $num ]; then
+	    echo -e -n "${E}1m"
+	fi
+        echo -e "$cnt: $l${E}0m"
+	cnt=$((cnt + 1))
+    done
+}
+
+get_menu_selection()
+{
+    cnt=0
+    sel=`echo -e $list | \
+    while read l; do
+    if [ $cnt == $num ]; then
+	    echo $l
+	    break
+	fi
+	cnt=$((cnt + 1))
+    done`
+}
+
+get_partition_type()
+{
+    fstype=`mount -f --guess-fstype /dev/$dev $MOUNTLOC`
+}
+
+scan_for_loopimgs()
+{
+# Scan a device for loopback images, add to the list if found
+	mount /dev/$dev $MOUNTLOC
+	p=$PWD
+	cd $MOUNTLOC
+	for img in `ls -1 $LOOP_IMG_MASK 2>/dev/null`; do
+	    add_menu_item "$dev/$img (loop img on vfat)"
+	done
+	cd $p
+	umount $MOUNTLOC
+}
+
+# Scan all available device/partitions
+while read maj min nblk dev; do
+    if [ -z "$maj" -o "$maj" == "major" ]; then
+	continue;
+    fi
+
+    get_partition_type
+    if [ "$fstype" != "ext2" -a "$fstype" != "ext3" -a "$fstype" != "vfat" ]; then
+#	continue
+	true
+    fi
+    
+    if [ "$fstype" == "vfat" ]; then
+	scan_for_loopimgs
+	continue
+    fi
+    
+    add_menu_item "$dev ($fstype)"
+done < /proc/partitions
+
+add_menu_item "NFS (nfsroot=192.168.2.200:/nfs/image)"
+
+total=`echo -e $list | wc -l`
+num=0
+
+# Draw UI
+stty -echo
+echo -e -n "${E}2J"
+echo -e -n "${E}0;0H"
+echo "Select boot image:"
+
+# Main loop
+show_menu
+while read -n1 i; do
+    case "$i" in
+	"A")
+	    num=$((num - 1))
+	    if [ $num -lt 0 ]; then
+		num=$(($total - 1))
+	    fi
+	;;
+	["B"-"Z"])
+	    num=$((num + 1))
+	    if [ $num -ge $total ]; then
+		num=0
+	    fi
+	;;
+	"q")
+	    exec sh
+	;;
+	"")
+	    break
+	;;
+    esac
+    show_menu
+#    echo "*$esc$i"
+done
+
+stty echo
+
+# Process results of user selection, prepare input arguments
+# for boot modules
+
+get_menu_selection
+echo Selected: $sel
+
+dev=`expr "$sel" : '\([^ /]*\)'`
+path=`expr "$sel" : '[^/]*\([^ ]*\).*'`
+
+if [ "$dev" == "NFS" ]; then
+    ROOT_DEVICE="/dev/nfs"
+    CMDLINE="$CMDLINE nfsroot=192.168.2.200:/nfs/image"
+elif [ -n "$path" ]; then
+    ROOT_DEVICE="/dev/loop"
+    CMDLINE="looproot=/dev/$dev:$path"
+else
+    ROOT_DEVICE="/dev/$dev"
+fi
+
+echo ROOT_DEVICE=$ROOT_DEVICE
+echo CMDLINE=$CMDLINE
+
+##############################
+fi
============================================================
--- packages/initrdscripts/initramfs-module-bootmenu_1.0.bb	8f8e42c6e5c128c065b336db59a056006457d5b6
+++ packages/initrdscripts/initramfs-module-bootmenu_1.0.bb	8f8e42c6e5c128c065b336db59a056006457d5b6
@@ -0,0 +1,11 @@
+SRC_URI = "file://30-bootmenu.sh"
+PR = "r1"
+RDEPENDS = "util-linux-mount initramfs-uniboot initramfs-module-block initramfs-module-loop"
+DESCRIPTION = "An initramfs module with UI for selection of boot device."
+
+do_install() {
+	install -d ${D}/initrd.d
+        install -m 0755 ${WORKDIR}/30-bootmenu.sh ${D}/initrd.d/
+}
+
+FILES_${PN} += " /initrd.d/* "






More information about the Openembedded-commits mailing list