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