Como inicializar em várias unidades em uma placa-mãe UEFI usando o Grub2

1

Eu tenho um SSD e um HDD em uma placa-mãe UEFI. Eu posso mudar o SO alterando a ordem de inicialização no BIOS, mas eu preferiria que o Grub2 simplesmente listasse o Windows7 como uma opção de inicialização.

A resolução deve ajudar qualquer pessoa que tenha mais de uma unidade em uma placa-mãe UEFI. Ter visto Inicializando vários sistemas operacionais a partir de vários discos com UEFI e rEFInd parece ser uma boa alternativa; Esta pergunta é sobre como configurar corretamente o Grub2 para ver o bootloader para o Windows7 (ou qualquer sistema operacional), se possível - sem usar o Grub-legacy ou outra ferramenta como o rEFInd.

Estou usando o Ubuntu 12.10 com o Grub2 no SSD, o dispositivo de inicialização principal, e o Windows7 no HDD, que decidiu dividir em três partições quando foi instalado.

O script de informações de inicialização fornece um longo detalhamento:

                  Boot Info Script 0.61      [1 April 2012]


============================= Boot Info Summary: ===============================

 => Grub2 (v1.99) is installed in the MBR of /dev/sda and looks at sector 1 of 
    the same hard drive for core.img. core.img is at this location and looks 
    in partition 72 for .
 => No boot loader is installed in the MBR of /dev/sdb.

sda1: __________________________________________________________________________

    File system:       ext4
    Boot sector type:  -
    Boot sector info: 
    Operating System:  Ubuntu 12.10
    Boot files:        /boot/grub/grub.cfg /etc/fstab

sda2: __________________________________________________________________________

    File system:       swap
    Boot sector type:  -
    Boot sector info: 

sdb1: __________________________________________________________________________

    File system:       vfat
    Boot sector type:  Windows 7: FAT32
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  
    Boot files:        /efi/Boot/bootx64.efi

sdb2: __________________________________________________________________________

    File system:       
    Boot sector type:  -
    Boot sector info: 
    Mounting failed:   mount: unknown filesystem type ''

sdb3: __________________________________________________________________________

    File system:       ntfs
    Boot sector type:  Windows Vista/7: NTFS
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  Windows 7
    Boot files:        /Windows/System32/winload.exe

============================ Drive/Partition Info: =============================

Drive: sda _____________________________________________________________________

Disk /dev/sda: 120.0 GB, 120034123776 bytes
255 heads, 63 sectors/track, 14593 cylinders, total 234441648 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes

Partition  Boot  Start Sector    End Sector  # of Sectors  Id System

/dev/sda1    *          2,048   218,439,679   218,437,632  83 Linux
/dev/sda2         218,439,680   234,440,703    16,001,024  82 Linux swap / Solaris


Drive: sdb _____________________________________________________________________

Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
256 heads, 63 sectors/track, 121126 cylinders, total 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes

Partition  Boot  Start Sector    End Sector  # of Sectors  Id System

/dev/sdb1                   1 4,294,967,295 4,294,967,295  ee GPT

/dev/sdb1 ends after the last sector of /dev/sdb

GUID Partition Table detected.

Partition    Start Sector    End Sector  # of Sectors System
/dev/sdb1           2,048       206,847       204,800 EFI System partition
/dev/sdb2         206,848       468,991       262,144 Microsoft Reserved Partition (Windows)
/dev/sdb3         468,992 1,953,523,711 1,953,054,720 Data partition (Windows/Linux)

"blkid" output: ________________________________________________________________

Device           UUID                                   TYPE       LABEL

/dev/sda1        e20b187a-c3b0-45e1-98df-c955b3cffdde   ext4       
/dev/sda2        7663b629-19c9-49fc-a744-2beb2dcdb317   swap       
/dev/sdb1        F428-FB77                              vfat       
/dev/sdb3        162C36632C363DD5                       ntfs       

================================ Mount points: =================================

Device           Mount_Point              Type       Options

/dev/sda1        /                        ext4       (rw,errors=remount-ro)


=========================== sda1/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 ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
set default="0"

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 recordfail {
  set recordfail=1
  if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; 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
}

