Patchwork [v2] initrd: add recovery feature

login
register
mail settings
Submitter Radu Moisan
Date Nov. 13, 2012, 9:12 p.m.
Message ID <1352841144-31228-1-git-send-email-radu.moisan@intel.com>
Download mbox | patch
Permalink /patch/38955/
State New
Headers show

Comments

Radu Moisan - Nov. 13, 2012, 9:12 p.m.
Allows you to use as root a partition instead of the rootfs.img
for recovering an old install, and fails safe when no rootfs is
found, dropping the user to a shell if something goes wrong.

Signed-off-by: Radu Moisan <radu.moisan@intel.com>
Signed-off-by: Alexandru Damian <alexandru.damian@intel.com>
---
 meta/recipes-core/initrdscripts/files/init-live.sh |   44 +++++++++++++++++++-
 1 file changed, 42 insertions(+), 2 deletions(-)
Saul Wold - Nov. 13, 2012, 11:07 p.m.
On 11/13/2012 01:12 PM, Radu Moisan wrote:
> Allows you to use as root a partition instead of the rootfs.img
> for recovering an old install, and fails safe when no rootfs is
> found, dropping the user to a shell if something goes wrong.
>
> Signed-off-by: Radu Moisan <radu.moisan@intel.com>
> Signed-off-by: Alexandru Damian <alexandru.damian@intel.com>
> ---
>   meta/recipes-core/initrdscripts/files/init-live.sh |   44 +++++++++++++++++++-
>   1 file changed, 42 insertions(+), 2 deletions(-)
>
> diff --git a/meta/recipes-core/initrdscripts/files/init-live.sh b/meta/recipes-core/initrdscripts/files/init-live.sh
> index 5682fd1..81686b9 100644
> --- a/meta/recipes-core/initrdscripts/files/init-live.sh
> +++ b/meta/recipes-core/initrdscripts/files/init-live.sh
> @@ -68,13 +68,49 @@ fatal() {
>
>   early_setup
>
> +# wait for the udevd to settle
> +echo "Waiting for udev to settle..."
> +udevadm settle --timeout=3
> +
Why are you still adding in the timeout?  This still could have adverse 
affects on some machines, just let settle do it's job.

Sau!


>   [ -z "$CONSOLE" ] && CONSOLE="/dev/console"
>
>   read_args
>
> -echo "Waiting for removable media..."
> -while true
> +# boot partiton menu, if one or more bootable partitions exist
> +BOOTMENU=`ls /media/sd*/sbin/init 2>/dev/null | wc -l`
> +if [ $BOOTMENU -gt 0 ]; then
> +   choice=0
> +   while [ $choice -le 0 ]; do
> +       echo "1). boot live ramfs image"
> +       count=2
> +       for i in `ls /media/sd*/sbin/init 2>/dev/null | cut -d "/" -f 3`; do
> +           echo $count"). boot /dev/"$i
> +           choicecmd[$count]=$i
> +           count=$(( count + 1))
> +       done
> +       echo
> +       echo -n "Your choice: "
> +       read choice
> +   done
> +
> +   if [ $choice -gt 1 ]; then
> +       #ROOT_MOUNT=/media/${choicecmd[${choice}]}
> +       ROOT_MOUNT=none #testing
> +       echo "Booting local root ... $ROOT_MOUNT"
> +       if [ -d $ROOT_MOUNT ]; then
> +           boot_live_root
> +       else
> +           fatal "Rootfs partition not mounted"
> +       fi
> +   fi
> +fi
> +
> +echo -n "Waiting for removable media... "
> +CNT=0
> +while [ $CNT -le 3 ];
>   do
> +  echo -n "$CNT "
> +  CNT=$(( $CNT + 1 ))
>     for i in `ls /media 2>/dev/null`; do
>         if [ -f /media/$i/$ROOT_IMAGE ] ; then
>   		found="yes"
> @@ -91,6 +127,10 @@ do
>     sleep 1
>   done
>
> +if [ "$found" != "yes" ]; then
> +   fatal "...could not mount removable media, drop to shell"
> +fi
> +
>   case $label in
>       boot)
>   	mkdir $ROOT_MOUNT
>
Otavio Salvador - Nov. 14, 2012, 1:30 a.m.
On Tue, Nov 13, 2012 at 7:12 PM, Radu Moisan <radu.moisan@intel.com> wrote:

> Allows you to use as root a partition instead of the rootfs.img
> for recovering an old install, and fails safe when no rootfs is
> found, dropping the user to a shell if something goes wrong.
>
> Signed-off-by: Radu Moisan <radu.moisan@intel.com>
> Signed-off-by: Alexandru Damian <alexandru.damian@intel.com>
> ---
>  meta/recipes-core/initrdscripts/files/init-live.sh |   44
> +++++++++++++++++++-
>  1 file changed, 42 insertions(+), 2 deletions(-)
>
> diff --git a/meta/recipes-core/initrdscripts/files/init-live.sh
> b/meta/recipes-core/initrdscripts/files/init-live.sh
> index 5682fd1..81686b9 100644
> --- a/meta/recipes-core/initrdscripts/files/init-live.sh
> +++ b/meta/recipes-core/initrdscripts/files/init-live.sh
> @@ -68,13 +68,49 @@ fatal() {
>
>  early_setup
>
> +# wait for the udevd to settle
> +echo "Waiting for udev to settle..."
> +udevadm settle --timeout=3
>

I think if we take a timeout it needs to be about 10s or 20s. I have some
slow machines that take way more time then 3s.


>  [ -z "$CONSOLE" ] && CONSOLE="/dev/console"
>
>  read_args
>
> -echo "Waiting for removable media..."
> -while true
> +# boot partiton menu, if one or more bootable partitions exist
> +BOOTMENU=`ls /media/sd*/sbin/init 2>/dev/null | wc -l`
> +if [ $BOOTMENU -gt 0 ]; then
> +   choice=0
> +   while [ $choice -le 0 ]; do
> +       echo "1). boot live ramfs image"
> +       count=2
> +       for i in `ls /media/sd*/sbin/init 2>/dev/null | cut -d "/" -f 3`;
> do
> +           echo $count"). boot /dev/"$i
> +           choicecmd[$count]=$i
> +           count=$(( count + 1))
> +       done
> +       echo
> +       echo -n "Your choice: "
> +       read choice
> +   done
> +
> +   if [ $choice -gt 1 ]; then
> +       #ROOT_MOUNT=/media/${choicecmd[${choice}]}
> +       ROOT_MOUNT=none #testing
> +       echo "Booting local root ... $ROOT_MOUNT"
> +       if [ -d $ROOT_MOUNT ]; then
> +           boot_live_root
> +       else
> +           fatal "Rootfs partition not mounted"
> +       fi
> +   fi
> +fi
> +
> +echo -n "Waiting for removable media... "
> +CNT=0
> +while [ $CNT -le 3 ];
>  do
> +  echo -n "$CNT "
> +  CNT=$(( $CNT + 1 ))
>    for i in `ls /media 2>/dev/null`; do
>        if [ -f /media/$i/$ROOT_IMAGE ] ; then
>                 found="yes"
> @@ -91,6 +127,10 @@ do
>    sleep 1
>  done
>
> +if [ "$found" != "yes" ]; then
> +   fatal "...could not mount removable media, drop to shell"
> +fi
> +
>  case $label in
>      boot)
>         mkdir $ROOT_MOUNT
> --
> 1.7.9.5
>
>
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core
>
Radu Moisan - Nov. 14, 2012, 7:39 p.m.
On 11/14/2012 01:07 AM, Saul Wold wrote:
> On 11/13/2012 01:12 PM, Radu Moisan wrote:
>> Allows you to use as root a partition instead of the rootfs.img
>> for recovering an old install, and fails safe when no rootfs is
>> found, dropping the user to a shell if something goes wrong.
>>
>> Signed-off-by: Radu Moisan <radu.moisan@intel.com>
>> Signed-off-by: Alexandru Damian <alexandru.damian@intel.com>
>> ---
>>   meta/recipes-core/initrdscripts/files/init-live.sh |   44 
>> +++++++++++++++++++-
>>   1 file changed, 42 insertions(+), 2 deletions(-)
>>
>> diff --git a/meta/recipes-core/initrdscripts/files/init-live.sh 
>> b/meta/recipes-core/initrdscripts/files/init-live.sh
>> index 5682fd1..81686b9 100644
>> --- a/meta/recipes-core/initrdscripts/files/init-live.sh
>> +++ b/meta/recipes-core/initrdscripts/files/init-live.sh
>> @@ -68,13 +68,49 @@ fatal() {
>>
>>   early_setup
>>
>> +# wait for the udevd to settle
>> +echo "Waiting for udev to settle..."
>> +udevadm settle --timeout=3
>> +
> Why are you still adding in the timeout?  This still could have 
> adverse affects on some machines, just let settle do it's job.
>
> Sau!
>
Well, I didn't see any side effects. If there are side effects I'll 
remove the timeout but please point out to me some of those. Anyway, I 
thought about this more like a safety net because I've noticed "settle" 
has some history with hanging the system boot more that it should in 
some circumstances.

Radu
Radu Moisan - Nov. 14, 2012, 7:41 p.m.
On 11/14/2012 03:30 AM, Otavio Salvador wrote:
>
>
> On Tue, Nov 13, 2012 at 7:12 PM, Radu Moisan <radu.moisan@intel.com 
> <mailto:radu.moisan@intel.com>> wrote:
>
>     Allows you to use as root a partition instead of the rootfs.img
>     for recovering an old install, and fails safe when no rootfs is
>     found, dropping the user to a shell if something goes wrong.
>
>     Signed-off-by: Radu Moisan <radu.moisan@intel.com
>     <mailto:radu.moisan@intel.com>>
>     Signed-off-by: Alexandru Damian <alexandru.damian@intel.com
>     <mailto:alexandru.damian@intel.com>>
>     ---
>      meta/recipes-core/initrdscripts/files/init-live.sh |   44
>     +++++++++++++++++++-
>      1 file changed, 42 insertions(+), 2 deletions(-)
>
>     diff --git a/meta/recipes-core/initrdscripts/files/init-live.sh
>     b/meta/recipes-core/initrdscripts/files/init-live.sh
>     index 5682fd1..81686b9 100644
>     --- a/meta/recipes-core/initrdscripts/files/init-live.sh
>     +++ b/meta/recipes-core/initrdscripts/files/init-live.sh
>     @@ -68,13 +68,49 @@ fatal() {
>
>      early_setup
>
>     +# wait for the udevd to settle
>     +echo "Waiting for udev to settle..."
>     +udevadm settle --timeout=3
>
>
> I think if we take a timeout it needs to be about 10s or 20s. I have 
> some slow machines that take way more time then 3s.
This is more reasonable then just removing the timeout.

Radu
Ross Burton - Nov. 15, 2012, 10:19 a.m.
On 14 November 2012 19:39, Radu Moisan <radu.moisan@intel.com> wrote:
> Well, I didn't see any side effects. If there are side effects I'll remove
> the timeout but please point out to me some of those. Anyway, I thought
> about this more like a safety net because I've noticed "settle" has some
> history with hanging the system boot more that it should in some
> circumstances.

Your average Intel, qemu, or fast ARM test hardware can easily settle
in under three seconds.  The problem is when you have either slow
hardware, or hardware with lots of storage devices to enumerate.

Ross
Otavio Salvador - Nov. 15, 2012, 2:42 p.m.
On Thu, Nov 15, 2012 at 8:19 AM, Burton, Ross <ross.burton@intel.com> wrote:

> On 14 November 2012 19:39, Radu Moisan <radu.moisan@intel.com> wrote:
> > Well, I didn't see any side effects. If there are side effects I'll
> remove
> > the timeout but please point out to me some of those. Anyway, I thought
> > about this more like a safety net because I've noticed "settle" has some
> > history with hanging the system boot more that it should in some
> > circumstances.
>
> Your average Intel, qemu, or fast ARM test hardware can easily settle
> in under three seconds.  The problem is when you have either slow
> hardware, or hardware with lots of storage devices to enumerate.
>

Radu, please drop it or set it for 20s or so. I am against the timeout as a
whole as in case this causes a boot fail it will be quite difficult to
average user to come up to realize the cause of the problem so my opinion
would be to drop it completely.
Radu Moisan - Nov. 15, 2012, 4:57 p.m.
On 11/15/2012 04:42 PM, Otavio Salvador wrote:
>
> Radu, please drop it or set it for 20s or so. I am against the timeout 
> as a whole as in case this causes a boot fail it will be quite 
> difficult to average user to come up to realize the cause of the 
> problem so my opinion would be to drop it completely.
Ok guys, it fine with me to drop it then.

Radu

Patch

diff --git a/meta/recipes-core/initrdscripts/files/init-live.sh b/meta/recipes-core/initrdscripts/files/init-live.sh
index 5682fd1..81686b9 100644
--- a/meta/recipes-core/initrdscripts/files/init-live.sh
+++ b/meta/recipes-core/initrdscripts/files/init-live.sh
@@ -68,13 +68,49 @@  fatal() {
 
 early_setup
 
+# wait for the udevd to settle
+echo "Waiting for udev to settle..."
+udevadm settle --timeout=3
+
 [ -z "$CONSOLE" ] && CONSOLE="/dev/console"
 
 read_args
 
-echo "Waiting for removable media..."
-while true
+# boot partiton menu, if one or more bootable partitions exist
+BOOTMENU=`ls /media/sd*/sbin/init 2>/dev/null | wc -l`
+if [ $BOOTMENU -gt 0 ]; then
+   choice=0
+   while [ $choice -le 0 ]; do
+       echo "1). boot live ramfs image"
+       count=2
+       for i in `ls /media/sd*/sbin/init 2>/dev/null | cut -d "/" -f 3`; do
+           echo $count"). boot /dev/"$i
+           choicecmd[$count]=$i
+           count=$(( count + 1))
+       done
+       echo
+       echo -n "Your choice: "
+       read choice
+   done
+
+   if [ $choice -gt 1 ]; then
+       #ROOT_MOUNT=/media/${choicecmd[${choice}]}
+       ROOT_MOUNT=none #testing
+       echo "Booting local root ... $ROOT_MOUNT"
+       if [ -d $ROOT_MOUNT ]; then
+           boot_live_root
+       else
+           fatal "Rootfs partition not mounted"
+       fi
+   fi
+fi
+
+echo -n "Waiting for removable media... "
+CNT=0
+while [ $CNT -le 3 ];
 do
+  echo -n "$CNT "
+  CNT=$(( $CNT + 1 ))
   for i in `ls /media 2>/dev/null`; do
       if [ -f /media/$i/$ROOT_IMAGE ] ; then
 		found="yes"
@@ -91,6 +127,10 @@  do
   sleep 1
 done
 
+if [ "$found" != "yes" ]; then
+   fatal "...could not mount removable media, drop to shell"
+fi
+
 case $label in
     boot)
 	mkdir $ROOT_MOUNT