Blame | Last modification | View Log | RSS feed
#! /bin/shset -e# grub-mkconfig helper script.# Copyright (C) 2006,2007,2008,2009 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="/usr"datarootdir="/usr/share"export TEXTDOMAIN=grubexport TEXTDOMAINDIR="${datarootdir}/locale". "$pkgdatadir/grub-mkconfig_lib"if [ "x${GRUB_DISABLE_OS_PROBER}" = "xtrue" ]; thenexit 0fiif [ -z "`which os-prober 2> /dev/null`" ] || [ -z "`which linux-boot-prober 2> /dev/null`" ] ; then# missing os-prober and/or linux-boot-proberexit 0fiOSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`"if [ -z "${OSPROBED}" ] ; then# empty os-prober output, nothing doingexit 0fiosx_entry() {found_other_os=1# TRANSLATORS: it refers on the OS residing on device %sonstr="$(gettext_printf "(on %s)" "${DEVICE}")"hints=""for hint in `"${grub_probe}" --device ${device} --target=efi_hints 2> /dev/null` ; dohints="${hints} --hint=${hint}"donecat << EOFmenuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class osx --class darwin --class os \$menuentry_id_option 'osprober-xnu-$2-$(grub_get_device_id "${DEVICE}")' {EOFsave_default_entry | grub_add_tabprepare_grub_to_access_device ${DEVICE} | grub_add_tabcat << EOFset gfxpayload=keepload_videoinsmod part_gptinsmod hfsplussearch --no-floppy --fs-uuid --set=root ${hints} $(grub_get_device_id "${DEVICE}")chainloader (\$root)/System/Library/CoreServices/boot.efiboot}EOF}used_osprober_linux_ids=for OS in ${OSPROBED} ; doDEVICE="`echo ${OS} | cut -d ':' -f 1`"LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`"BOOT="`echo ${OS} | cut -d ':' -f 4`"if UUID="`${grub_probe} --target=fs_uuid --device ${DEVICE%@*}`"; thenEXPUUID="$UUID"if [ x"${DEVICE#*@}" != x ] ; thenEXPUUID="${EXPUUID}@${DEVICE#*@}"fiif [ "x${GRUB_OS_PROBER_SKIP_LIST}" != "x" ] && [ "x`echo ${GRUB_OS_PROBER_SKIP_LIST} | grep -i -e '\b'${EXPUUID}'\b'`" != "x" ] ; thenecho "Skipped ${LONGNAME} on ${DEVICE} by user request." >&2continuefifiBTRFS="`echo ${OS} | cut -d ':' -f 5`"if [ "x$BTRFS" = "xbtrfs" ]; thenBTRFSuuid="`echo ${OS} | cut -d ':' -f 6`"BTRFSsubvol="`echo ${OS} | cut -d ':' -f 7`"fiif [ -z "${LONGNAME}" ] ; thenLONGNAME="${LABEL}"fi# os-prober returns text string followed by optional counterCLASS="--class $(echo "${LABEL}" | LC_ALL=C sed 's,[[:digit:]]*$,,' | cut -d' ' -f1 | tr 'A-Z' 'a-z' | LC_ALL=C sed 's,[^[:alnum:]_],_,g')"gettext_printf "Found %s on %s\n" "${LONGNAME}" "${DEVICE}" >&2case ${BOOT} inchain)found_other_os=1onstr="$(gettext_printf "(on %s)" "${DEVICE}")"cat << EOFmenuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' $CLASS --class os \$menuentry_id_option 'osprober-chain-$(grub_get_device_id "${DEVICE}")' {EOFsave_default_entry | grub_add_tabprepare_grub_to_access_device ${DEVICE} | grub_add_tabif [ x"`${grub_probe} --device ${DEVICE} --target=partmap`" = xmsdos ]; thencat << EOFparttool \${root} hidden-EOFficase ${LONGNAME} inWindows\ Vista*|Windows\ 7*|Windows\ Server\ 2008*);;*)cat << EOFdrivemap -s (hd0) \${root}EOF;;esaccat <<EOFchainloader +1}EOF;;efi)found_other_os=1EFIPATH=${DEVICE#*@}DEVICE=${DEVICE%@*}onstr="$(gettext_printf "(on %s)" "${DEVICE}")"cat << EOFmenuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' $CLASS --class os \$menuentry_id_option 'osprober-efi-$(grub_get_device_id "${DEVICE}")' {EOFsave_default_entry | sed -e "s/^/\t/"prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"cat <<EOFchainloader ${EFIPATH}}EOF;;linux)if [ "x$BTRFS" = "xbtrfs" ]; thenLINUXPROBED="`linux-boot-prober btrfs ${BTRFSuuid} ${BTRFSsubvol} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`"elseLINUXPROBED="`linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`"fiprepare_boot_cache=boot_device_id=is_top_level=truetitle_correction_code=OS="${LONGNAME}"for LINUX in ${LINUXPROBED} ; doLROOT="`echo ${LINUX} | cut -d ':' -f 1`"LBOOT="`echo ${LINUX} | cut -d ':' -f 2`"LLABEL="`echo ${LINUX} | cut -d ':' -f 3 | tr '^' ' '`"LKERNEL="`echo ${LINUX} | cut -d ':' -f 4`"LINITRD="`echo ${LINUX} | cut -d ':' -f 5`"LPARAMS="`echo ${LINUX} | cut -d ':' -f 6- | tr '^' ' '`"if [ -z "${LLABEL}" ] ; thenLLABEL="${LONGNAME}"fiif [ "${LROOT}" != "${LBOOT}" ]; thenLKERNEL="${LKERNEL#/boot}"LINITRD="${LINITRD#/boot}"fifound_other_os=1onstr="$(gettext_printf "(on %s)" "${DEVICE}")"recovery_params="$(echo "${LPARAMS}" | grep single)" || truecounter=1while echo "$used_osprober_linux_ids" | grep 'osprober-gnulinux-$LKERNEL-${recovery_params}-$counter-$boot_device_id' > /dev/null; docounter=$((counter+1));doneif [ -z "$boot_device_id" ]; thenboot_device_id="$(grub_get_device_id "${DEVICE}")"fiused_osprober_linux_ids="$used_osprober_linux_ids 'osprober-gnulinux-$LKERNEL-${recovery_params}-$counter-$boot_device_id'"if [ -z "${prepare_boot_cache}" ]; thenprepare_boot_cache="$(prepare_grub_to_access_device ${LBOOT} | grub_add_tab)"fiif [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; thencat << EOFmenuentry '$(echo "$OS $onstr" | grub_quote)' $CLASS --class gnu-linux --class gnu --class os \$menuentry_id_option 'osprober-gnulinux-simple-$boot_device_id' {EOFsave_default_entry | grub_add_tabprintf '%s\n' "${prepare_boot_cache}"cat << EOFlinux ${LKERNEL} ${LPARAMS}EOFif [ -n "${LINITRD}" ] ; thencat << EOFinitrd ${LINITRD}EOFficat << EOF}EOFecho "submenu '$(gettext_printf "Advanced options for %s" "${OS} $onstr" | grub_quote)' \$menuentry_id_option 'osprober-gnulinux-advanced-$boot_device_id' {"is_top_level=falsefititle="${LLABEL} $onstr"cat << EOFmenuentry '$(echo "$title" | grub_quote)' --class gnu-linux --class gnu --class os \$menuentry_id_option 'osprober-gnulinux-$LKERNEL-${recovery_params}-$boot_device_id' {EOFsave_default_entry | sed -e "s/^/$grub_tab$grub_tab/"printf '%s\n' "${prepare_boot_cache}" | grub_add_tabcat << EOFlinux ${LKERNEL} ${LPARAMS}EOFif [ -n "${LINITRD}" ] ; thencat << EOFinitrd ${LINITRD}EOFficat << EOF}EOFif [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; thenreplacement_title="$(echo "Advanced options for ${OS} $onstr" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")"fidoneif [ x"$is_top_level" != xtrue ]; thenecho '}'fiecho "$title_correction_code";;macosx)for subdevice in ${DEVICE%[[:digit:]]*}* ; doparttype="`"${grub_probe}" --device ${device} --target=gpt_parttype "${subdevice}" 2> /dev/null`"if [[ "$parttype" = "426f6f74-0000-11aa-aa11-00306543ecac" ]]; thenDEVICE="${subdevice}" osx_entryfidone;;hurd)found_other_os=1onstr="$(gettext_printf "(on %s)" "${DEVICE}")"cat << EOFmenuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class hurd --class gnu --class os \$menuentry_id_option 'osprober-gnuhurd-/boot/gnumach.gz-false-$(grub_get_device_id "${DEVICE}")' {EOFsave_default_entry | grub_add_tabprepare_grub_to_access_device ${DEVICE} | grub_add_tabgrub_device="`${grub_probe} --device ${DEVICE} --target=drive`"mach_device="`echo "${grub_device}" | sed -e 's/(\(hd.*\),msdos\(.*\))/\1s\2/'`"grub_fs="`${grub_probe} --device ${DEVICE} --target=fs`"case "${grub_fs}" in*fs) hurd_fs="${grub_fs}" ;;*) hurd_fs="${grub_fs}fs" ;;esaccat << EOFmultiboot /boot/gnumach.gz root=device:${mach_device}module /hurd/${hurd_fs}.static ${hurd_fs} --readonly \\--multiboot-command-line='\${kernel-command-line}' \\--host-priv-port='\${host-port}' \\--device-master-port='\${device-port}' \\--exec-server-task='\${exec-task}' -T typed '\${root}' \\'\$(task-create)' '\$(task-resume)'module /lib/ld.so.1 exec /hurd/exec '\$(exec-task=task-create)'}EOF;;minix)found_other_os=1cat << EOFmenuentry "${LONGNAME} (on ${DEVICE}, Multiboot)" {EOFsave_default_entry | sed -e "s/^/\t/"prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"cat << EOFmultiboot /boot/image_latest}EOF;;*)case ${DEVICE} in*.efi)cat << EOFmenuentry '$(echo "${LONGNAME}" | grub_quote)' {EOFsave_default_entry | grub_add_tabcat << EOFchainloader /EFI/${DEVICE}boot}EOF;;*)echo -n " "# TRANSLATORS: %s is replaced by OS name.gettext_printf "%s is not yet supported by grub-mkconfig.\n" "${LONGNAME}" >&2;;esacesacdone# We override the results of the menu_auto_hide code here, this is a bit ugly,# but grub-mkconfig writes out the file linearly, so this is the only wayif [ "${found_other_os}" = "1" ]; thencat << EOF# Other OS found, undo autohiding of menu unless menu_auto_hide=2if [ "\${orig_timeout_style}" -a "\${menu_auto_hide}" != "2" ]; thenset timeout_style=\${orig_timeout_style}set timeout=\${orig_timeout}fiEOFfi