base: improve emergency shell
authorLuca Berra <bluca@comedia.it>
Wed, 13 Jan 2010 15:01:36 +0000 (16:01 +0100)
committerHarald Hoyer <harald@redhat.com>
Wed, 13 Jan 2010 15:01:36 +0000 (16:01 +0100)
for some unknown reason the emergency shell
starts with stderr closed, at first I even tought it was not working at
all, then I came up with this hack, which seems to work properly. I also
change the prompt to remind which step are we breaking to.

modules.d/99base/init

index 9d85f69..8dc00a9 100755 (executable)
@@ -35,6 +35,12 @@ wait_for_loginit()
 
 emergency_shell()
 {
+    if [ $1 = "-n" ]; then
+        _rdshell_name=$2
+        shift 2 
+    else
+        _rdshell_name=dracut
+    fi
     wait_for_loginit
     echo ; echo
     echo $@
@@ -43,7 +49,9 @@ emergency_shell()
     if getarg rdshell || getarg rdbreak; then
         echo "Dropping to debug shell."
         echo
-        sh -i
+        export PS1="$_rdshell_name:\${PWD}# "
+        [ -e /.profile ] || echo "exec 0<>/dev/console 1<>/dev/console 2<>/dev/console" > /.profile
+        sh -i -l
     else
         echo "Boot has failed, sleeping forever."
         while :; do sleep 365d;done
@@ -101,7 +109,7 @@ UDEVVERSION=$(udevadm --version)
 source_conf /etc/conf.d
 
 # run scriptlets to parse the command line
-getarg 'rdbreak=cmdline' && emergency_shell "Break before cmdline"
+getarg 'rdbreak=cmdline' && emergency_shell -n cmdline "Break before cmdline"
 source_all cmdline
 
 [ -z "$root" ] && die "No or empty root= argument"
@@ -118,7 +126,7 @@ source_all cmdline
 } > /tmp/root.info
 
 # pre-udev scripts run before udev starts, and are run only once.
-getarg 'rdbreak=pre-udev' && emergency_shell "Break before pre-udev"
+getarg 'rdbreak=pre-udev' && emergency_shell -n pre-udev "Break before pre-udev"
 source_all pre-udev
 
 # start up udev and trigger cold plugs
@@ -135,13 +143,13 @@ fi
 getarg rdudevinfo && udevadm control $UDEV_LOG_PRIO_ARG=info
 getarg rdudevdebug && udevadm control $UDEV_LOG_PRIO_ARG=debug
 
-getarg 'rdbreak=pre-trigger' && emergency_shell "Break before pre-trigger"
+getarg 'rdbreak=pre-trigger' && emergency_shell -n pre-trigger "Break before pre-trigger"
 source_all pre-trigger
 
 # then the rest
 udevadm trigger $udevtriggeropts  >/dev/null 2>&1
 
-getarg 'rdbreak=initqueue' && emergency_shell "Break before initqueue"
+getarg 'rdbreak=initqueue' && emergency_shell -n initqueue "Break before initqueue"
 
 i=0
 while :; do
@@ -187,11 +195,11 @@ unset queuetriggered
 
 # pre-mount happens before we try to mount the root filesystem,
 # and happens once.
-getarg 'rdbreak=pre-mount' && emergency_shell "Break pre-mount"
+getarg 'rdbreak=pre-mount' && emergency_shell -n pre-mount "Break pre-mount"
 source_all pre-mount
 
 
-getarg 'rdbreak=mount' && emergency_shell "Break mount"
+getarg 'rdbreak=mount' && emergency_shell -n mount "Break mount"
 # mount scripts actually try to mount the root filesystem, and may
 # be sourced any number of times. As soon as one suceeds, no more are sourced.
 i=0
@@ -213,7 +221,7 @@ done
 } | vinfo
 
 # pre pivot scripts are sourced just before we switch over to the new root.
-getarg 'rdbreak=pre-pivot' && emergency_shell "Break pre-pivot"
+getarg 'rdbreak=pre-pivot' && emergency_shell -n pre-pivot "Break pre-pivot"
 source_all pre-pivot
 
 # by the time we get here, the root filesystem should be mounted.
@@ -228,7 +236,7 @@ done
     emergency_shell
 }
 
-getarg rdbreak && emergency_shell "Break before switch_root"
+getarg rdbreak && emergency_shell -n switch_root "Break before switch_root"
 
 # stop udev queue before killing it
 udevadm control --stop-exec-queue