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
|
#!/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 "Deactivating Swap" swapoff -a
# 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
run_hook shutdown_prekillall
kill_all
run_hook shutdown_postkillall
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
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
# 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 && $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
[[ $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
[[ $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
# 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 -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
# vim: set ts=2 sw=2 noet:
|