base: add shutdown script to be called from systemd

master
Harald Hoyer 2011-05-30 17:27:36 +02:00
parent 55468fb9b3
commit 168fa7e571
5 changed files with 118 additions and 2 deletions

1
NEWS
View File

@ -2,6 +2,7 @@ dracut-011
==========
- use udev-168 features for shutting down udev
- introduce "--prefix" to put all initramfs files in /run/initramfs
- new shutdown script

dracut-010
==========

View File

@ -461,7 +461,7 @@ inst() {

[[ $hookdirs ]] || {
hookdirs="cmdline pre-udev pre-trigger netroot initqueue pre-mount"
hookdirs+=" pre-pivot mount emergency"
hookdirs+=" pre-pivot mount emergency emergency-shutdown shutdown"
export hookdirs
}


View File

@ -2,5 +2,6 @@

# i18n
i18n_vars="/etc/sysconfig/keyboard:KEYTABLE-KEYMAP /etc/sysconfig/i18n:SYSFONT-FONT,FONTACM-FONT_MAP,FONT_UNIMAP"
add_dracutmodules+=" rpmversion "
add_dracutmodules+=" rpmversion shutdown "
stdloglvl=3
prefix=/run/initramfs

View File

@ -0,0 +1,27 @@
#!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh

check() {
return 255
}

depends() {
echo base
return 0
}

install() {
local _d
dracut_install umount
dracut_install poweroff reboot halt
dracut_install -o kexec
inst "$moddir/shutdown" "$prefix/shutdown"
[ -e "${initdir}/lib" ] || mkdir -m 0755 -p ${initdir}/lib
mkdir -m 0755 -p ${initdir}/lib/dracut
mkdir -m 0755 -p ${initdir}/lib/dracut/hooks
for _d in $hookdirs shutdown shutdown-emergency; do
mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d
done
}

87
modules.d/99shutdown/shutdown Executable file
View File

@ -0,0 +1,87 @@
#!/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()
{
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 </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_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