You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

99 lines
2.4 KiB

#!/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 <harald@redhat.com>
#!/bin/sh
. /lib/dracut-lib.sh
export TERM=linux
emergency_shell()
{
local _ctty
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 ] || >/.profile
_ctty=/dev/console
if type setsid >/dev/null 2>&1; then
_ctty="$(getarg rd.ctty=)" && _ctty="/dev/${_ctty##*/}"
[ -c "$_ctty" ] || _ctty=/dev/tty1
setsid sh -i -l 0<$_ctty 1>$_ctty 2>&1
else
sh -i -l 0<$_ctty 1>$_ctty 2>&1
fi
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 </proc/mounts
[ "$_did_umount" = "y" ] && return 0
return 1
}
_cnt=0
while [ $_cnt -le 40 ]; do
umount_a 2>/dev/null || break
_cnt=$(($_cnt+1))
done
[ $_cnt -ge 40 ] && umount_a
_check_shutdown() {
local __f
local __s=1
for __f in $hookdir/shutdown/*.sh; do
[ -e "$__f" ] || continue
( . "$__f" $1 )
if [ $? -eq 0 ]; then
rm -f $__f
__s=0
fi
done
return $__s
}
_cnt=0
while _check_shutdown; do
:
done
_check_shutdown final
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