terminal_input console
terminal_output console
if [ "${recordfail}" = 1 ]; then
  set timeout=-1
else
  set timeout=6
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 44,0,30; then
  clear
fi
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
  set gfxpayload="${1}"
  if [ "${1}" = "keep" ]; then
    set vt_handoff=vt.handoff=7
  else
    set vt_handoff=
  fi
}
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
export linux_gfx_mode
if [ "${linux_gfx_mode}" != "text" ]; then load_video; fi
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-e20b187a-c3b0-45e1-98df-c955b3cffdde' {
recordfail
  gfxmode $linux_gfx_mode
  insmod gzio
  insmod part_msdos
  insmod ext2
  set root='hd0,msdos1'
  if [ x$feature_platform_search_hint = xy ]; then
    search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  e20b187a-c3b0-45e1-98df-c955b3cffdde
  else
    search --no-floppy --fs-uuid --set=root e20b187a-c3b0-45e1-98df-c955b3cffdde
  fi
  linux /boot/vmlinuz-3.5.0-27-generic root=UUID=e20b187a-c3b0-45e1-98df-c955b3cffdde ro   quiet splash $vt_handoff
  initrd  /boot/initrd.img-3.5.0-27-generic
}
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-e20b187a-c3b0-45e1-98df-c955b3cffdde' {
  menuentry 'Ubuntu, with Linux 3.5.0-27-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.5.0-27-generic-advanced-e20b187a-c3b0-45e1-98df-c955b3cffdde' {
  recordfail
    gfxmode $linux_gfx_mode
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  e20b187a-c3b0-45e1-98df-c955b3cffdde
    else
      search --no-floppy --fs-uuid --set=root e20b187a-c3b0-45e1-98df-c955b3cffdde
    fi
    echo  'Loading Linux 3.5.0-27-generic ...'
    linux /boot/vmlinuz-3.5.0-27-generic root=UUID=e20b187a-c3b0-45e1-98df-c955b3cffdde ro   quiet splash $vt_handoff
    echo  'Loading initial ramdisk ...'
    initrd  /boot/initrd.img-3.5.0-27-generic
  }
  menuentry 'Ubuntu, with Linux 3.5.0-27-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.5.0-27-generic-recovery-e20b187a-c3b0-45e1-98df-c955b3cffdde' {
  recordfail
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  e20b187a-c3b0-45e1-98df-c955b3cffdde
    else
      search --no-floppy --fs-uuid --set=root e20b187a-c3b0-45e1-98df-c955b3cffdde
    fi
    echo  'Loading Linux 3.5.0-27-generic ...'
    linux /boot/vmlinuz-3.5.0-27-generic root=UUID=e20b187a-c3b0-45e1-98df-c955b3cffdde ro recovery nomodeset 
    echo  'Loading initial ramdisk ...'
    initrd  /boot/initrd.img-3.5.0-27-generic
  }
  menuentry 'Ubuntu, with Linux 3.5.0-26-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.5.0-26-generic-advanced-e20b187a-c3b0-45e1-98df-c955b3cffdde' {
  recordfail
    gfxmode $linux_gfx_mode
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  e20b187a-c3b0-45e1-98df-c955b3cffdde
    else
      search --no-floppy --fs-uuid --set=root e20b187a-c3b0-45e1-98df-c955b3cffdde
    fi
    echo  'Loading Linux 3.5.0-26-generic ...'
    linux /boot/vmlinuz-3.5.0-26-generic root=UUID=e20b187a-c3b0-45e1-98df-c955b3cffdde ro   quiet splash $vt_handoff
    echo  'Loading initial ramdisk ...'
    initrd  /boot/initrd.img-3.5.0-26-generic
  }
  menuentry 'Ubuntu, with Linux 3.5.0-26-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.5.0-26-generic-recovery-e20b187a-c3b0-45e1-98df-c955b3cffdde' {
  recordfail
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  e20b187a-c3b0-45e1-98df-c955b3cffdde
    else
      search --no-floppy --fs-uuid --set=root e20b187a-c3b0-45e1-98df-c955b3cffdde
    fi
    echo  'Loading Linux 3.5.0-26-generic ...'
    linux /boot/vmlinuz-3.5.0-26-generic root=UUID=e20b187a-c3b0-45e1-98df-c955b3cffdde ro recovery nomodeset 
    echo  'Loading initial ramdisk ...'
    initrd  /boot/initrd.img-3.5.0-26-generic
  }
  menuentry 'Ubuntu, with Linux 3.5.0-17-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.5.0-17-generic-advanced-e20b187a-c3b0-45e1-98df-c955b3cffdde' {
  recordfail
    gfxmode $linux_gfx_mode
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  e20b187a-c3b0-45e1-98df-c955b3cffdde
    else
      search --no-floppy --fs-uuid --set=root e20b187a-c3b0-45e1-98df-c955b3cffdde
    fi
    echo  'Loading Linux 3.5.0-17-generic ...'
    linux /boot/vmlinuz-3.5.0-17-generic root=UUID=e20b187a-c3b0-45e1-98df-c955b3cffdde ro   quiet splash $vt_handoff
    echo  'Loading initial ramdisk ...'
    initrd  /boot/initrd.img-3.5.0-17-generic
  }
  menuentry 'Ubuntu, with Linux 3.5.0-17-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.5.0-17-generic-recovery-e20b187a-c3b0-45e1-98df-c955b3cffdde' {
  recordfail
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  e20b187a-c3b0-45e1-98df-c955b3cffdde
    else
      search --no-floppy --fs-uuid --set=root e20b187a-c3b0-45e1-98df-c955b3cffdde
    fi
    echo  'Loading Linux 3.5.0-17-generic ...'
    linux /boot/vmlinuz-3.5.0-17-generic root=UUID=e20b187a-c3b0-45e1-98df-c955b3cffdde ro recovery nomodeset 
    echo  'Loading initial ramdisk ...'
    initrd  /boot/initrd.img-3.5.0-17-generic
  }
}

