summaryrefslogtreecommitdiff
path: root/rc.shutdown
diff options
context:
space:
mode:
Diffstat (limited to 'rc.shutdown')
-rwxr-xr-xrc.shutdown151
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