Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.4
pm-utils.import5806
pm-utils-1.3.0-suse-grub.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File pm-utils-1.3.0-suse-grub.patch of Package pm-utils.import5806
Index: pm-utils-1.3.0/pm/sleep.d/01grub =================================================================== --- pm-utils-1.3.0.orig/pm/sleep.d/01grub 2010-03-30 13:01:02.069674802 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -#!/bin/sh -# Ensure grub will load the correct kernel on resume from hibernate, -# TODO: This is rather redhat specific, and very grub specific. - -default_resume_kernel() -{ - [ "$1" = "suspend" ] && return $NA - case $(uname -m) in - i?86|x86_64|athlon) - ;; - *) # this is only valid for x86 and x86_64 - return $NA - ;; - esac - - [ -x /sbin/grubby -a -x /sbin/grub ] || return $NA - [ -e "/boot/vmlinuz-$(uname -r)" ] || return 1 - out=$(/sbin/grubby --info /boot/vmlinuz-$(uname -r) |grep index) - [ -n "${out}" ] || return 1 - current=${out#index=} - echo "savedefault --default=${current} --once" | \ - /sbin/grub --device-map=/boot/grub/device.map \ - --batch --no-floppy --no-curses >/dev/null - - return 0 -} - -case "$1" in - hibernate|suspend) - default_resume_kernel $2 - ;; - *) exit $NA - ;; -esac Index: pm-utils-1.3.0/pm/sleep.d/99Zgrub =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ pm-utils-1.3.0/pm/sleep.d/99Zgrub 2010-03-30 13:01:16.839798542 +0200 @@ -0,0 +1,193 @@ +#!/bin/bash +# +# Stefan Seyfried, SUSE Linux Products GmbH 2006, GPL v2 +# mostly taken from the powersave project. + +GRUBONCE="/usr/sbin/grubonce" +GRUBDEFAULT="/boot/grub/default" +GRUBDEFSAVE="/var/run/suspend.grubonce.default" + +##################################################################### +# gets a list of available kernels from /boot/grub/menu.lst +# kernels are in the array $KERNELS, output to stdout to be eval-ed. +getkernels() +{ + # DEBUG "Running getkernels()" INFO + local MENU_LST="/boot/grub/menu.lst" + local I DUMMY MNT ROOTDEV + declare -i I=0 J=-1 + + # we need the root partition later to decide if this is the kernel to select + while read ROOTDEV MNT DUMMY; do + [ "$ROOTDEV" = "rootfs" ] && continue # not what we are searching for + if [ "$MNT" = "/" ]; then + break + fi + done < /proc/mounts + + # build an array KERNELS with all the kernels in /boot/grub/menu.lst + # the array MENU_ENTRIES contains the corresponding menu entry numbers + # DEFAULT_BOOT contains the default entry. + while read LINE; do + case $LINE in + title*) + let J++ # increase for every menu entry, even for non-linux + # DEBUG "Found grub menu entry #${J}: '${LINE}'" INFO + ;; + default*) + DUMMY=($LINE) # "default 0 #maybe a comment" + echo "DEFAULT_BOOT=${DUMMY[1]}" # ^^[0]^^ 1 ^^[2]^ 3 ^^[4]^^ + # DEBUG "Default boot entry is '${DUMMY[1]}'" INFO + ;; + kernel*noresume*) + # we probably found the "failsafe" kernel that won't resume... + echo " Skipping grub entry #${J}, because it has the noresume option" >&2 + ;; + kernel*root=*) + local ROOT + ROOT=${LINE#*root=} + DUMMY=($ROOT) + ROOT=${DUMMY[0]} + if [ "$(stat -Lc '%t:%T' $ROOT)" != "$(stat -Lc '%t:%T' $ROOTDEV)" ]; then + echo " Skipping grub entry #${J}, because its root= parameter ($ROOT)" >&2 + echo " does not match the current root device ($ROOTDEV)." >&2 + continue + fi + DUMMY=($LINE) # kernel (hd0,1)/boot/vmlinuz-ABC root=/dev/hda2 + echo "KERNELS[$I]='${DUMMY[1]##*/}'" # vmlinuz-ABC + echo "MENU_ENTRIES[$I]=$J" + # DEBUG "Found kernel entry #${I}: '${DUMMY[1]##*/}'" INFO + let I++ + ;; + kernel*) + # a kernel without "root="? We better skip that one... + echo " Skipping grub entry #${J}, because it has no root= option" >&2 + ;; + *) ;; + esac + done < $MENU_LST +} + +############################################################# +# runs grubonce from the grub package to select which kernel +# to boot on next startup +grub-once() +{ + if [ -x "$GRUBONCE" ]; then + rm -f "$GRUBDEFSAVE" + if [ -e "$GRUBDEFAULT" ]; then + echo " saving original $GRUBDEFAULT" + cp "$GRUBDEFAULT" "$GRUBDEFSAVE" + fi + echo " running '$GRUBONCE $1'" + $GRUBONCE $1 + else + echo "WARNING: $GRUBONCE not found, not preparing bootloader" + fi +} + +############################################################# +# restore grub default after (eventually failed) resume +grub-once-restore() +{ + echo "INFO: running grub-once-restore" + rm -f "$GRUBDEFAULT" + if [ -e "$GRUBDEFSAVE" ]; then + echo " restoring original $GRUBDEFAULT" + mv "$GRUBDEFSAVE" "$GRUBDEFAULT" + fi +} + +############################################################################# +# try to find a kernel image that matches the actually running kernel. +# We need this, if more than one kernel is installed. This works reasonably +# well with grub, if all kernels are named "vmlinuz-`uname -r`" and are +# located in /boot. If they are not, good luck ;-) +find-kernel-entry() +{ + NEXT_BOOT=-1 + ARCH=`uname -m` + declare -i I=0 + # DEBUG "running kernel: $RUNNING" DIAG + while [ -n "${KERNELS[$I]}" ]; do + BOOTING="${KERNELS[$I]}" + if IMAGE=`readlink /boot/$BOOTING` && [ -e "/boot/${IMAGE##*/}" ]; then + # DEBUG "Found kernel symlink $BOOTING => $IMAGE" INFO + BOOTING=$IMAGE + fi + case $ARCH in + ppc*) BOOTING="${BOOTING#*vmlinux-}" ;; + *) BOOTING="${BOOTING#*vmlinuz-}" ;; + esac + if [ "$RUNNING" == "$BOOTING" ]; then + NEXT_BOOT=${MENU_ENTRIES[$I]} + echo " running kernel is grub menu entry $NEXT_BOOT (${KERNELS[$I]})" + break + fi + let I++ + done + # if we have not found a kernel, issue a warning. + # if we have found a kernel, we'll do "grub-once" later, after + # prepare_suspend finished. + if [ $NEXT_BOOT -eq -1 ]; then + echo "WARNING: no kernelfile matching the running kernel found" + fi +} + +############################################################################# +# if we did not find a kernel (or BOOT_LOADER is not GRUB) check, +# if the running kernel is still the one that will (probably) be booted for +# resume (default entry in menu.lst or, if there is none, the kernel file +# /boot/vmlinuz points to.) +# This will only work, if you use "original" SUSE kernels. +# you can always override with the config variable set to "yes" +prepare-grub() +{ + echo "INFO: running prepare-grub" + eval `getkernels` + RUNNING=`uname -r` + find-kernel-entry + + RET=0 + + if [ $NEXT_BOOT -eq -1 ]; then + # which kernel is booted with the default entry? + BOOTING="${KERNELS[$DEFAULT_BOOT]}" + # if there is no default entry (no menu.lst?) we fall back to + # the default of /boot/vmlinuz. + [ -z "$BOOTING" ] && BOOTING="vmlinuz" + if IMAGE=`readlink /boot/$BOOTING` && [ -e "/boot/${IMAGE##*/}" ]; then + BOOTING=$IMAGE + fi + BOOTING="${BOOTING#*vmlinuz-}" + echo "running kernel: '$RUNNING', probably booting kernel: '$BOOTING'" + if [ "$BOOTING" != "$RUNNING" ]; then + echo "ERROR: kernel version mismatch, cannot suspend to disk" + echo "running: $RUNNING booting: $BOOTING" >> $INHIBIT + RET=1 + fi + else + # set the bootloader to the running kernel + echo " preparing boot-loader: selecting entry $NEXT_BOOT, kernel /boot/$BOOTING" + T1=`date +"%s%N"` + sync; sync; sync # this is needed to speed up grub-once on reiserfs + T2=`date +"%s%N"` + echo " grub-once: `grub-once $NEXT_BOOT`" + T3=`date +"%s%N"` + S=$(((T2-T1)/100000000)); S="$((S/10)).${S:0-1}" + G=$(((T3-T2)/100000000)); G="$((G/10)).${G:0-1}" + echo " time needed for sync: $S seconds, time needed for grub: $G seconds." + fi + + return $RET +} + + +###### main() + +if [ "$1" = hibernate ] || [ "$1" = suspend -a "$2" = suspend_hybrid ]; then + prepare-grub +fi +if [ "$1" = thaw ] || [ "$1" = resume -a "$2" = suspend_hybrid ]; then + grub-once-restore +fi Index: pm-utils-1.3.0/pm/sleep.d/Makefile.am =================================================================== --- pm-utils-1.3.0.orig/pm/sleep.d/Makefile.am 2010-03-30 13:01:02.069674802 +0200 +++ pm-utils-1.3.0/pm/sleep.d/Makefile.am 2010-03-30 13:01:16.839798542 +0200 @@ -3,7 +3,7 @@ sleep_SCRIPTS = \ 00logging \ 00powersave \ - 01grub \ + 99Zgrub \ 49bluetooth \ 55NetworkManager \ 75modules \ Index: pm-utils-1.3.0/pm/sleep.d/Makefile.in =================================================================== --- pm-utils-1.3.0.orig/pm/sleep.d/Makefile.in 2010-03-30 13:01:02.069674802 +0200 +++ pm-utils-1.3.0/pm/sleep.d/Makefile.in 2010-03-30 13:01:16.904797911 +0200 @@ -161,7 +161,7 @@ sleep_SCRIPTS = \ 00logging \ 00powersave \ - 01grub \ + 99Zgrub \ 49bluetooth \ 55NetworkManager \ 75modules \
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor