--- /dev/null
+#!/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
+}
+
--- /dev/null
+#!/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