From 36387e28eb6cf1f1b2542ff5bbc4d185995c8076 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Thu, 22 Nov 2007 12:05:21 +0000 Subject: initrdscripts: Introduce boot order support for universal initramfs modules. --- packages/initrdscripts/files/80-loopboot.sh | 54 ++++++++++++++++++++++++++++ packages/initrdscripts/files/80-nfsboot.sh | 43 ++++++++++++++++++++++ packages/initrdscripts/files/85-blockboot.sh | 8 +++++ packages/initrdscripts/files/blockboot.sh | 8 ----- packages/initrdscripts/files/loopboot.sh | 54 ---------------------------- packages/initrdscripts/files/nfsboot.sh | 43 ---------------------- 6 files changed, 105 insertions(+), 105 deletions(-) create mode 100644 packages/initrdscripts/files/80-loopboot.sh create mode 100644 packages/initrdscripts/files/80-nfsboot.sh create mode 100644 packages/initrdscripts/files/85-blockboot.sh delete mode 100644 packages/initrdscripts/files/blockboot.sh delete mode 100644 packages/initrdscripts/files/loopboot.sh delete mode 100644 packages/initrdscripts/files/nfsboot.sh (limited to 'packages/initrdscripts/files') diff --git a/packages/initrdscripts/files/80-loopboot.sh b/packages/initrdscripts/files/80-loopboot.sh new file mode 100644 index 0000000000..55a1948db8 --- /dev/null +++ b/packages/initrdscripts/files/80-loopboot.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +if [ "$ROOT_DEVICE" = "/dev/loop" ]; then + loop_mount() { + loopdev=/dev/loop$loop_num + mountpt=/mnt/loop$loop_num + + [ -e $loopdev ] || mknod $loopdev b 7 $loop_num + + # if only one argument was specified, let it be path not dev + if [ -z "$path" ] && [ -n "$dev" ]; then + path="$dev" + dev="" + fi + [ -z "$offset" ] && offset=0 + + if [ -n "$dev" ]; then + hostpt=`expr "$dev" : '.*/\([^/]*\)'` + [ -z "$hostpt" ] && hostpt="$dev" + + echo "Mounting $dev on $hostpt" + mkdir $hostpt + mount $dev $hostpt + cd $hostpt + fi + + echo "Loopback setup of $path (offset $offset)" + losetup -o "$offset" "$loopdev" "$path" + + echo "Mounting $loopdev on $mountpt" + mkdir "$mountpt" + mount "$loopdev" "$mountpt" + cd "$mountpt" + BOOT_ROOT="$mountpt" + loop_num=`expr "$loop_num" + 1` + } + + modprobe vfat + modprobe loop + + loop_num=0 + + for arg in $CMDLINE; do + optarg=`expr "x$arg" : 'x[^=]*=\(.*\)'` + echo $arg xxx $optarg + case $arg in + looproot=*) + dev=`expr "$optarg" : '\([^:]*\).*'` + path=`expr "$optarg" : '[^:]*:\([^:]*\).*'` + offset=`expr "$optarg" : '[^:]*:[^:]*:\([^:]*\).*'` + loop_mount ;; + esac + done +fi diff --git a/packages/initrdscripts/files/80-nfsboot.sh b/packages/initrdscripts/files/80-nfsboot.sh new file mode 100644 index 0000000000..5129a53ebb --- /dev/null +++ b/packages/initrdscripts/files/80-nfsboot.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +if [ "$ROOT_DEVICE" = "/dev/nfs" ]; then + + # These correspond to what kernel itself uses + # DO NOT CHANGE! + NFS_OPTIONS="-o nfsvers=2,nolock" + + for arg in $CMDLINE; do + echo $arg + optarg=`expr "x$arg" : 'x[^=]*=\(.*\)'` + echo $optarg + case $arg in + nfsroot=*) + nfsroot=$optarg ;; + ip=*) + ip=$optarg ;; + esac + done + + echo $ip | (IFS=: read client_ip server_ip gw_ip netmask hostname device autoconf; \ + echo client_ip=$client_ip; + echo server_ip=$server_ip; + echo gw_ip=$gw_ip; + echo netmask=$netmask; + echo hostname=$hostname; + echo device=$device; + echo autoconf=$autoconf; + + case "$device" in + usb*) + echo "USB" + modprobe g_ether + ;; + esac + + ifconfig $device $client_ip + ) + + echo "booting from NFS: $nfsroot" + mount -t nfs $NFS_OPTIONS $nfsroot /mnt + BOOT_ROOT=/mnt +fi diff --git a/packages/initrdscripts/files/85-blockboot.sh b/packages/initrdscripts/files/85-blockboot.sh new file mode 100644 index 0000000000..567f7e29b3 --- /dev/null +++ b/packages/initrdscripts/files/85-blockboot.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# Allow booting from a normal block device. + +if [ -e "$ROOT_DEVICE" ]; then + echo "booting from: $ROOT_DEVICE" + mount "$ROOT_DEVICE" /mnt + BOOT_ROOT=/mnt +fi diff --git a/packages/initrdscripts/files/blockboot.sh b/packages/initrdscripts/files/blockboot.sh deleted file mode 100644 index 567f7e29b3..0000000000 --- a/packages/initrdscripts/files/blockboot.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -# Allow booting from a normal block device. - -if [ -e "$ROOT_DEVICE" ]; then - echo "booting from: $ROOT_DEVICE" - mount "$ROOT_DEVICE" /mnt - BOOT_ROOT=/mnt -fi diff --git a/packages/initrdscripts/files/loopboot.sh b/packages/initrdscripts/files/loopboot.sh deleted file mode 100644 index 55a1948db8..0000000000 --- a/packages/initrdscripts/files/loopboot.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/sh - -if [ "$ROOT_DEVICE" = "/dev/loop" ]; then - loop_mount() { - loopdev=/dev/loop$loop_num - mountpt=/mnt/loop$loop_num - - [ -e $loopdev ] || mknod $loopdev b 7 $loop_num - - # if only one argument was specified, let it be path not dev - if [ -z "$path" ] && [ -n "$dev" ]; then - path="$dev" - dev="" - fi - [ -z "$offset" ] && offset=0 - - if [ -n "$dev" ]; then - hostpt=`expr "$dev" : '.*/\([^/]*\)'` - [ -z "$hostpt" ] && hostpt="$dev" - - echo "Mounting $dev on $hostpt" - mkdir $hostpt - mount $dev $hostpt - cd $hostpt - fi - - echo "Loopback setup of $path (offset $offset)" - losetup -o "$offset" "$loopdev" "$path" - - echo "Mounting $loopdev on $mountpt" - mkdir "$mountpt" - mount "$loopdev" "$mountpt" - cd "$mountpt" - BOOT_ROOT="$mountpt" - loop_num=`expr "$loop_num" + 1` - } - - modprobe vfat - modprobe loop - - loop_num=0 - - for arg in $CMDLINE; do - optarg=`expr "x$arg" : 'x[^=]*=\(.*\)'` - echo $arg xxx $optarg - case $arg in - looproot=*) - dev=`expr "$optarg" : '\([^:]*\).*'` - path=`expr "$optarg" : '[^:]*:\([^:]*\).*'` - offset=`expr "$optarg" : '[^:]*:[^:]*:\([^:]*\).*'` - loop_mount ;; - esac - done -fi diff --git a/packages/initrdscripts/files/nfsboot.sh b/packages/initrdscripts/files/nfsboot.sh deleted file mode 100644 index 5129a53ebb..0000000000 --- a/packages/initrdscripts/files/nfsboot.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh - -if [ "$ROOT_DEVICE" = "/dev/nfs" ]; then - - # These correspond to what kernel itself uses - # DO NOT CHANGE! - NFS_OPTIONS="-o nfsvers=2,nolock" - - for arg in $CMDLINE; do - echo $arg - optarg=`expr "x$arg" : 'x[^=]*=\(.*\)'` - echo $optarg - case $arg in - nfsroot=*) - nfsroot=$optarg ;; - ip=*) - ip=$optarg ;; - esac - done - - echo $ip | (IFS=: read client_ip server_ip gw_ip netmask hostname device autoconf; \ - echo client_ip=$client_ip; - echo server_ip=$server_ip; - echo gw_ip=$gw_ip; - echo netmask=$netmask; - echo hostname=$hostname; - echo device=$device; - echo autoconf=$autoconf; - - case "$device" in - usb*) - echo "USB" - modprobe g_ether - ;; - esac - - ifconfig $device $client_ip - ) - - echo "booting from NFS: $nfsroot" - mount -t nfs $NFS_OPTIONS $nfsroot /mnt - BOOT_ROOT=/mnt -fi -- cgit v1.2.3 From 505b03b2909a607e2dd8693ef95e0d62d6f3212b Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Thu, 22 Nov 2007 12:07:37 +0000 Subject: initrdscripts: Initial value for ROOT_DEV is null. --- packages/initrdscripts/files/init.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'packages/initrdscripts/files') diff --git a/packages/initrdscripts/files/init.sh b/packages/initrdscripts/files/init.sh index 8c9803f21b..261a3b8477 100644 --- a/packages/initrdscripts/files/init.sh +++ b/packages/initrdscripts/files/init.sh @@ -2,7 +2,7 @@ MODULE_DIR=/initrd.d BOOT_ROOT= -ROOT_DEVICE=/dev/null +ROOT_DEVICE= early_setup() { mkdir /proc -- cgit v1.2.3 From d0e74671ac72a53a9864e35e16c2d27ed91874bf Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Thu, 22 Nov 2007 12:16:41 +0000 Subject: initrdscripts: Separate fs kernel module loading to separate plugin. --- packages/initrdscripts/files/10-initfs.sh | 5 +++++ packages/initrdscripts/files/80-loopboot.sh | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 packages/initrdscripts/files/10-initfs.sh (limited to 'packages/initrdscripts/files') diff --git a/packages/initrdscripts/files/10-initfs.sh b/packages/initrdscripts/files/10-initfs.sh new file mode 100644 index 0000000000..b336af6bbb --- /dev/null +++ b/packages/initrdscripts/files/10-initfs.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +modprobe vfat +modprobe ext2 +modprobe ext3 diff --git a/packages/initrdscripts/files/80-loopboot.sh b/packages/initrdscripts/files/80-loopboot.sh index 55a1948db8..7fbf69a202 100644 --- a/packages/initrdscripts/files/80-loopboot.sh +++ b/packages/initrdscripts/files/80-loopboot.sh @@ -35,7 +35,6 @@ if [ "$ROOT_DEVICE" = "/dev/loop" ]; then loop_num=`expr "$loop_num" + 1` } - modprobe vfat modprobe loop loop_num=0 -- cgit v1.2.3 From e0f4607a9d92714d1173ecfcc89cbd6af3343692 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Thu, 22 Nov 2007 15:08:12 +0000 Subject: initrdscripts: We obviously first do rootdelay, and only then create device nodes. --- packages/initrdscripts/files/init.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'packages/initrdscripts/files') diff --git a/packages/initrdscripts/files/init.sh b/packages/initrdscripts/files/init.sh index 261a3b8477..f8d5de9173 100644 --- a/packages/initrdscripts/files/init.sh +++ b/packages/initrdscripts/files/init.sh @@ -8,8 +8,11 @@ early_setup() { mkdir /proc mount -t proc proc /proc mkdir /mnt +} - echo -n "creating device nodes: " +dev_setup() +{ + echo -n "initramfs: Creating device nodes: " grep '^ *[0-9]' /proc/partitions | while read major minor blocks dev do if [ ! -e /dev/$dev ]; then @@ -35,6 +38,7 @@ read_args() { load_modules() { for module in $MODULE_DIR/*; do + echo "initramfs: Loading $module module" source $module done } @@ -60,6 +64,8 @@ if [ -n "$rootdelay" ]; then sleep $rootdelay fi +dev_setup + load_modules [ -n "$BOOT_ROOT" ] && boot_root boot_failed -- cgit v1.2.3 From 3d700e6647bedae4e5a2dd71efa030422b4a8913 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Thu, 22 Nov 2007 17:26:10 +0000 Subject: initrdscripts: module-initfs: Be silent on loading non-existent module. * Use -q for modprobe, and as that apparently doesn't help bitbake's modprobe, redirect output to /dev/null. --- packages/initrdscripts/files/10-initfs.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'packages/initrdscripts/files') diff --git a/packages/initrdscripts/files/10-initfs.sh b/packages/initrdscripts/files/10-initfs.sh index b336af6bbb..bad649e5c2 100644 --- a/packages/initrdscripts/files/10-initfs.sh +++ b/packages/initrdscripts/files/10-initfs.sh @@ -1,5 +1,5 @@ #!/bin/sh -modprobe vfat -modprobe ext2 -modprobe ext3 +modprobe -q vfat >/dev/null 2>&1 +modprobe -q ext2 >/dev/null 2>&1 +modprobe -q ext3 >/dev/null 2>&1 -- cgit v1.2.3 From cb561eb11cc765d2314c30bb861c9187315d9efc Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Thu, 22 Nov 2007 17:29:37 +0000 Subject: initramfs-module-loopboot: Allow to use absolute path for loop file location. --- packages/initrdscripts/files/80-loopboot.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'packages/initrdscripts/files') diff --git a/packages/initrdscripts/files/80-loopboot.sh b/packages/initrdscripts/files/80-loopboot.sh index 7fbf69a202..d84244428e 100644 --- a/packages/initrdscripts/files/80-loopboot.sh +++ b/packages/initrdscripts/files/80-loopboot.sh @@ -21,11 +21,10 @@ if [ "$ROOT_DEVICE" = "/dev/loop" ]; then echo "Mounting $dev on $hostpt" mkdir $hostpt mount $dev $hostpt - cd $hostpt fi echo "Loopback setup of $path (offset $offset)" - losetup -o "$offset" "$loopdev" "$path" + losetup -o "$offset" "$loopdev" "$hostpt/$path" echo "Mounting $loopdev on $mountpt" mkdir "$mountpt" -- cgit v1.2.3 From 05bfd48554e5a46039a0b7370dae0deed6f0c2d6 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Thu, 22 Nov 2007 17:34:24 +0000 Subject: 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. --- packages/initrdscripts/files/30-bootmenu.sh | 154 ++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 packages/initrdscripts/files/30-bootmenu.sh (limited to 'packages/initrdscripts/files') diff --git a/packages/initrdscripts/files/30-bootmenu.sh b/packages/initrdscripts/files/30-bootmenu.sh new file mode 100644 index 0000000000..5b3e7782f4 --- /dev/null +++ b/packages/initrdscripts/files/30-bootmenu.sh @@ -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 -- cgit v1.2.3