rc.shutdown 3.35 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
#!/bin/bash
#
# /etc/rc.shutdown
#

. /etc/rc.conf
. /etc/rc.d/functions

# avoid staircase effect
stty onlcr

echo " "
printhl "Initiating Shutdown..."
echo " "

run_hook shutdown_start

[[ -x /etc/rc.local.shutdown ]] && /etc/rc.local.shutdown

stop_all_daemons

stat_busy "Saving Random Seed"
	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
		(( POOL_SIZE /= 8 ))
	else
		POOL_SIZE=512
	fi
	dd if=/dev/urandom of=$RANDOM_SEED count=1 bs=$POOL_SIZE &>/dev/null
stat_done

[[ $TIMEZONE ]] && status "Configuring Time Zone" set_timezone "$TIMEZONE"

# Write to wtmp file before unmounting
halt -w

# stop monitoring of lvm2 groups before unmounting filesystems
[[ $USELVM = [Yy][Ee][Ss] && -x $(type -P lvm) ]] &&
	status "Deactivating monitoring of LVM2 groups" vgchange --monitor n

# any future uevents can and should be ignored
status "Shutting down UDev" udevadm control --exit

run_hook shutdown_prekillall

kill_all

run_hook shutdown_postkillall

run_hook shutdown_preumount

# unmount any non-api partitions that are backed by swap, we don't want to
# move their contents into memory (waste of time and might caues OOM).
status "Unmounting Swap-backed Filesystems" umount_all "tmpfs"

# almost everything is dead now, so the swap should hopefully be relatively
# empty, and quick to switch off
status "Deactivating Swap" swapoff -a

status "Unmounting Non-API Filesystems" umount_all

run_hook shutdown_postumount

# Kill non-root encrypted partition mappings
if [[ -f /etc/crypttab ]] && type -p cryptsetup >/dev/null; then
	stat_busy "Deactivating encrypted volumes:"
		# 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 cryptsetup remove "$1" &>/dev/null; then
				stat_append "ok "
			else
				stat_append "failed "
			fi
		}
		read_crypttab do_lock
	stat_done
fi

[[ $USELVM = [Yy][Ee][Ss] && -x $(type -P lvm) && -d /sys/block ]] &&
	status "Deactivating LVM2 groups" vgchange --sysinit -a n &>/dev/null

run_hook shutdown_poweroff

if [[ -x /run/initramfs/shutdown ]]; then

	# decide what we want to do
	if [[ $RUNLEVEL = 0 ]]; then
		action="poweroff"
	else
		action="reboot"
	fi

	# make /run/initrafs a mount
	mount --bind /run/initramfs /run/initramfs

	# 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

else

	status "Remounting Root Filesystem Read-only" \
		mount -o remount,ro /

	# 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
# vim: set ts=2 sw=2 noet: