blob: 5415b3bc85c0a8ea7b56fc533a2fb91ca6a88529 [file] [log] [blame]
#!/sbin/openrc-run
# Copyright 1999-2017 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# Set up some defaults.
: "${LOAD_DURING_SHUTDOWN:=yes}"
: "${BOOTPART:=/boot}"
: "${DONT_MOUNT_BOOT:=no}"
depend() {
need localmount
}
auto_prefix_bootpath() {
# Only auto-add prefix to relative paths.
case $1 in
*/*) echo "$1";;
*) echo "${BOOTPART}/$1" ;;
esac
}
get_genkernel_arch() {
case $1 in
x86_64) echo "amd64" ;;
i[3456]86) echo "x86" ;;
*) echo "$1" ;;
esac
}
image_path() {
# Do no sanity checking if the user has set a value.
if [ -n "${KNAME}" ]; then
auto_prefix_bootpath "${KNAME}"
return
fi
local x kver="$(uname -r)" karch="$(uname -m)"
local gkarch="$(get_genkernel_arch $karch)"
for x in \
"bzImage" \
"vmlinuz" \
"bzImage-${kver}" \
"vmlinuz-${kver}" \
"kernel-genkernel-${karch}-${kver}" \
"kernel-genkernel-${gkarch}-${kver}" \
"kernel-${kver}" \
"kernel-${karch}"; do
if [ -e "${BOOTPART}/${x}" ]; then
echo "${BOOTPART}/${x}"
return
fi
done
return 1
}
initrd_path() {
# Do no sanity checking if the user has set a value.
if [ -n "${INITRD}" ]; then
auto_prefix_bootpath "${INITRD}"
return 0
fi
local x kver="$(uname -r)" karch="$(uname -m)"
local gkarch="$(get_genkernel_arch $karch)"
for x in \
"initrd" \
"initrd.img-${kver}" \
"initrd-${kver}.img" \
"initrd-${kver}" \
"initramfs-${kver}.img" \
"initramfs-genkernel-${karch}-${kver}" \
"initramfs-genkernel-${gkarch}-${kver}"; do
if [ -e "${BOOTPART}/${x}" ]; then
echo "${BOOTPART}/${x}"
return 0
fi
done
return 1
}
mount_boot() {
[ "${DONT_MOUNT_BOOT}" != "no" ] && return 1
mountinfo -q "${BOOTPART}" && return 1
ebegin "Mounting ${BOOTPART}"
mount "${BOOTPART}"
eend $?
}
load_image() {
if [ "${KNAME}" = "-" ]; then
ebegin "Disabling kexec"
kexec -u
eend $?
return # eend preserved $? for us.
fi
local img initrd="$(initrd_path)" mounted=false kparamopt 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 [ -z "${ROOTPART}" ]; then
ROOTPART="$(readlink -f "$(sed -n '/^\/[^ ]* \/ / s,^\([^ ]*\).*,\1,p' /proc/mounts)")"
fi
if [ -z "${KPARAM}" ]; then
kparamopt="--reuse-cmdline"
fi
if [ -n "${initrd}" ]; then
initrdopt="--initrd=${initrd}"
fi
local msg
[ -n "${initrd}" ] && \
msg=" (with ${initrd})"
ebegin "Using kernel image ${img}${msg} for kexec"
kexec ${KEXEC_OPT_ARGS} ${kparamopt} \
-l "${img}" --append="root=${ROOTPART} ${KPARAM}" ${initrdopt}
local ret=$?
${mounted} && umount "${BOOTPART}"
eend ${ret}
return ${ret}
}
start() {
if [ "${LOAD_DURING_SHUTDOWN}" = "yes" ]; then
local mounted
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}"
eend $?
fi
# $? is already set to the previous calls.
return
else
load_image
fi
}
stop() {
if ! yesno ${RC_REBOOT}; then
ebegin "Not rebooting; disabling kexec"
kexec -u
eend $?
return
fi
if [ -f /nokexec ]; then
ebegin "Rebooting; disabling kexec due to /nokexec"
rm -f /nokexec
kexec -u
eend $?
return
fi
if [ "${LOAD_DURING_SHUTDOWN}" = "yes" ]; then
load_image
fi
}