summaryrefslogtreecommitdiff
blob: 6ae811291133e802a5eed52639d427726680d748 (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
#!/sbin/runscript
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-apps/kexec-tools/files/kexec.init-2.0.3,v 1.1 2012/03/18 07:46:02 jlec Exp $

depend() {
	need localmount
}

image_path() {
	local x= kver=$(uname -r) karch=$(uname -m)
	BOOTPART="${BOOTPART:-/boot}"
	for x in "${KNAME:-bzImage}" vmlinuz \
		bzImage-${kver} vmlinuz-${kver} \
		kernel-genkernel-${karch}-${kver} \
		kernel-${kver} kernel-${karch}; do
		if [[ -e "${BOOTPART}/${x}" ]] ; then
			echo "${BOOTPART}/${x}"
			return 0
		fi
	done

	return 1
}

initrd_path() {
	local x= kver=$(uname -r) karch=$(uname -m)
	BOOTPART="${BOOTPART:-/boot}"
	for x in "${INITRD:-initrd}" \
		initrd.img-${kver} initrd-${kver}.img \
		initrd-${kver} initramfs-${kver}.img \
		initramfs-genkernel-${karch}-${kver} ; do
		if [[ -e "${BOOTPART}/${x}" ]] ; then
			echo "${BOOTPART}/${x}"
			return 0
		fi
	done

	return 1
}

load_image() {
	if [[ "${KNAME}" = "-" ]]; then
		ebegin "Disabling kexec"
		kexec -u
		eend $?
		return $?
	fi

	BOOTPART="${BOOTPART:-/boot}"
	local img="$(image_path)" initrd="$(initrd_path)" mounted=false initrdopt=

	if [[ -z "${img}" ]] || [[ -z "${initrd}" ]]; then
		# If we cannot find our image, try mounting ${BOOTPART}
		if ! grep -q " ${BOOTPART} " /proc/mounts; then
			ebegin "Mounting ${BOOTPART}"
			mount "${BOOTPART}" && mounted=true
			eend $? || return $?
			img="$(image_path)"
			initrd="$(initrd_path)"
		fi
	fi

	if [[ -z "${img}" ]]; then
		eerror "No kernel image found in ${BOOTPART}!"
		${mounted} && umount "${BOOTPART}"
		return 1
	else
		ebegin "Loading kernel image ${img} for kexec"
	fi

	[[ -n "${ROOTPART}" ]] || \
		ROOTPART="$(readlink -f "$(sed -n '/^\/[^ ]* \/ / s,^\([^ ]*\).*,\1,p' /proc/mounts)")"

	[[ -n "${KPARAM}" ]] || KEXEC_OPT_ARGS+=" --reuse-cmdline"

	[[ -n "${initrd}" ]] && [[ -e "${initrd}" ]] && initrdopt="--initrd=${initrd}"

	einfo "   Setting kexec with ${KEXEC_OPT_ARGS} -l ${img} root=${ROOTPART} ${KPARAM} ${initrdopt}"
	kexec ${KEXEC_OPT_ARGS} -l "${img}" --append="root=${ROOTPART} ${KPARAM}" ${initrdopt}
	local res=$?

	${mounted} && umount "${BOOTPART}"
	eend ${res}
	return ${res}
}

start() {
	if [[ "${LOAD_DURING_SHUTDOWN:-yes}" = "yes" ]]; then
		image_path > /dev/null || \
			ewarn "Cannot find kernel image. Please make sure a valid kernel image is present before reboot."
		return 0
	else
		ebegin "Configuring kexec"
		load_image
		eend $?
	fi
}

stop() {
	[[ "${LOAD_DURING_SHUTDOWN:-yes}" != "yes" ]] && return 0

	if ! yesno $RC_REBOOT; then
		einfo "Not rebooting, so disabling"
		kexec -u
		return 0
	fi

	if [[ -f /nokexec ]]; then
		einfo "Not using kexec during reboot"
		rm -f /nokexec
		kexec -u
		return 0
	fi

	ebegin "Configuring kexec"
	load_image
	eend $?
}