Полагаю, многие слышали об интерфейсе (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-раздел на жёстком диске уже есть, тогда нам потребуется:
Если что-то пошло не так, можно убрать grub.cfg с EFI-раздела — GRUB запустит свою командную оболочку и можно будет попытаться загрузить ОС оттуда и найти источник проблемы.
Если же всё хорошо, поехали дальше!
Не представляет из себя ничего сложного – нам потребуется только знать UUID диска с Windows и путь к загрузчику от Microsoft bootmgfw.efi (у меня он был расположен в каталоге /EFI/Microsoft/Boot/)
И по аналогии с пунктами меню для загрузки Linux создаём соответствующий пункт для загрузки винды:
Полагаю, что данный пост будет кому-то полезен, поскольку компьютеров с EFI становится всё больше, а информации в Рунете я почти не нашёл.
Ниже я представляю отрывок grub.cfg и ссылки на материалы, без которых я бы вряд ли решил эту проблему:
тема на ЛОРе
раздел статьи о сборке grub-efi
UPD: Большое спасибо за замечания и «варианты попроще»! Если есть ещё ─ не стесняйтесь и пишите: возможно, облегчите жизнь тем, кто столкнётся с моей проблемой и не захочет такого красноглазия.
Суть проблемы
Собственно, испытуемый: 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
UPD: Большое спасибо за замечания и «варианты попроще»! Если есть ещё ─ не стесняйтесь и пишите: возможно, облегчите жизнь тем, кто столкнётся с моей проблемой и не захочет такого красноглазия.