#! /bin/sh set -e # grub-mkconfig helper script. # Copyright (C) 2006,2007,2008,2009,2010 Free Software Foundation, Inc. # # GRUB is free software: 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. # # GRUB is 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 GRUB. If not, see <http://www.gnu.org/licenses/>. prefix=\"/usr\" exec_prefix=\"${prefix}\" datarootdir=\"${prefix}/share\" . \"${datarootdir}/grub/grub-mkconfig_lib\" export TEXTDOMAIN=grub export TEXTDOMAINDIR=\"${datarootdir}/locale\" CLASS=\"--class gnu-linux --class gnu --class os\" if [ \"x${GRUB_DISTRIBUTOR}\" = \"x\" ] ; then OS=GNU/Linux else OS=\"${GRUB_DISTRIBUTOR}\" CLASS=\"--class $(echo ${GRUB_DISTRIBUTOR} | tr \'A-Z\' \'a-z\' | cut -d\' \' -f1) ${CLASS}\" 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/\"` # We can\'t cope with devices loop-mounted from files here. case ${GRUB_DEVICE} in /dev/*) ;; *) exit 0 ;; esac ;; 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 ] \\ || [ \"x`stat -f --printf=%T /`\" = 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 for word in $GRUB_CMDLINE_LINUX_DEFAULT; do if [ \"$word\" = splash ]; then GRUB_CMDLINE_LINUX_DEFAULT=\"$GRUB_CMDLINE_LINUX_DEFAULT \\$vt_handoff\" fi done # add crashkernel option if we have the required tools if [ -x \"/usr/bin/makedumpfile\" ] && [ -x \"/sbin/kexec\" ]; then GRUB_CMDLINE_EXTRA=\"$GRUB_CMDLINE_EXTRA crashkernel=384M-2G:64M,2G-:128M\" fi linux_entry () { os=\"$1\" version=\"$2\" recovery=\"$3\" args=\"$4\" if ${recovery} ; then title=\"$(gettext_quoted \"%s, with Linux %s (recovery mode)\")\" else title=\"$(gettext_quoted \"%s, with Linux %s\")\" fi printf \"menuentry \'${title}\' ${CLASS} {\\n\" \"${os}\" \"${version}\" cat << EOF recordfail EOF if ! ${recovery} ; then save_default_entry | sed -e \"s/^/\\t/\" cat << EOF gfxmode \\$linux_gfx_mode EOF fi cat << EOF insmod gzio EOF 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 if [ \"x$5\" != \"xquiet\" ]; then message=\"$(gettext_printf \"Loading Linux %s ...\" ${version})\" cat << EOF echo \'$message\' EOF fi cat << EOF linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args} EOF if test -n \"${initrd}\" ; then if [ \"x$5\" != \"xquiet\" ]; then message=\"$(gettext_printf \"Loading initial ramdisk ...\")\" cat << EOF echo \'$message\' EOF fi cat << EOF initrd ${rel_dirname}/${initrd} EOF fi cat << EOF } EOF } case x`uname -m` in xi?86 | xx86_64) list=`for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do if grub_file_is_not_garbage \"$i\" ; then echo -n \"$i \" ; fi done` ;; *) list=`for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* ; do if grub_file_is_not_garbage \"$i\" ; then echo -n \"$i \" ; fi done` ;; esac prepare_boot_cache= prepare_root_cache= cat << \'EOF\' function gfxmode { set gfxpayload=\"$1\" if [ \"$1\" = \"keep\" ]; then set vt_handoff=vt.handoff=7 else set vt_handoff= fi } EOF # Use ELILO\'s generic \"efifb\" when it\'s known to be available. # FIXME: We need an interface to select vesafb in case efifb can\'t be used. if [ \"x$GRUB_GFXPAYLOAD_LINUX\" != x ]; then echo \"set linux_gfx_mode=$GRUB_GFXPAYLOAD_LINUX\" else cat << EOF if [ \\${recordfail} != 1 ]; then if [ -e \\${prefix}/gfxblacklist.txt ]; then if hwmatch \\${prefix}/gfxblacklist.txt 3; then if [ \\${match} = 0 ]; then set linux_gfx_mode=keep else set linux_gfx_mode=text fi else set linux_gfx_mode=text fi else set linux_gfx_mode=keep fi else set linux_gfx_mode=text fi EOF fi cat << EOF export linux_gfx_mode if [ \"\\$linux_gfx_mode\" != \"text\" ]; then load_video; fi EOF in_submenu=false while [ \"x$list\" != \"x\" ] ; do linux=`version_find_latest $list` echo \"Found linux 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}\" initrd= for i in \"initrd.img-${version}\" \"initrd-${version}.img\" \\ \"initrd-${version}\" \"initramfs-${version}.img\" \\ \"initrd.img-${alt_version}\" \"initrd-${alt_version}.img\" \\ \"initrd-${alt_version}\" \"initramfs-${alt_version}.img\" \\ \"initramfs-genkernel-${version}\" \\ \"initramfs-genkernel-${alt_version}\"; do if test -e \"${dirname}/${i}\" ; then initrd=\"$i\" break fi done config= for i in \"${dirname}/config-${version}\" \"${dirname}/config-${alt_version}\" \"/etc/kernels/kernel-config-${version}\" ; do if test -e \"${i}\" ; then config=\"${i}\" break fi done initramfs= if test -n \"${config}\" ; then initramfs=`grep CONFIG_INITRAMFS_SOURCE= \"${config}\" | cut -f2 -d= | tr -d \\\"` fi if test -n \"${initrd}\" ; then echo \"Found initrd image: ${dirname}/${initrd}\" >&2 elif test -z \"${initramfs}\" ; then # \"UUID=\" magic is parsed by initrd or initramfs. Since there\'s # no initrd or builtin initramfs, it can\'t work here. linux_root_device_thisversion=${GRUB_DEVICE} fi linux_entry \"${OS}\" \"${version}\" false \\ \"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_EXTRA} ${GRUB_CMDLINE_LINUX_DEFAULT}\" \\ quiet if [ \"x${GRUB_DISABLE_RECOVERY}\" != \"xtrue\" ]; then if [ -x /lib/recovery-mode/recovery-menu ]; then linux_entry \"${OS}\" \"${version}\" true \\ \"recovery nomodeset ${GRUB_CMDLINE_LINUX}\" else linux_entry \"${OS}\" \"${version}\" true \\ \"single nomodeset ${GRUB_CMDLINE_LINUX}\" fi fi list=`echo $list | tr \' \' \'\\n\' | grep -vx $linux | tr \'\\n\' \' \'` if [ \"$list\" ] && ! $in_submenu; then echo \"submenu \\\"Previous Linux versions\\\" {\" in_submenu=: fi done if $in_submenu; then echo \"}\" fi