166 lines
3.5 KiB
Plaintext
166 lines
3.5 KiB
Plaintext
|
#!/sbin/runscript
|
||
|
# Copyright 1999-2013 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.4-r2,v 1.1 2013/09/21 11:35:53 jlec Exp $
|
||
|
|
||
|
depend() {
|
||
|
need localmount
|
||
|
}
|
||
|
|
||
|
image_path() {
|
||
|
local x= kver=$(uname -r) karch=$(uname -m)
|
||
|
BOOTPART="${BOOTPART:-/boot}"
|
||
|
KNAME="${KNAME:-bzImage}"
|
||
|
if [ -e "${KNAME}" ]; then
|
||
|
echo "${KNAME}"
|
||
|
return 0
|
||
|
fi
|
||
|
for x in "${KNAME#${BOOTPART}}" 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}"
|
||
|
INITRD="${INITRD:-initrd}"
|
||
|
if [ -e "${INITRD}" ]; then
|
||
|
echo "${INITRD}"
|
||
|
return 0
|
||
|
fi
|
||
|
for x in "${INITRD#${BOOTPART}}" \
|
||
|
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
|
||
|
}
|
||
|
|
||
|
mount_boot(){
|
||
|
local ret
|
||
|
|
||
|
[ -n "${DONT_MOUNT_BOOT}" ] && return 1
|
||
|
grep -q " ${BOOTPART:-/boot} " /proc/mounts && return 1
|
||
|
|
||
|
BOOTPART="${BOOTPART:-/boot}"
|
||
|
ebegin "Mounting ${BOOTPART}"
|
||
|
mount "${BOOTPART}"; ret=$?
|
||
|
eend ${ret}
|
||
|
return ${ret}
|
||
|
}
|
||
|
|
||
|
load_image() {
|
||
|
local ret
|
||
|
if [ "${KNAME}" = "-" ]; then
|
||
|
ebegin "Disabling kexec"
|
||
|
kexec -u; ret=$?
|
||
|
eend ${ret}
|
||
|
return ${ret}
|
||
|
fi
|
||
|
|
||
|
BOOTPART="${BOOTPART:-/boot}"
|
||
|
local img= initrd="$(initrd_path)" mounted=false initrdopt=
|
||
|
|
||
|
if ! img="$(image_path)"; then
|
||
|
if mount_boot; then
|
||
|
if img="$(image_path)"; then
|
||
|
mounted=true
|
||
|
initrd="$(initrd_path)"
|
||
|
else
|
||
|
eerror "No kernel image found in ${BOOTPART}!"
|
||
|
umount "${BOOTPART}"
|
||
|
return 1
|
||
|
fi
|
||
|
else
|
||
|
eerror "No kernel image found in ${BOOTPART}!"
|
||
|
return 1
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
if [ -n "${INITRD}" ] && \
|
||
|
! [ "${BOOTPART}/${INITRD#${BOOTPART}}" = "${initrd}" ]; then
|
||
|
eerror "Requested initrd: ${INITRD#${BOOTPART}}"
|
||
|
eerror "could not be found"
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
[ -n "${ROOTPART}" ] || \
|
||
|
ROOTPART="$(readlink -f "$(sed -n '/^\/[^ ]* \/ / s,^\([^ ]*\).*,\1,p' /proc/mounts)")"
|
||
|
|
||
|
[ -n "${KPARAM}" ] || KEXEC_OPT_ARGS="${KEXEC_OPT_ARGS} --reuse-cmdline"
|
||
|
|
||
|
[ -n "${initrd}" ] && [ -e "${initrd}" ] && initrdopt="--initrd=${initrd}"
|
||
|
|
||
|
local msg=
|
||
|
[ -n "${initrd}" ] && \
|
||
|
msg="with ${initrd}"
|
||
|
einfo "Using kernel image ${img} ${msg} for kexec"
|
||
|
|
||
|
ebegin "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
|
||
|
local ret=0
|
||
|
BOOTPART="${BOOTPART:-/boot}"
|
||
|
if mount_boot; then
|
||
|
mounted=true
|
||
|
fi
|
||
|
if ! image_path > /dev/null; then
|
||
|
ewarn "Cannot find kernel image!"
|
||
|
ewarn "Please make sure a valid kernel image is present before reboot."
|
||
|
return 0
|
||
|
fi
|
||
|
if [ -n "${mounted}" ]; then
|
||
|
ebegin "Unmounting ${BOOTPART}"
|
||
|
umount "${BOOTPART}"; ret=$?
|
||
|
eend ${ret}
|
||
|
fi
|
||
|
return ${ret}
|
||
|
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 $?
|
||
|
}
|