aboutsummaryrefslogtreecommitdiff
path: root/rc.shutdown
blob: 02f5e8337167c1d3f518413b028facb09f1b7d9d (plain)
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
#!/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

status 'Saving random seed' /usr/lib/systemd/systemd-random-seed save

[[ $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
	# 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
	read_crypttab do_lock
fi

[[ $USELVM = [Yy][Ee][Ss] && -x $(type -P lvm) ]] &&
	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
		{ read kexec_loaded </sys/kernel/kexec_loaded; } 2>/dev/null
		if (( kexec_loaded )); then
			action="kexec"
		else
			action="reboot"
		fi
	fi

	# make /run/initramfs 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: