[memtest86+] Added support for grub2, thanks to Michal Ambroz <rebus at seznam.cz>

Jaroslav Škarvada jskarvad at fedoraproject.org
Mon Dec 5 14:20:11 UTC 2011


commit e7f3321cff1ed30d41cac1fdeca4665478385070
Author: Jaroslav Škarvada <jskarvad at redhat.com>
Date:   Mon Dec 5 15:19:53 2011 +0100

    Added support for grub2, thanks to Michal Ambroz <rebus at seznam.cz>

 20_memtest      |  119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 memtest-setup   |   66 ++++++++++++++++++++++---------
 memtest86+.spec |   23 +++++++++--
 3 files changed, 185 insertions(+), 23 deletions(-)
---
diff --git a/20_memtest b/20_memtest
new file mode 100644
index 0000000..9481ff1
--- /dev/null
+++ b/20_memtest
@@ -0,0 +1,119 @@
+#! /bin/sh
+set -e
+
+# grub-mkconfig helper script.
+# Copyright (C) 2011  Michal Ambroz <rebus at seznam.cz>
+#
+# you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with the script.  If not, see <http://www.gnu.org/licenses/>.
+
+prefix=/usr
+exec_prefix=/usr
+bindir=/usr/bin
+libdir=/usr/lib
+. ${libdir}/grub/grub-mkconfig_lib
+
+export TEXTDOMAIN=grub
+export TEXTDOMAINDIR=${prefix}/share/locale
+
+CLASS=""
+
+if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
+  OS=Memtest
+else
+  OS="${GRUB_DISTRIBUTOR} Memtest"
+fi
+
+# loop-AES arranges things so that /dev/loop/X can be our root device, but
+# the initrds that Linux uses don't like that.
+case ${GRUB_DEVICE} in
+  /dev/loop/*|/dev/loop[0-9])
+    GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
+  ;;
+esac
+
+if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
+    || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \
+    || uses_abstraction "${GRUB_DEVICE}" lvm; then
+  LINUX_ROOT_DEVICE=${GRUB_DEVICE}
+else
+  LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
+fi
+
+if [ "x`${grub_probe} --device ${GRUB_DEVICE} --target=fs 2>/dev/null || true`" = xbtrfs ]; then
+  rootsubvol="`make_system_path_relative_to_its_root /`"
+  rootsubvol="${rootsubvol#/}"
+  if [ "x${rootsubvol}" != x ]; then
+    GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
+  fi
+fi
+
+memtest_entry ()
+{
+  os="$1"
+  version="$2"
+  recovery="$3"
+  args="$4"
+  title="$(gettext_quoted "%s %s")"
+  printf "menuentry '${title}' {\n" "${os}" "${version}"
+
+
+  if [ x$dirname = x/ ]; then
+    if [ -z "${prepare_root_cache}" ]; then
+      prepare_root_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | sed -e "s/^/\t/")"
+    fi
+    printf '%s\n' "${prepare_root_cache}"
+  else
+    if [ -z "${prepare_boot_cache}" ]; then
+      prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")"
+    fi
+    printf '%s\n' "${prepare_boot_cache}"
+  fi
+  message="$(gettext_printf "Loading %s %s ..." ${os} ${version})"
+  cat << EOF
+	echo	'$message'
+	linux16	${rel_dirname}/${basename}
+}
+EOF
+}
+
+case x`uname -m` in
+    xi?86 | xx86_64)
+	list=`for i in /boot/memtest* ; do
+                  if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
+              done` ;;
+    *) 
+	list=`for i in /boot/memtest* ; do
+                  if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
+	     done` ;;
+esac
+
+prepare_boot_cache=
+prepare_root_cache=
+
+while [ "x$list" != "x" ] ; do
+  linux=`version_find_latest $list`
+  echo "Found memtest image: $linux" >&2
+  basename=`basename $linux`
+  dirname=`dirname $linux`
+  rel_dirname=`make_system_path_relative_to_its_root $dirname`
+  version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
+  alt_version=`echo $version | sed -e "s,\.old$,,g"`
+  linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
+
+
+  memtest_entry "${OS}" "${version}" false \
+      "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
+
+  list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
+done
diff --git a/memtest-setup b/memtest-setup
index b308d2f..91c3b24 100755
--- a/memtest-setup
+++ b/memtest-setup
@@ -6,34 +6,62 @@ PNAME="memtest86+"
 # executable
 ENAME="elf-memtest86+"
 
+# grub2 template
+G2TEMPL="20_memtest"
+
 if [ -d /sys/firmware/efi ]; then
     echo "memtest86+ does not support EFI platforms."
     exit 254
 fi
 
-MTVERSION=`rpm -q --qf '%{version}' $PNAME`
-MTPATH="/boot/$ENAME-$MTVERSION"
+if [ -f /boot/grub2/grub.cfg ]; then
+    echo "grub2 detected, installing template..."
+    if [ ! -d /etc/grub.d ]; then
+        echo "ERROR: unable to find /etc/grub.d"
+        exit 253
+    fi
+    if [ -x  /etc/grub.d/$G2TEMPL ]; then
+        echo "grub2 template is already installed. Exiting..."
+        exit 252
+    fi
+    if [ -f /etc/grub.d/$G2TEMPL ]; then
+        echo "grub2 template is already in place, only enabling..."
+    else
+        if [ ! -r /usr/share/memtest86+/$G2TEMPL ]; then
+            echo "ERROR: unable to find grub2 template."
+            exit 251
+        fi
+        cp /usr/share/memtest86+/$G2TEMPL /etc/grub.d
+    fi
+    chmod a+x /etc/grub.d/$G2TEMPL
+    echo "grub 2 template installed."
+    echo "Do not forget to regenerate your grub.cfg by:"
+    echo "  # grub2-mkconfig -o /boot/grub2/grub.cfg"
+else
+    MTVERSION=`rpm -q --qf '%{version}' $PNAME`
+    MTPATH="/boot/$ENAME-$MTVERSION"
 
-MENT=`cat /boot/grub/grub.conf | grep "$ENAME-$MTVERSION"` &> /dev/null
-if [ "$MENT" != "" ]; then
-    echo "$MTPATH is already configured.  Exiting..."
-    exit 0
-fi
+    MENT=`cat /boot/grub/grub.conf | grep "$ENAME-$MTVERSION"` &> /dev/null
+    if [ "$MENT" != "" ]; then
+        echo "$MTPATH is already configured. Exiting..."
+        exit 0
+    fi
 
-if [ ! -f $MTPATH ]; then
-    echo "ERROR: $MTPATH does not exist."
-    exit 255
-fi
+    if [ ! -f $MTPATH ]; then
+        echo "ERROR: $MTPATH does not exist."
+        exit 255
+    fi
 
-/sbin/new-memtest-pkg --install $MTVERSION --banner="Memtest86+"
-RETVAL="$?"
+    /sbin/new-memtest-pkg --install $MTVERSION --banner="Memtest86+"
+    RETVAL="$?"
 
-if [ "$RETVAL" != "0" ]; then
-    echo "ERROR: grubby failed to configure your bootloader for $MTPATH."
-    exit $RETVAL
-else
-    sed -i -e"s,kernel \(/boot\)\?/$ENAME,kernel --type=netbsd \1/$ENAME," /boot/grub/grub.conf
-    sed -i -e"s,/$ENAME-$MTVERSION.*,/$ENAME-$MTVERSION," /boot/grub/grub.conf
+    if [ "$RETVAL" != "0" ]; then
+        echo "ERROR: grubby failed to configure your bootloader for $MTPATH."
+        exit $RETVAL
+    else
+        sed -i -e"s,kernel \(/boot\)\?/$ENAME,kernel --type=netbsd \1/$ENAME," /boot/grub/grub.conf
+        sed -i -e"s,/$ENAME-$MTVERSION.*,/$ENAME-$MTVERSION," /boot/grub/grub.conf
+    fi
 fi
 
 echo "Setup complete."
diff --git a/memtest86+.spec b/memtest86+.spec
index 7b42aaa..c522b4e 100644
--- a/memtest86+.spec
+++ b/memtest86+.spec
@@ -7,13 +7,14 @@
 
 Name:     memtest86+
 Version:  4.20
-Release:  1%{?dist}
+Release:  2%{?dist}
 License:  GPLv2
 Summary:  Stand-alone memory tester for x86 and x86-64 computers
 Group:    System Environment/Base
 Source0:  http://www.memtest.org/download/%{version}/%{name}-%{version}.tar.gz
 Source1:  memtest-setup
 Source2:  new-memtest-pkg
+Source3:  20_memtest
 URL:      http://www.memtest.org
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 # require glibc-devel.i386 via this file:
@@ -65,13 +66,22 @@ install -m755 %{SOURCE2} %{buildroot}/sbin/new-memtest-pkg
 install -m755 %{SOURCE1} %{buildroot}%{_sbindir}/memtest-setup
 sed -i 's/\r//' $RPM_BUILD_DIR/%{name}-%{version}/README
 
+mkdir -p %{buildroot}%{_sysconfdir}/boot.d
+touch %{buildroot}%{_sysconfdir}/boot.d/20_memtest
+
+install -Dd %{buildroot}%{_datadir}/%{name}
+install -m644 %{SOURCE3} %{buildroot}%{_datadir}/%{name}
+
 %if %{with update_grub}
 %post -p /usr/sbin/memtest-setup
 %endif
 
 %preun
-sed -i -e's,kernel --type=netbsd /elf-%{name}-%{version},kernel /elf-%{name}-%{version},' /boot/grub/grub.conf
-/sbin/new-memtest-pkg --remove %{version}
+if [ -f /boot/grub/grub.conf ]
+then
+  sed -i -e's,kernel --type=netbsd /elf-%{name}-%{version},kernel /elf-%{name}-%{version},' /boot/grub/grub.conf
+  /sbin/new-memtest-pkg --remove %{version}
+fi
 
 %clean
 rm -rf %{buildroot}
@@ -82,10 +92,15 @@ rm -rf %{buildroot}
 /boot/%{name}-%{version}
 /boot/elf-%{name}-%{version}
 /sbin/new-memtest-pkg
+%dir %{_datadir}/%{name}
+%{_datadir}/%{name}/20_memtest
+%ghost %attr(0755,-,-) %{_sysconfdir}/boot.d/20_memtest
 %{_sbindir}/memtest-setup
 
-
 %changelog
+* Mon Dec  5 2011 Jaroslav Škarvada <jskarvad at redhat.com> - 4.20-2
+- Added support for grub2, thanks to Michal Ambroz <rebus at seznam.cz>
+
 * Mon Mar 07 2011 Jaroslav Škarvada <jskarvad at redhat.com> - 4.20-1
 - Update to new version (#682425)
 - Removed fix-asciimap patch (not needed now)


More information about the scm-commits mailing list