#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Licensed under the GPLv2 # # Copyright 2011, Red Hat, Inc. # Harald Hoyer #!/bin/sh . /lib/dracut-lib.sh export TERM=linux emergency_shell() { set +e if [ "$1" = "-n" ]; then _rdshell_name=$2 shift 2 else _rdshell_name=dracut fi echo ; echo warn $@ source_hook shutdown-emergency echo if getargbool 1 rd.shell -y rdshell || getarg rd.break rdbreak; then [ -x /lib/udev/console_init ] && /lib/udev/console_init /dev/console echo "Dropping to debug shell." echo export PS1="$_rdshell_name:\${PWD}# " [ -e /.profile ] || echo "exec 0<>/dev/console 1<>/dev/console 2<>/dev/console" > /.profile sh -i -l else exec /lib/systemd/systemd-shutdown "$@" warn "Shutdown has failed. To debug this issue add \"rdshell\" to the kernel command line." # cause a kernel panic exit 1 fi } trap "emergency_shell Signal caught!" 0 getarg 'rd.break=pre-shutdown' && emergency_shell -n cmdline "Break before pre-shutdown" umount_a() { local _did_umount="n" while read a mp a; do if strstr "$mp" oldroot; then if umount "$mp"; then _did_umount="y" echo "Unmounted $mp." fi fi done /dev/null || break _cnt=$(($_cnt+1)) done [ $_cnt -ge 40 ] && umount_a check_finished() { local f for f in $hookdir/shutdown/*.sh; do [ -e "$f" ] || continue ( . "$f" ) || return 1 done return 0 } _cnt=0 while [ $_cnt -le 40 ]; do check_finished 2>/dev/null && break _cnt=$(($_cnt+1)) done [ $_cnt -ge 40 ] && check_finished getarg 'rd.break=shutdown' && emergency_shell -n cmdline "Break before shutdown" [ "$1" = "reboot" ] && reboot -f -d -n --no-wall [ "$1" = "poweroff" ] && poweroff -f -d -n --no-wall [ "$1" = "halt" ] && halt -f -d -n --no-wall [ "$1" = "kexec" ] && kexec -e