Currently the default action is emergency_shell when failure happened during system boot. In kdump, this default may not be expected. E.g, if dump target is not rootfs, it does not matter if mount root failed. Adding an action which allow dracut always go ahead though failure happens is needed by kdump. So here add a function action_on_fail() and cmdline parameter action_on_fail=<shell | continue>. Use action_to_fail() to replace emergency_shell which was called after failure. By $(getarg action_on_fail=), decice to drop into shell, or to leave away the failure and go ahead. Signed-off-by: Baoquan He <bhe@xxxxxxxxxx> --- dracut.cmdline.7.asc | 4 ++++ modules.d/95rootfs-block/mount-root.sh | 7 ++++--- modules.d/98systemd/dracut-initqueue.sh | 2 +- modules.d/98systemd/dracut-mount.sh | 2 +- modules.d/98usrmount/mount-usr.sh | 14 ++++++++------ modules.d/99base/dracut-lib.sh | 17 +++++++++++++++++ modules.d/99base/init.sh | 12 ++++++------ 7 files changed, 41 insertions(+), 17 deletions(-) diff --git a/dracut.cmdline.7.asc b/dracut.cmdline.7.asc index f1457d5..e777715 100644 --- a/dracut.cmdline.7.asc +++ b/dracut.cmdline.7.asc @@ -121,6 +121,10 @@ Misc specify the controlling terminal for the console. This is useful, if you have multiple "console=" arguments. +**action_on_fail=**_{shell|continue}_:: + Specify the action after failure. By default it's emergency_shell. + 'continue' means leave away current failure and go ahead. + [[dracutkerneldebug]] Debug ~~~~~ diff --git a/modules.d/95rootfs-block/mount-root.sh b/modules.d/95rootfs-block/mount-root.sh index c7626c3..d020338 100755 --- a/modules.d/95rootfs-block/mount-root.sh +++ b/modules.d/95rootfs-block/mount-root.sh @@ -66,9 +66,10 @@ mount_root() { fi if [ -n "$AUTOFSCK_SINGLEUSER" ]; then warn "*** Warning -- the system did not shut down cleanly. " - warn "*** Dropping you to a shell; the system will continue" - warn "*** when you leave the shell." - emergency_shell + warn "*** Dropping you to a shell by default; the system" + warn "*** will continue when you leave the shell." + warn "*** You can also spicify other actions." + action_on_fail fi fsckoptions="$AUTOFSCK_OPT $fsckoptions" fi diff --git a/modules.d/98systemd/dracut-initqueue.sh b/modules.d/98systemd/dracut-initqueue.sh index c6fab30..2c71bf4 100755 --- a/modules.d/98systemd/dracut-initqueue.sh +++ b/modules.d/98systemd/dracut-initqueue.sh @@ -62,7 +62,7 @@ while :; do fi main_loop=$(($main_loop+1)) - [ $main_loop -gt $RDRETRY ] && emergency_shell "Could not boot." + [ $main_loop -gt $RDRETRY ] && action_on_fail "Could not boot." && break done unset job diff --git a/modules.d/98systemd/dracut-mount.sh b/modules.d/98systemd/dracut-mount.sh index 5f3d9f0..ae01512 100755 --- a/modules.d/98systemd/dracut-mount.sh +++ b/modules.d/98systemd/dracut-mount.sh @@ -31,7 +31,7 @@ while :; do done i=$(($i+1)) - [ $i -gt 20 ] && emergency_shell "Can't mount root filesystem" + [ $i -gt 20 ] && action_on_fail "Can't mount root filesystem" && break done export -p > /dracut-state.sh diff --git a/modules.d/98usrmount/mount-usr.sh b/modules.d/98usrmount/mount-usr.sh index 5aaefbc..823338b 100755 --- a/modules.d/98usrmount/mount-usr.sh +++ b/modules.d/98usrmount/mount-usr.sh @@ -40,9 +40,10 @@ fsck_usr() fi if [ -n "$AUTOFSCK_SINGLEUSER" ]; then warn "*** Warning -- the system did not shut down cleanly. " - warn "*** Dropping you to a shell; the system will continue" - warn "*** when you leave the shell." - emergency_shell + warn "*** Dropping you to a shell by default; the system" + warn "*** will continue when you leave the shell." + warn "*** You can also spicify other actions." + action_on_fail fi _fsckoptions="$AUTOFSCK_OPT $_fsckoptions" fi @@ -103,9 +104,10 @@ mount_usr() if ! ismounted "$NEWROOT/usr"; then warn "Mounting /usr to $NEWROOT/usr failed" - warn "*** Dropping you to a shell; the system will continue" - warn "*** when you leave the shell." - emergency_shell + warn "*** Dropping you to a shell by default; the system" + warn "*** will continue when you leave the shell." + warn "*** You can also spicify other actions." + action_on_fail fi fi } diff --git a/modules.d/99base/dracut-lib.sh b/modules.d/99base/dracut-lib.sh index e456b01..8bdabee 100755 --- a/modules.d/99base/dracut-lib.sh +++ b/modules.d/99base/dracut-lib.sh @@ -975,6 +975,23 @@ emergency_shell() [ -e /run/initramfs/.die ] && exit 1 } +action_on_fail() +{ + local _action=$(getarg action_on_fail=) + case "$_action" in + continue) + return 0 + ;; + shell) + emergency_shell $@ + return 1 + ;; + *) + emergency_shell $@ + return 1 + esac +} + # Retain the values of these variables but ensure that they are unexported # This is a POSIX-compliant equivalent of bash's "export -n" export_n() diff --git a/modules.d/99base/init.sh b/modules.d/99base/init.sh index b441a27..af36910 100755 --- a/modules.d/99base/init.sh +++ b/modules.d/99base/init.sh @@ -79,7 +79,7 @@ if ! ismounted /run; then rm -fr /newrun fi -trap "emergency_shell Signal caught!" 0 +trap "action_on_fail Signal caught!" 0 [ -d /run/initramfs ] || mkdir -p -m 0755 /run/initramfs [ -d /run/log ] || mkdir -p -m 0755 /run/log @@ -199,7 +199,7 @@ while :; do main_loop=$(($main_loop+1)) [ $main_loop -gt $RDRETRY ] \ - && { flock -s 9 ; emergency_shell "Could not boot."; } 9>/.console_lock + && { flock -s 9 ; action_on_fail "Could not boot." && break; } 9>/.console_lock done unset job unset queuetriggered @@ -234,7 +234,7 @@ while :; do i=$(($i+1)) [ $i -gt 20 ] \ - && { flock -s 9 ; emergency_shell "Can't mount root filesystem"; } 9>/.console_lock + && { flock -s 9 ; action_on_fail "Can't mount root filesystem" && break; } 9>/.console_lock done { @@ -268,7 +268,7 @@ done [ "$INIT" ] || { echo "Cannot find init!" echo "Please check to make sure you passed a valid root filesystem!" - emergency_shell + action_on_fail } if [ $UDEVVERSION -lt 168 ]; then @@ -370,13 +370,13 @@ if [ -f /etc/capsdrop ]; then warn "Command:" warn capsh --drop=$CAPS_INIT_DROP -- -c exec switch_root "$NEWROOT" "$INIT" $initargs warn "failed." - emergency_shell + action_on_fail } else unset RD_DEBUG exec $SWITCH_ROOT "$NEWROOT" "$INIT" $initargs || { warn "Something went very badly wrong in the initramfs. Please " warn "file a bug against dracut." - emergency_shell + action_on_fail } fi -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe initramfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html