### 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 ###
### 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 ###
--------------------------------------------------------------------------------

=============================== sda1/etc/fstab: ================================

--------------------------------------------------------------------------------
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda1 during installation
UUID=e20b187a-c3b0-45e1-98df-c955b3cffdde /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda2 during installation
UUID=7663b629-19c9-49fc-a744-2beb2dcdb317 none            swap    sw              0       0
--------------------------------------------------------------------------------

=================== sda1: Location of files loaded by Grub: ====================

           GiB - GB             File                                 Fragment(s)

               =                boot/grub/grub.cfg                             1
               =                boot/initrd.img-3.5.0-17-generic               1
               =                boot/initrd.img-3.5.0-26-generic               1
               =                boot/initrd.img-3.5.0-27-generic               1
               =                boot/vmlinuz-3.5.0-17-generic                  1
               =                boot/vmlinuz-3.5.0-26-generic                  1
               =                boot/vmlinuz-3.5.0-27-generic                  2
               =                initrd.img                                     1
               =                initrd.img.old                                 1
               =                vmlinuz                                        2
               =                vmlinuz.old                                    2

=============================== StdErr Messages: ===============================

awk: cmd. line:36: Math support is not compiled in
awk: cmd. line:36: Math support is not compiled in
awk: cmd. line:36: Math support is not compiled in
awk: cmd. line:36: Math support is not compiled in
awk: cmd. line:36: Math support is not compiled in
awk: cmd. line:36: Math support is not compiled in
awk: cmd. line:36: Math support is not compiled in
awk: cmd. line:36: Math support is not compiled in
awk: cmd. line:36: Math support is not compiled in
awk: cmd. line:36: Math support is not compiled in
awk: cmd. line:36: Math support is not compiled in

Em resumo, o Ubuntu possui uma partição swap (sda2) além de sua partição raiz (sda1) onde ele reside. Tudo está bem lá. O Windows7 fez 3 partições, sendo a primeira (sdb1) para EFI, a segunda (sdb2) sendo reservada para janelas que não é relevante, a terceira (sdb3) sendo a instalação real do Windows.

A hierarquia de arquivos do sdb1 é

> ls -aR
.:
.  ..  EFI

./EFI:
.  ..  Boot  Microsoft

