diff options
Diffstat (limited to 'rc.shutdown')
-rwxr-xr-x | rc.shutdown | 151 |
1 files changed, 91 insertions, 60 deletions
diff --git a/rc.shutdown b/rc.shutdown index a040bbe..db8f50b 100755 --- a/rc.shutdown +++ b/rc.shutdown @@ -6,10 +6,6 @@ . /etc/rc.conf . /etc/rc.d/functions -export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - -run_hook shutdown_start - # avoid staircase effect stty onlcr @@ -17,29 +13,33 @@ echo " " printhl "Initiating Shutdown..." echo " " +run_hook shutdown_start + [[ -x /etc/rc.local.shutdown ]] && /etc/rc.local.shutdown -kill_everything shutdown +stop_all_daemons + +run_hook shutdown_prekillall + +kill_all + +run_hook shutdown_postkillall stat_busy "Saving Random Seed" -RANDOM_SEED=/var/lib/misc/random-seed -[[ -d ${RANDOM_SEED%/*} ]] || mkdir -p ${RANDOM_SEED%/*} -: > $RANDOM_SEED -chmod 0600 $RANDOM_SEED -POOL_FILE=/proc/sys/kernel/random/poolsize -if [[ -r $POOL_FILE ]]; then - read POOL_SIZE <$POOL_FILE -else - POOL_SIZE=512 -fi -dd if=/dev/urandom of=$RANDOM_SEED count=1 bs=$POOL_SIZE &> /dev/null + RANDOM_SEED=/var/lib/misc/random-seed + install -TDm 0600 /dev/null $RANDOM_SEED + POOL_FILE=/proc/sys/kernel/random/poolsize + if [[ -r $POOL_FILE ]]; then + read POOL_SIZE < $POOL_FILE + else + POOL_SIZE=512 + fi + dd if=/dev/urandom of=$RANDOM_SEED count=1 bs=$POOL_SIZE &>/dev/null stat_done -if [[ $TIMEZONE && -e /usr/share/zoneinfo/$TIMEZONE ]]; then - rm -f /etc/localtime +[[ $TIMEZONE ]] && status "Saving Time Zone" \ - cp "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime -fi + cp --remove-destination "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime # Write to wtmp file before unmounting halt -w @@ -47,58 +47,89 @@ halt -w status "Deactivating Swap" swapoff -a # stop monitoring of lvm2 groups before unmounting filesystems -if [[ $USELVM =~ yes|YES && -x $(type -P lvm) && -d /sys/block ]]; then +[[ $USELVM = [Yy][Ee][Ss] && -x $(type -P lvm) && -d /sys/block ]] && status "Deactivating monitoring of LVM2 groups" \ - vgchange --monitor n >/dev/null 2>&1 -fi + vgchange --monitor n &>/dev/null -stat_busy "Unmounting Filesystems" -if grep -q devtmpfs /proc/filesystems &>/dev/null; then - umount -a -r -t nosysfs,noproc,nodevtmpfs,nodevpts -O no_netdev -else - # if we don't have devtmpfs support, /dev is mounted as tmpfs, so don't unmount it - umount -a -r -t notmpfs,nosysfs,noproc,nodevpts -O no_netdev -fi -stat_done +# if we don't have devtmpfs support, /dev is mounted as tmpfs, so don't unmount it +status "Unmounting Filesystems" \ + umount -a -r -t nodevtmpfs,notmpfs,nosysfs,noproc,nodevpts -O no_netdev + +run_hook shutdown_postumount # Kill non-root encrypted partition mappings -if [[ -f /etc/crypttab && -n $CS ]] && grep -q ^[^#] /etc/crypttab; then +if [[ -f /etc/crypttab && $CS ]] && grep -q ^[^#] /etc/crypttab; then stat_busy "Deactivating encrypted volumes:" - # Maybe someone has LVM on an encrypted block device - # executing an extra vgchange is errorless - if [[ $USELVM =~ yes|YES ]]; then - vgchange --sysinit -a n >/dev/null 2>&1 - fi - do_lock() { - stat_append "${1}.." - if $CS remove "$1" >/dev/null 2>&1; then - stat_append "ok " - else - stat_append "failed " - fi - } - read_crypttab do_lock + # Maybe someone has LVM on an encrypted block device + # executing an extra vgchange is errorless + [[ $USELVM = [Yy][Ee][Ss] ]] && vgchange --sysinit -a n &>/dev/null + do_lock() { + stat_append "${1}.." + if $CS remove "$1" &>/dev/null; then + stat_append "ok " + else + stat_append "failed " + fi + } + read_crypttab do_lock stat_done fi -if [[ $USELVM =~ yes|YES && -x $(type -P lvm) && -d /sys/block ]]; then - status "Deactivating LVM2 groups" vgchange --sysinit -a n >/dev/null 2>&1 -fi +[[ $USELVM = [Yy][Ee][Ss] && -x $(type -P lvm) && -d /sys/block ]] && + status "Deactivating LVM2 groups" vgchange --sysinit -a n &>/dev/null + +if [[ -x /run/initramfs/shutdown ]]; then + + # decide what we want to do + if [[ $RUNLEVEL = 0 ]]; then + action="poweroff" + else + action="reboot" + fi -status "Remounting Root Filesystem Read-only" mount -n -o remount,ro / + # make /run/initrafs a mount + mount --bind /run/initramfs /run/initramfs -run_hook shutdown_poweroff + # in case someone has shared our mountpoints, unshare them + mount --make-private /run/initramfs + mount --make-private / + + # bind all api mounts + mkdir -p /run/initramfs/{sys,proc,dev,run,oldroot} + mount --bind /sys /run/initramfs/sys + mount --bind /proc /run/initramfs/proc + mount --bind /dev /run/initramfs/dev + mount --bind /run /run/initramfs/run + + # enter shutdownramfs + cd /run/initramfs + pivot_root . oldroot + + #reexec init + /oldroot/sbin/init u + + # run /shutdown in the new root + exec chroot . /shutdown $action </dev/console >/dev/console 2>&1 -# Power off or reboot -printsep -if [[ $RUNLEVEL = 0 ]]; then - printhl "${C_H2}POWER OFF" - poweroff -d -f -h -i else - printhl "${C_H2}REBOOTING" - # if kexec is installed and a kernel is loaded, use it - [[ -x $(type -P kexec) ]] && kexec -e > /dev/null 2>&1 - reboot -d -f -i + + status "Remounting Root Filesystem Read-only" \ + mount -n -o remount,ro / + + run_hook shutdown_poweroff + + # Power off or reboot + printsep + if [[ $RUNLEVEL = 0 ]]; then + printhl "${C_H2}POWER OFF" + poweroff -d -f -h -i + else + printhl "${C_H2}REBOOTING" + # if kexec is installed and a kernel is loaded, use it + [[ -x $(type -P kexec) ]] && kexec -e &>/dev/null + reboot -d -f -i + fi + fi # End of file |