Hi, This patch has been used in Arch Linux's GRUB(2) package for quite some time (ever since the release of grub 2.00).
The main feature that distinguishes Arch Linux from other distros is that its kernel and initramfs (core/linux pkg) are always installed at /boot/vmlinuz-linux and /boot/initramfs-linux.img and this path does not contain the actual kernel version info and therefore does not change with kernel updates, unlike other distros. Also Arch Linux includes a secondary (fallback) initramfs image at /boot/initramfs-linux-fallback.img which contains modules, that are excluded by autodetect hook in the normal initramfs image at /boot/initramfs-linux.img . Thus if the user is unable to boot using /boot/initramfs-linux.img, he/she may be able to boot using /boot/initramfs-linux-fallback.img . Arch Linux and its derivatives use this kind of fallback initramfs setup. This patch also adds detection of this fallback initramfs image. I have attached the patch instead of sending this via git-send-mail, because 1) I haven't setup git-send-mail, and 2) Mail program seems to screw up the line indentation. With Best Regards, Keshav
From 009ecc71a0b397faed8fafb3c4d62e96d0d86a8a Mon Sep 17 00:00:00 2001 From: Keshav Padram Amburay <the.ridikulus....@gmail.com> Date: Wed, 6 Nov 2013 21:49:40 +0530 Subject: [PATCH] Add Arch Linux specific grub-mkconfig fixes Patch modified based on ideas from Felix aka fstirlitz, given at https://bugs.archlinux.org/task/37904?getfile=11257 --- util/grub-mkconfig.in | 2 ++ util/grub-mkconfig_lib.in | 3 +++ util/grub.d/00_header.in | 8 ++++++++ util/grub.d/10_linux.in | 27 ++++++++++++++++++++++++--- 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in index 3390ba9..c416489 100644 --- a/util/grub-mkconfig.in +++ b/util/grub-mkconfig.in @@ -218,6 +218,8 @@ export GRUB_DEFAULT \ GRUB_THEME \ GRUB_GFXPAYLOAD_LINUX \ GRUB_DISABLE_OS_PROBER \ + GRUB_COLOR_NORMAL \ + GRUB_COLOR_HIGHLIGHT \ GRUB_INIT_TUNE \ GRUB_SAVEDEFAULT \ GRUB_ENABLE_CRYPTODISK \ diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in index a9cf7fc..7eb8950 100644 --- a/util/grub-mkconfig_lib.in +++ b/util/grub-mkconfig_lib.in @@ -245,6 +245,9 @@ version_test_gt () *.old:*.old) ;; *.old:*) version_test_gt_a="`echo -n "$version_test_gt_a" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=gt ;; *:*.old) version_test_gt_b="`echo -n "$version_test_gt_b" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=ge ;; + *-lts:*-lts) ;; + *-lts:*) version_test_gt_a="`echo -n "$version_test_gt_a" | sed -e 's/-lts$//'`" ; version_test_gt_cmp=gt ;; + *:*-lts) version_test_gt_b="`echo -n "$version_test_gt_b" | sed -e 's/-lts$//'`" ; version_test_gt_cmp=ge ;; esac version_test_numeric "$version_test_gt_a" "$version_test_gt_cmp" "$version_test_gt_b" return "$?" diff --git a/util/grub.d/00_header.in b/util/grub.d/00_header.in index d2e7252..8259f45 100644 --- a/util/grub.d/00_header.in +++ b/util/grub.d/00_header.in @@ -125,6 +125,14 @@ cat <<EOF EOF +if [ x$GRUB_COLOR_NORMAL != x ] && [ x$GRUB_COLOR_HIGHLIGHT != x ] ; then + cat << EOF +set menu_color_normal=$GRUB_COLOR_NORMAL +set menu_color_highlight=$GRUB_COLOR_HIGHLIGHT + +EOF +fi + serial=0; gfxterm=0; for x in ${GRUB_TERMINAL_INPUT} ${GRUB_TERMINAL_OUTPUT}; do diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in index 00d1931..f403585 100644 --- a/util/grub.d/10_linux.in +++ b/util/grub.d/10_linux.in @@ -81,6 +81,8 @@ linux_entry () case $type in recovery) title="$(gettext_printf "%s, with Linux %s (recovery mode)" "${os}" "${version}")" ;; + fallback) + title="$(gettext_printf "%s, with Linux %s (fallback initramfs)" "${os}" "${version}")" ;; *) title="$(gettext_printf "%s, with Linux %s" "${os}" "${version}")" ;; esac @@ -94,7 +96,7 @@ linux_entry () else echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/" fi - if [ x$type != xrecovery ] ; then + if [ x$type != xrecovery ] && [ x$type != xfallback ] ; then save_default_entry | grub_add_tab fi @@ -126,7 +128,8 @@ linux_entry () fi printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/" fi - message="$(gettext_printf "Loading Linux %s ..." ${version})" + + message="$(gettext_printf "Loading Linux %s ..." "${version}")" sed "s/^/$submenu_indentation/" << EOF echo '$(echo "$message" | grub_quote)' linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args} @@ -185,6 +188,12 @@ while [ "x$list" != "x" ] ; do linux_root_device_thisversion="${LINUX_ROOT_DEVICE}" initrd= + + if echo "${basename}" | grep -q 'vmlinuz-linux' ; then + version="`echo "${basename}" | sed -e 's,vmlinuz-linux-,,g'` kernel" + initramfs_arch="`echo "${basename}" | sed -e 's,vmlinuz,initramfs,g'`" + fi + for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \ "initrd-${version}" "initramfs-${version}.img" \ "initrd.img-${alt_version}" "initrd-${alt_version}.img" \ @@ -192,7 +201,8 @@ while [ "x$list" != "x" ] ; do "initramfs-genkernel-${version}" \ "initramfs-genkernel-${alt_version}" \ "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \ - "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}"; do + "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}" \ + "${initramfs_arch}.img" ; do if test -e "${dirname}/${i}" ; then initrd="$i" break @@ -236,6 +246,17 @@ while [ "x$list" != "x" ] ; do linux_entry "${OS}" "${version}" advanced \ "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" + + for i in "${initramfs_arch}-fallback.img" "initramfs-${version}-fallback.img" ; do + if test -e "${dirname}/${i}" ; then + initrd="${i}" + gettext_printf "Found initrd fallback image: %s\n" "${dirname}/${initrd}" >&2 + linux_entry "${OS}" "${version}" fallback \ + "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" + break + fi + done + if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then linux_entry "${OS}" "${version}" recovery \ "single ${GRUB_CMDLINE_LINUX}" -- 1.8.5.1
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel