Bug#741438: Initialize Apple graphics muxer when booting from GRUB
Thibaut Paumard
thibaut at debian.org
Wed Mar 12 13:46:10 UTC 2014
Package: grub-common
Version: 2.02~beta2-7
Severity: wishlist
File: /etc/grub.d/10_linux
Dear GRUB maintainers,
I'm writing to you as a member of the pkg-mactel team, whose goal is
to ease the installation of Debian on Apple Intel-based computers.
Modern Apple MacBooks have two graphics card: an Intel integrated
device (IGD) and a GPU (mostly NVidia, sometimes ATI). When booting in
BIOS mode (which has its drawbacks), things work fine but only the GPU
can be adressed.
The problem I want to solve is when booting in EFI mode. In this case,
both cards can be seen, and we need to manage the muxer to select
which card(s) to turn on, which card to use, and which physical
screen(s) to connect.
What I did, manually, is to add a few lines to /etc/grub.d/10_linux
(attached, look for the four "outb" lines right after "insmod
gzio"). The values I have selected allow using the IGD, but turn the
GPU on nevertheless, so it can be used for instance using bumblebee
and primus. I plan on packaging a small helper to turn off the GPU
after booting, to decrease power consumption. Other sets of values are
possible, in particular to launch X11 directly on the GPU. Also I
think it may be important to connect an external monitor (something I
haven't managed yet).
Without those lines, the display remains frozen after loading the
kernel. The computer can (IIRC) respond through the network, though.
I don't think its a good idea to instruct our users to fiddle
in this file, so I was wondering how it should be done.
I see two possibilities:
- have a mechanism that would allow a user or an external package to
feed a few arbitraty lines within the linux_entry() stanza;
- add those lines directly in 10_linux from grub2-common, but disable
them by default with a variable from /etc/default/grub.
The first option yields more freedom to the user, who may therefore
break more things.
What do you think?
Kind regards, Thibaut.
-- Package-specific info:
*********************** BEGIN /proc/mounts
/dev/sda5 / btrfs rw,relatime,space_cache 0 0
/dev/sda1 /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=utf8,shortname=mixed,errors=remount-ro 0 0
*********************** END /proc/mounts
*********************** BEGIN /boot/grub/device.map
(hd0) /dev/disk/by-id/ata-APPLE_HDD_HTS541010A9E682_J550001MGJ815C
*********************** END /boot/grub/device.map
*********************** BEGIN /boot/grub/grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
insmod efi_gap
insmod efi_vga
insmod video_bochs
insmod video_cirrus
insmod efi_gop
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
else
set default="0"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
if [ x$feature_default_font_path = xy ] ; then
font=unicode
else
insmod part_gpt
insmod btrfs
set root='hd0,gpt5'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5 --hint='hd0,gpt5' f0ca0d2d-ff24-43a4-a555-cd5545ec03f1
else
search --no-floppy --fs-uuid --set=root f0ca0d2d-ff24-43a4-a555-cd5545ec03f1
fi
font="/usr/share/grub/unicode.pf2"
fi
if loadfont $font ; then
set gfxmode=auto
load_video
insmod gfxterm
set locale_dir=$prefix/locale
set lang=fr_FR
insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ] ; then
set timeout=-1
else
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=5
fi
fi
play 480 440 1
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/05_debian_theme ###
insmod part_gpt
insmod btrfs
set root='hd0,gpt5'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5 --hint='hd0,gpt5' f0ca0d2d-ff24-43a4-a555-cd5545ec03f1
else
search --no-floppy --fs-uuid --set=root f0ca0d2d-ff24-43a4-a555-cd5545ec03f1
fi
insmod png
if background_image /usr/share/images/desktop-base/joy-grub.png; then
set color_normal=white/black
set color_highlight=black/white
else
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
fi
### END /etc/grub.d/05_debian_theme ###
### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
set gfxpayload="${1}"
}
set linux_gfx_mode=console
export linux_gfx_mode
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-f0ca0d2d-ff24-43a4-a555-cd5545ec03f1' {
load_video
gfxmode $linux_gfx_mode
insmod gzio
outb 0x728 1
outb 0x710 2
outb 0x740 2
outb 0x750 3
insmod part_gpt
insmod btrfs
set root='hd0,gpt5'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5 --hint='hd0,gpt5' f0ca0d2d-ff24-43a4-a555-cd5545ec03f1
else
search --no-floppy --fs-uuid --set=root f0ca0d2d-ff24-43a4-a555-cd5545ec03f1
fi
echo 'Chargement de Linux 3.12-1-amd64…'
linux /boot/vmlinuz-3.12-1-amd64 root=UUID=f0ca0d2d-ff24-43a4-a555-cd5545ec03f1 ro quiet nouveau.modeset=1 i915.lvds_use_ssc=0 i915.lvds_channel_mode=2 i915.modeset=1 modeset=1 i5s_enable_igd=1 init=/bin/systemd
echo 'Chargement du disque mémoire initial…'
initrd /boot/initrd.img-3.12-1-amd64
}
submenu 'Options avancées pour Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-f0ca0d2d-ff24-43a4-a555-cd5545ec03f1' {
menuentry 'Debian GNU/Linux, avec Linux 3.12-1-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.12-1-amd64-advanced-f0ca0d2d-ff24-43a4-a555-cd5545ec03f1' {
load_video
gfxmode $linux_gfx_mode
insmod gzio
outb 0x728 1
outb 0x710 2
outb 0x740 2
outb 0x750 3
insmod part_gpt
insmod btrfs
set root='hd0,gpt5'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5 --hint='hd0,gpt5' f0ca0d2d-ff24-43a4-a555-cd5545ec03f1
else
search --no-floppy --fs-uuid --set=root f0ca0d2d-ff24-43a4-a555-cd5545ec03f1
fi
echo 'Chargement de Linux 3.12-1-amd64…'
linux /boot/vmlinuz-3.12-1-amd64 root=UUID=f0ca0d2d-ff24-43a4-a555-cd5545ec03f1 ro quiet nouveau.modeset=1 i915.lvds_use_ssc=0 i915.lvds_channel_mode=2 i915.modeset=1 modeset=1 i5s_enable_igd=1 init=/bin/systemd
echo 'Chargement du disque mémoire initial…'
initrd /boot/initrd.img-3.12-1-amd64
}
menuentry 'Debian GNU/Linux, with Linux 3.12-1-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.12-1-amd64-recovery-f0ca0d2d-ff24-43a4-a555-cd5545ec03f1' {
load_video
gfxmode $linux_gfx_mode
insmod gzio
outb 0x728 1
outb 0x710 2
outb 0x740 2
outb 0x750 3
insmod part_gpt
insmod btrfs
set root='hd0,gpt5'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5 --hint='hd0,gpt5' f0ca0d2d-ff24-43a4-a555-cd5545ec03f1
else
search --no-floppy --fs-uuid --set=root f0ca0d2d-ff24-43a4-a555-cd5545ec03f1
fi
echo 'Chargement de Linux 3.12-1-amd64…'
linux /boot/vmlinuz-3.12-1-amd64 root=UUID=f0ca0d2d-ff24-43a4-a555-cd5545ec03f1 ro single
echo 'Chargement du disque mémoire initial…'
initrd /boot/initrd.img-3.12-1-amd64
}
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###
### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Mac OS X (32 bits) (sur /dev/sda2)' --class osx --class darwin --class os $menuentry_id_option 'osprober-xnu-32-50a246dc9b82a4d2' {
insmod part_gpt
insmod hfsplus
set root='hd0,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 --hint='hd0,gpt2' 50a246dc9b82a4d2
else
search --no-floppy --fs-uuid --set=root 50a246dc9b82a4d2
fi
load_video
set do_resume=0
if [ /var/vm/sleepimage -nt10 / ]; then
if xnu_resume /var/vm/sleepimage; then
set do_resume=1
fi
fi
if [ $do_resume = 0 ]; then
xnu_uuid 50a246dc9b82a4d2 uuid
if [ -f /Extra/DSDT.aml ]; then
acpi -e /Extra/DSDT.aml
fi
if [ /kernelcache -nt /System/Library/Extensions ]; then
xnu_kernel /kernelcache boot-uuid=${uuid} rd=*uuid
else
xnu_kernel /mach_kernel boot-uuid=${uuid} rd=*uuid
if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then
xnu_mkext /System/Library/Extensions.mkext
else
xnu_kextdir /System/Library/Extensions
fi
fi
if [ -f /Extra/Extensions.mkext ]; then
xnu_mkext /Extra/Extensions.mkext
fi
if [ -d /Extra/Extensions ]; then
xnu_kextdir /Extra/Extensions
fi
if [ -f /Extra/devprop.bin ]; then
xnu_devprop_load /Extra/devprop.bin
fi
if [ -f /Extra/splash.jpg ]; then
insmod jpeg
xnu_splash /Extra/splash.jpg
fi
if [ -f /Extra/splash.png ]; then
insmod png
xnu_splash /Extra/splash.png
fi
if [ -f /Extra/splash.tga ]; then
insmod tga
xnu_splash /Extra/splash.tga
fi
fi
}
menuentry 'Mac OS X (64 bits) (sur /dev/sda2)' --class osx --class darwin --class os $menuentry_id_option 'osprober-xnu-64-50a246dc9b82a4d2' {
insmod part_gpt
insmod hfsplus
set root='hd0,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 --hint='hd0,gpt2' 50a246dc9b82a4d2
else
search --no-floppy --fs-uuid --set=root 50a246dc9b82a4d2
fi
load_video
set do_resume=0
if [ /var/vm/sleepimage -nt10 / ]; then
if xnu_resume /var/vm/sleepimage; then
set do_resume=1
fi
fi
if [ $do_resume = 0 ]; then
xnu_uuid 50a246dc9b82a4d2 uuid
if [ -f /Extra/DSDT.aml ]; then
acpi -e /Extra/DSDT.aml
fi
if [ /kernelcache -nt /System/Library/Extensions ]; then
xnu_kernel64 /kernelcache boot-uuid=${uuid} rd=*uuid
else
xnu_kernel64 /mach_kernel boot-uuid=${uuid} rd=*uuid
if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then
xnu_mkext /System/Library/Extensions.mkext
else
xnu_kextdir /System/Library/Extensions
fi
fi
if [ -f /Extra/Extensions.mkext ]; then
xnu_mkext /Extra/Extensions.mkext
fi
if [ -d /Extra/Extensions ]; then
xnu_kextdir /Extra/Extensions
fi
if [ -f /Extra/devprop.bin ]; then
xnu_devprop_load /Extra/devprop.bin
fi
if [ -f /Extra/splash.jpg ]; then
insmod jpeg
xnu_splash /Extra/splash.jpg
fi
if [ -f /Extra/splash.png ]; then
insmod png
xnu_splash /Extra/splash.png
fi
if [ -f /Extra/splash.tga ]; then
insmod tga
xnu_splash /Extra/splash.tga
fi
fi
}
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/30_uefi-firmware ###
### END /etc/grub.d/30_uefi-firmware ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###
### BEGIN /etc/grub.d/41_custom ###
if [ -f ${config_directory}/custom.cfg ]; then
source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
*********************** END /boot/grub/grub.cfg
*********************** BEGIN /proc/mdstat
cat: /proc/mdstat: No such file or directory
*********************** END /proc/mdstat
*********************** BEGIN /dev/disk/by-id
total 0
lrwxrwxrwx 1 root root 9 Mar 12 13:53 ata-APPLE_HDD_HTS541010A9E682_J550001MGJ815C -> ../../sda
lrwxrwxrwx 1 root root 10 Mar 12 13:53 ata-APPLE_HDD_HTS541010A9E682_J550001MGJ815C-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Mar 12 13:53 ata-APPLE_HDD_HTS541010A9E682_J550001MGJ815C-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Mar 12 13:53 ata-APPLE_HDD_HTS541010A9E682_J550001MGJ815C-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 Mar 12 13:53 ata-APPLE_HDD_HTS541010A9E682_J550001MGJ815C-part4 -> ../../sda4
lrwxrwxrwx 1 root root 10 Mar 12 13:53 ata-APPLE_HDD_HTS541010A9E682_J550001MGJ815C-part5 -> ../../sda5
lrwxrwxrwx 1 root root 10 Mar 12 13:53 ata-APPLE_HDD_HTS541010A9E682_J550001MGJ815C-part6 -> ../../sda6
lrwxrwxrwx 1 root root 9 Mar 12 13:53 ata-MATSHITADVD-R_UJ-8A8_D02305700R8DTL7C8 -> ../../sr0
lrwxrwxrwx 1 root root 9 Mar 12 13:53 scsi-SATA_APPLE_HDD_HTS541_J550001MGJ815C -> ../../sda
lrwxrwxrwx 1 root root 10 Mar 12 13:53 scsi-SATA_APPLE_HDD_HTS541_J550001MGJ815C-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Mar 12 13:53 scsi-SATA_APPLE_HDD_HTS541_J550001MGJ815C-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Mar 12 13:53 scsi-SATA_APPLE_HDD_HTS541_J550001MGJ815C-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 Mar 12 13:53 scsi-SATA_APPLE_HDD_HTS541_J550001MGJ815C-part4 -> ../../sda4
lrwxrwxrwx 1 root root 10 Mar 12 13:53 scsi-SATA_APPLE_HDD_HTS541_J550001MGJ815C-part5 -> ../../sda5
lrwxrwxrwx 1 root root 10 Mar 12 13:53 scsi-SATA_APPLE_HDD_HTS541_J550001MGJ815C-part6 -> ../../sda6
lrwxrwxrwx 1 root root 9 Mar 12 13:53 wwn-0x5000cca6c6c7641c -> ../../sda
lrwxrwxrwx 1 root root 10 Mar 12 13:53 wwn-0x5000cca6c6c7641c-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Mar 12 13:53 wwn-0x5000cca6c6c7641c-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Mar 12 13:53 wwn-0x5000cca6c6c7641c-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 Mar 12 13:53 wwn-0x5000cca6c6c7641c-part4 -> ../../sda4
lrwxrwxrwx 1 root root 10 Mar 12 13:53 wwn-0x5000cca6c6c7641c-part5 -> ../../sda5
lrwxrwxrwx 1 root root 10 Mar 12 13:53 wwn-0x5000cca6c6c7641c-part6 -> ../../sda6
*********************** END /dev/disk/by-id
*********************** BEGIN /dev/disk/by-uuid
total 0
lrwxrwxrwx 1 root root 10 Mar 12 13:53 2860-11F4 -> ../../sda1
lrwxrwxrwx 1 root root 10 Mar 12 13:53 4bed8f22-a0f1-3618-8a65-5e879fdda561 -> ../../sda2
lrwxrwxrwx 1 root root 10 Mar 12 13:53 71ae5aec-10c5-4ca5-8fb4-bb211f7a8167 -> ../../sda6
lrwxrwxrwx 1 root root 10 Mar 12 13:53 d4a26439-8153-33ec-bdc9-357e67155769 -> ../../sda3
lrwxrwxrwx 1 root root 10 Mar 12 13:53 f0ca0d2d-ff24-43a4-a555-cd5545ec03f1 -> ../../sda5
*********************** END /dev/disk/by-uuid
-- System Information:
Debian Release: jessie/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 3.12-1-amd64 (SMP w/8 CPU cores)
Locale: LANG=fr_FR.utf8, LC_CTYPE=fr_FR.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages grub-common depends on:
ii gettext-base 0.18.3.2-1
ii libc6 2.18-4
ii libdevmapper1.02.1 2:1.02.83-2
ii libfreetype6 2.5.2-1
ii libfuse2 2.9.2-4
ii liblzma5 5.1.1alpha+20120614-2
ii libpng12-0 1.2.50-1
ii zlib1g 1:1.2.8.dfsg-1
Versions of packages grub-common recommends:
ii os-prober 1.63
Versions of packages grub-common suggests:
ii console-setup 1.102
ii desktop-base 7.0.3
pn grub-emu <none>
pn multiboot-doc <none>
pn xorriso <none>
-- Configuration Files:
/etc/grub.d/10_linux changed:
set -e
prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
ubuntu_recovery="0"
quiet_boot="0"
quick_boot="0"
gfxpayload_dynamic="0"
vt_handoff="0"
.. "${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
case ${GRUB_DISTRIBUTOR} in
Ubuntu|Kubuntu)
OS="${GRUB_DISTRIBUTOR}"
;;
*)
OS="${GRUB_DISTRIBUTOR} GNU/Linux"
;;
esac
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}"
fi
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
case x"$GRUB_FS" in
xbtrfs)
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;;
xzfs)
rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true`
bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`"
LINUX_ROOT_DEVICE="ZFS=${rpool}${bootfs}"
;;
esac
title_correction_code=
if [ -x /lib/recovery-mode/recovery-menu ]; then
GRUB_CMDLINE_LINUX_RECOVERY=recovery
else
GRUB_CMDLINE_LINUX_RECOVERY=single
fi
if [ "$ubuntu_recovery" = 1 ]; then
GRUB_CMDLINE_LINUX_RECOVERY="$GRUB_CMDLINE_LINUX_RECOVERY nomodeset"
fi
if [ "$vt_handoff" = 1 ]; then
for word in $GRUB_CMDLINE_LINUX_DEFAULT; do
if [ "$word" = splash ]; then
GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT \$vt_handoff"
fi
done
fi
linux_entry ()
{
os="$1"
version="$2"
type="$3"
args="$4"
if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
fi
if [ x$type != xsimple ] ; then
case $type in
recovery)
title="$(gettext_printf "%s, with Linux %s (%s)" "${os}" "${version}" "$(gettext "${GRUB_RECOVERY_TITLE}")")" ;;
*)
title="$(gettext_printf "%s, with Linux %s" "${os}" "${version}")" ;;
esac
if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
replacement_title="$(echo "Advanced options for ${OS}" | 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")"
fi
echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
else
echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
fi
if [ "$quick_boot" = 1 ]; then
echo " recordfail" | sed "s/^/$submenu_indentation/"
fi
if [ x$type != xrecovery ] ; then
save_default_entry | grub_add_tab
fi
# 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 " load_video" | sed "s/^/$submenu_indentation/"
else
if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then
echo " load_video" | sed "s/^/$submenu_indentation/"
fi
fi
if ([ "$ubuntu_recovery" = 0 ] || [ x$type != xrecovery ]) && \
([ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 1 ]); then
echo " gfxmode \$linux_gfx_mode" | sed "s/^/$submenu_indentation/"
fi
echo " insmod gzio" | sed "s/^/$submenu_indentation/"
# Apple gmux
echo " outb 0x728 1" | sed "s/^/$submenu_indentation/"
echo " outb 0x710 2" | sed "s/^/$submenu_indentation/"
echo " outb 0x740 2" | sed "s/^/$submenu_indentation/"
echo " outb 0x750 3" | sed "s/^/$submenu_indentation/"
if [ x$dirname = x/ ]; then
if [ -z "${prepare_root_cache}" ]; then
prepare_root_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | grub_add_tab)"
fi
printf '%s\n' "${prepare_root_cache}" | sed "s/^/$submenu_indentation/"
else
if [ -z "${prepare_boot_cache}" ]; then
prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | grub_add_tab)"
fi
printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
fi
if [ x"$quiet_boot" = x0 ] || [ x"$type" != xsimple ]; then
message="$(gettext_printf "Loading Linux %s ..." ${version})"
sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
EOF
fi
if test -d /sys/firmware/efi && test -e "${linux}.efi.signed"; then
sed "s/^/$submenu_indentation/" << EOF
linux ${rel_dirname}/${basename}.efi.signed root=${linux_root_device_thisversion} ro ${args}
EOF
else
sed "s/^/$submenu_indentation/" << EOF
linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args}
EOF
fi
if test -n "${initrd}" ; then
# TRANSLATORS: ramdisk isn't identifier. Should be translated.
if [ x"$quiet_boot" = x0 ] || [ x"$type" != xsimple ]; then
message="$(gettext_printf "Loading initial ramdisk ...")"
sed "s/^/$submenu_indentation/" << EOF
echo '$(echo "$message" | grub_quote)'
EOF
fi
sed "s/^/$submenu_indentation/" << EOF
initrd ${rel_dirname}/${initrd}
EOF
fi
sed "s/^/$submenu_indentation/" << EOF
}
EOF
}
machine=`uname -m`
case "x$machine" 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
case "$machine" in
i?86) GENKERNEL_ARCH="x86" ;;
mips|mips64) GENKERNEL_ARCH="mips" ;;
mipsel|mips64el) GENKERNEL_ARCH="mipsel" ;;
arm*) GENKERNEL_ARCH="arm" ;;
*) GENKERNEL_ARCH="$machine" ;;
esac
prepare_boot_cache=
prepare_root_cache=
boot_device_id=
title_correction_code=
cat << 'EOF'
function gfxmode {
set gfxpayload="${1}"
EOF
if [ "$vt_handoff" = 1 ]; then
cat << 'EOF'
if [ "${1}" = "keep" ]; then
set vt_handoff=vt.handoff=7
else
set vt_handoff=
fi
EOF
fi
cat << EOF
}
EOF
if [ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 0 ]; 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
EOF
submenu_indentation=""
is_top_level=true
while [ "x$list" != "x" ] ; do
linux=`version_find_latest $list`
case $linux in
*.efi.signed)
# We handle these in linux_entry.
list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
continue
;;
esac
gettext_printf "Found linux image: %s\n" "$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}.gz" \
"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}" \
"initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \
"initramfs-genkernel-${GENKERNEL_ARCH}-${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
gettext_printf "Found initrd image: %s\n" "${dirname}/${initrd}" >&2
elif test -z "${initramfs}" ; then
# "UUID=" and "ZFS=" 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
if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then
linux_entry "${OS}" "${version}" simple \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
submenu_indentation="$grub_tab"
if [ -z "$boot_device_id" ]; then
boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
fi
# TRANSLATORS: %s is replaced with an OS name
echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
is_top_level=false
fi
linux_entry "${OS}" "${version}" advanced \
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
linux_entry "${OS}" "${version}" recovery \
"${GRUB_CMDLINE_LINUX_RECOVERY} ${GRUB_CMDLINE_LINUX}"
fi
list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
done
if [ x"$is_top_level" != xtrue ]; then
echo '}'
fi
echo "$title_correction_code"
-- no debconf information
More information about the Pkg-grub-devel
mailing list