./EFI/Boot:
.  ..  bootx64.efi

./EFI/Microsoft:
.  ..  Boot

./EFI/Microsoft/Boot:
.   BCD      BCD.LOG1  bootmgfw.efi  BOOTSTAT.DAT  da-DK  el-GR  es-ES  Fonts  hu-HU  ja-JP  memtest.efi  nl-NL  pt-BR  ru-RU  tr-TR  zh-HK
..  BCD.LOG  BCD.LOG2  bootmgr.efi   cs-CZ         de-DE  en-US  fi-FI  fr-FR  it-IT  ko-KR  nb-NO        pl-PL  pt-PT  sv-SE  zh-CN  zh-TW
etc

Usando

grub-mkdevicemap

O arquivo "device.map" foi gerado em "/ boot / grub", que identificou que o SSD é (hd0) e o HDD é (hd1). hd0 é o dispositivo de inicialização primário, o Grub2 mora aqui.

No grub-customizer, tentei criar uma entrada que direcionasse o grub2 para o bootloader do Windows7:

set root='(hd1,1)'
search-no-floppy-fs-uuid-set F428-FB77
drivemap -s (hd1) ${root}
chainloader +1

No entanto, ao selecioná-lo no grub no reinício, ocorreu este erro:

error: no such device: F428-FB77.
error: invalid signature.

Press any key to continue..._

Estou perto?

    
por xxjjnn 15.04.2013 / 15:59

1 resposta

1

Seu problema é que você tem uma instalação no modo BIOS do Linux e GRUB, enquanto a instalação do Windows está no modo EFI. O GRUB não pode alternar os modos de inicialização, portanto você não pode fazer o que deseja fazer com a instalação do GRUB atual . Você terá que adicionar um GRUB no modo EFI (ou algum outro programa de inicialização no modo EFI, como o rEFInd) para fazer o trabalho. Infelizmente, fazer isso a partir de sua instalação funcional é complicado, já que requer o uso de um programa no modo EFI chamado efibootmgr , e isso não funcionará na inicialização atual do Linux no modo BIOS, criando assim um enigma do tipo galinha e ovo. Você pode fazê-lo a partir de um disco de emergência do Ubuntu inicializado no modo EFI , mas isso complica o processo de configuração do GRUB. Consulte a minha página da Web sobre o tópico para obter informações sobre os carregadores de inicialização EFI e como instalá-los manualmente se você quiser tentar isso . É possível que a ferramenta de reparo de inicialização do Ubuntu, executada em um disco de emergência do modo EFI, possa instalar um EFI -Mode GRUB relativamente sem dor, mas não tenho certeza disso. Eu também não sou fã de Boot Repair, já que é um pouco problemático com suas mudanças.

Outra opção é abandonar o GRUB em favor de rEFInd. Se você inicializar o Linux no modo BIOS, monte /dev/sdb1 ( seu ESP) em /boot/efi , e depois instalar a versão do pacote Debian do rEFInd, ele deve se preparar para ser iniciado na próxima vez que você inicializar o computador no modo EFI (você pode precisar selecionar a opção "Windows" para obtê-lo boot). Isso funciona usando uma solução que também é um pouco no lado do punho de presunto, mas não tão ruim quanto o que o Boot Repair faz, IMHO. Também é reversível quando você inicializa o Linux no modo EFI: Digite sudo mount /dev/sdb1 /boot/efi para montar o ESP novamente (criar uma entrada /etc/fstab para isso é uma boa idéia, não importa qual solução você escolha) e digite sudo mvrefind.sh /boot/efi/EFI/Microsoft/Boot /boot/efi/EFI/refind .

Uma terceira opção é reinstalar o Windows no modo BIOS. Para fazer isso, você precisa limpar a tabela de partições em /dev/sdb , convertendo-a do formato GPT para MBR e reinstalar o Windows, garantindo que você faça isso no modo BIOS. Esta é a solução mais deselegante, mas se você estiver confortável com a instalação do Windows e não tiver dados que precise preservar em /dev/sdb , poderá ter mais chances de obter sucesso sem causar complicações.

    
por Rod Smith 16.04.2013 / 00:47