| #!/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 $? |
| } |