Дуалбут Windows 7 и Debian Squeeze на компьютере с UEFI

в 16:26, , рубрики: EFI, linux, метки: ,

Полагаю, многие слышали об интерфейсе (U)EFI, который всё чаще и чаще встречается в ПК с процессорами Intel. Несмотря на то, что в Intel любят расписывать преимущества, у загрузки через EFI есть существенный недостаток – установка некоторых ОС, в том числе большинства дистрибутивов Linux (из мне известных EFI «из коробки» недавно начала поддерживать только Ubuntu и её форки). В данном посте я постараюсь изложить «подводные камни» и их решение.

Суть проблемы

Собственно, испытуемый: Sony VAIO SV-E14A1S1R (технические характеристики)

Незадолго до приобретения, возникло желание попробовать какой-нибудь другой дистрибутив помимо Xubuntu и выбор пал на Debian; на случай проблем с интернетом был дополнительно скачан репозиторий (8 DVD).

Итак, ноутбук есть, диски есть, начинаем… И тут же возникает первая проблема: до тех пор, пока я не увидел в настройках биоса переключатель варианта загрузки с EFI на традиционную «Legacy BIOS», установочное меню не появлялось и сразу загружалась Windows.

Однако по завершении установки меня встретило сообщение “Operating system not found” (при этом если не вынимать из дисковода диск с дистрибутивом и выбирать “Загрузиться с первого загрузочного диска”, система загружалась, но кому хочется занимать привод?), а с EFI по-прежнему загружались только форточки.

Решение

Спустя несколько безуспешных циклов установки-переустановки с разными параметрами, в одной из тем ЛОРа я наткнулся на похожую проблему, которую автор темы, по его словам, частично решил, собрав GRUB на виртуальной машине с включенным EFI (возможно, что можно обойтись без виртуальной машины и добраться до Дебиана, но я не проверял).

Предположим, что EFI-раздел на жёстком диске уже есть, тогда нам потребуется:

  • собственно, машина с 64-битным Линукс-дистрибутивом и EFI (я использовал Ubuntu, запущенную из VirtualBox)
  • Исходники GRUB2 (я брал эти, с версиями ниже у меня загрузчик просто не собирался)
  • make, gcc, bison и flex

Собираем EFI-образ GRUB

  • Сначала добываем исходники:
    $ wget ftp://alpha.gnu.org/gnu/grub/grub-1.99~rc2.tar.gz
    $ tar -xvf grub-1.99~rc2.tar.gz
    $ cd ./grub-1.99~rc2
    

  • Компилируем загрузчик:
    $ ./configure --with-platform=efi --target=x86_64
    $ make
    

    После этого каталог будет выглядеть как-то так

  • Создаём EFI-образ:
    $ cd ./grub-core
    $ ../grub-mkimage -d . -o bootx64.efi -O x86_64-efi -p /efi/grub `find *.mod | xargs | sed -e 's/.mod//g'`
    

    Первой командой мы переходим в каталог с модулями GRUB, второй — собираем образ, подключая к нему все имеющееся в каталоге модули.

  • Перемещаем файл на EFI-раздел целевого компьютера (N — порядковый номер раздела)
    # mount /dev/sdaN /mnt
    # mv <путь к bootx64.efi> /mnt/EFI/Boot/bootx64.efi
    

  • В указанный при сборке образа каталог (в данном случае это /efi/grub) перемещаем файлы модулей (*.mod), конфигурационный файл (grub.cfg), шрифты (unicode.pf2) и, если необходимо, языковые файлы и фоновое изображение
    Скорее всего, генерируемый при установке grub.cfg не подойдёт (вряд ли там будут указания основных дисков вроде (hd0, gptN)), и будет проще взять из него UUID'ы дисков и написать новый из шаблона. В конце статьи — отрывок моего grub.cfg, который поможет разобраться.

Если что-то пошло не так, можно убрать grub.cfg с EFI-раздела — GRUB запустит свою командную оболочку и можно будет попытаться загрузить ОС оттуда и найти источник проблемы.

Если же всё хорошо, поехали дальше!

Последние штрихи: добавление Windows 7 в загрузочное меню

Не представляет из себя ничего сложного – нам потребуется только знать UUID диска с Windows и путь к загрузчику от Microsoft bootmgfw.efi (у меня он был расположен в каталоге /EFI/Microsoft/Boot/)

И по аналогии с пунктами меню для загрузки Linux создаём соответствующий пункт для загрузки винды:

menuentry "Windows 7" {
	search --fs-uuid --no-floppy --set=root 48EC-30CC
	set root='(hd0,gpt3)'
	chainloader ($root)/efi/microsoft/boot/bootmgfw.efi
	boot
}

Заключение

Полагаю, что данный пост будет кому-то полезен, поскольку компьютеров с EFI становится всё больше, а информации в Рунете я почти не нашёл.
Ниже я представляю отрывок grub.cfg и ссылки на материалы, без которых я бы вряд ли решил эту проблему:

Часть grub.cfg

set root='(hd0,gpt3)'
set locale_dir=/EFI/Boot/grub/locale
set lang=en
insmod gettext

loadfont ($root)/EFI/grub/unicode.pf2
set timeout=10
set default=0
set gfxmode=640x480
set gfxpayload=keep
terminal_output gfxterm

insmod part_gpt
insmod png
background_image -m normal ($root)/EFI/grub/spacefun-grub.png
 set color_normal=light-gray/black
 set color_highlight=white/black

insmod part_gpt
insmod ext2
search --no-floppy --fs-uuid --set=root 510c2ef3-0412-4d42-ba6b-15d1f680e150

menuentry 'Debian GNU/Linux, with Linux 3.5.3' --class debian --class gnu-linux --class gnu --class os {
	insmod part_gpt
	insmod ext2
	set root='(hd0,gpt7)'
	search --no-floppy --fs-uuid --set=root 510c2ef3-0412-4d42-ba6b-15d1f680e150
	echo	'Loading Linux 3.5.3 ...'
	linux	/boot/vmlinuz-3.5.3 root=UUID=510c2ef3-0412-4d42-ba6b-15d1f680e150 ro  quiet
	echo	'Loading initial ramdisk ...'
	initrd	/boot/initrd.img-3.5.3
}

тема на ЛОРе
раздел статьи о сборке grub-efi

Автор: andre_macareno

Поделиться

* - обязательные к заполнению поля