Страницы

четверг, 7 ноября 2013 г.

Слетел загрузчик grub-efi

На новой системе (кодовое имя для блога - Red box), после обновления установленных дистрибутивов, в какой-то момент испортился загрузчик Grub2. Загрузчик был установлен Grub-efi и загрузка обеспечивалась с помощью встроенного UEFI материнской платы Asrock F2A85X-ITX.
Я оказался перед экраном "минимальный (rescue mode) Grub2". Вещь малопонятная, т.к. ни примеров запуска, ни нормальной справке в интерфейсе этой программы нет и без чтения документации дело дальше не пойдет.
Проблему, с которой я столкнулся, можно обозначить как "Слетел grub efi", "grub не подхатывает конфиг".

Причина, по которой это происходит, не очень понятна. Что это - ошибки создателей и сборщиков пакетов?


Так как ситуация видимо будет повторяться неоднократно, то чтобы не оставаться в непонятной ситуации, я решил написать здесь заметку о процедуре загрузки и исправления grub efi.

Заодно и разобраться с командами доступными во встроенной UEFI  shell (что очень удобно), материнской платы Asrock F2A85X-ITX.

Итак, системный ssd-диск разбит на 4 раздела (GPT разметка):
/dev/sda1 - ESP (EFI system partition) 512MiB - FAT32
/dev/sda2 - MSR 128MiB
/dev/sda3 - Ubuntu 13.10 размером с blu-ray диск (46196MiB) - EXT4
/dev/sda4 - остаток
После раздела MSR, перед каждым разделом пустое место 128MiB.

вывод таблицы разделов для диска Intel 330 SSD 60GB

Disk /dev/sda: 117231408 sectors, 55.9 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): xxxx
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 117231374
Partitions will be aligned on 2048-sector boundaries
Total free space is 526302 sectors (257.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1050623   512.0 MiB   EF00  EFI System
   2         1050624         1312767   128.0 MiB   EF02  Microsoft reserved
   3         1574912        96184319   45.1 GiB    8300  Linux filesystem
   4        96446464       117231374   9.9 GiB     8301  Linux reserved


Система ставилась на этот диск с usb-флешки, загруженной через меню UEFI, в режиме UEFI, что показал черный начальный текстовый экран загрузчика Grub.Загрузчик устанавливался на диск /dev/sda.

Также присутствуют другие диски, которые и позволили загрузиться в установленную систему, с резервных загрузчиков, правда в  BIOS Legacy-mode.




Протестировать EFI в системе:

Выполнить в root-терминале:
root@red# [ -d /sys/firmware/efi ] && echo "EFI boot on HDD" || echo "Legacy boot on HDD"

Т.е. при загрузке в EFI режиме появляется каталог /sys/firmware/efi
а в нём:
root@red:~# ls /sys/firmware/efi/
efivars  systab  vars
В обычном BIOS-режиме, этого каталога нет.

Можно ещё посмотреть в dmesg:
#dmesg | grep efi

efi: EFI v2.31 by American Megatrends
Откуда видна версия EFI используемая материнской платой.


Как загрузить Ubuntu в EFI режиме находясь в сломанном загрузчике GRUB2 "Minimal BASH like".

1. Вывод списка устройств и разделов (их grub-идентификаторов), доступных загрузчику GRUB2.

grub> ls
(hd0), (hd0,gpt2), (hd0,gpt1) и т.п.

2. Задание пути к конфигурационному файлу, если он сохранился.
В моём случае: 
grub> configfile (hd0,gpt3)/boot/grub/grub.cfg
либо, что лучше
grub> configfile (hd0,gpt1)/EFI/ubuntu/grub.cfg

Сразу пойдет меню GRUB2 (если поломка небольшая) и можно загрузиться в EFI-режиме.


3. Если конфигурационного файла нет, то надо указать корень файловой системы, ядро и начальный ramdisk (initrd).
set root=(hd0,gpt3)
linux /vmlinuz root=/dev/sda3
initrd /initrd.img


4. Находясь в системе  Ubuntu, обновить загрузчик
root@red:# update-grub
Генерируется grub.cfg …
Найден образ linux: /boot/vmlinuz-3.11.0-7-generic
Найден образ initrd: /boot/initrd.img-3.11.0-7-generic
Найден образ linux: /boot/vmlinuz-3.11.0-6-generic
Найден образ initrd: /boot/initrd.img-3.11.0-6-generic
Adding boot menu entry for EFI firmware configuration
завершено


5. Если пункт 4 не помог, то можно попробовать отредактировать файл grub.cfg расположенный в разделе efi, по адресу: /EFI/ubuntu/grub.cfg
Обычно, это файл переписывается новым установщиком и там прописываются ссылки на новую систему. Такое бывает в многодисковых системах. Т.е. к примеру, я ставил новую ubuntu в режиме uefi на внешний жесткий диск (sdd), в результате, на системном жестком диске (sda) был переписан файл grub.cfg (в EFI разделе) и система стала грузиться с внешнего диска, а с внутреннего - нет.
Этот файл grub.cfg легко вправить, изменив UUID на UUID старой системы, и указав правильные диски и загрузочный (efi) раздел.


Вот его содержимое (для загрузки с sda), скрыт только  UUID:

search.fs_uuid 00000000-0000-0000-0000-0000000000 root hd0,gpt3
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg


UUID корневой системы можно увидеть выполнив команду:

$ blkid

Так вот, после новой установки, и UUID и root указывали на новую систему:
search.fs_uuid 00000000-0000-0000-0000-0000000000 root hd3,gpt4
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

И всё это находилось на диск sda, на системном разделе efi. А системный раздел efi на внешнем диске был пуст. Потом я его заполнил по аналогии, вручную.




Это какой-то баг установщика Ubuntu. Т.к. при установке, я отслеживал этот момент.

5.b. Переустановить загрузчик используя grub-install и тщательно подобранные опции.

Это тоже может не помочь. Можно случайно установить обычный MBR-загрузчик, что есть плохо.



6. Прописка пункта загрузки в UEFI меню материнской платы
- создание собственной метки:
root@red:# efibootmgr -c -d /dev/sda -p 1 -l \\EFI\\ubuntu\\grubx64.efi -L "Red box"


EFI-загрузка установленной системы Ubuntu 13.10,  находясь в UEFI shell системной платы:


1. Выполнить просмотр файловой системы первого диска (нумерация с 0, список посмотреть можно по команде map):
shell>fs0:

2. Перейти в каталог загрузчика:
fs0:>cd /EFI/ubuntu
3. Исполнить загрузчик:
либо

fs0:/EFI/ubuntu>grubx64.efi

либо, с полным путем, без предыдущей команды:
fs0:/EFI/ubuntu/grubx64.efi

4. Если обычное меню Grub2 не появилось, то передать конфигурационный файл:
grub> configfile (hd0,gpt1)/EFI/ubuntu/grub.cfg

т.е. в UEFI Shell, можно просто запускать загрузчики (с расширением имени файла, efi) указывая полный путь к ним. Синтаксис почти понятен.




НЕ РАБОТАЕТ на плате Asrock F2A85X-ITX:
Прописка пункта загрузки в UEFI меню материнской платы из под UEFI Shell:
1. Просмотреть список загрузочных опций:
Shell> bcfg boot dump -v
2. Добавить опцию будет отображаться как (Red box):
Shell> bcfg boot add 5 fs0:\EFI\ubuntu\grubx64.efi "Red box"
3. Удалить опцию:
Shell> bcfg boot rm 5


Область, где сохраняются опции загрузки в UEFI, называется UEFI NVRAM.

Опция. Утилита efibootmgr для редактирования опций загрузки в UEFI NVRAM


Чтобы просто посмотреть список опций загрузки:
root@red:# efibootmgr
BootCurrent: 0000
Timeout: 3 seconds
BootOrder: 0000,0005,0009
Boot0000* Red box
Boot0005  UEFI: Built-in EFI Shell
Boot0009  Hard Drive



Выводы

UEFI штука хорошая, но малонадежная, т.к. надо очень внимательно вносить изменения в конфигурацию системы, загрузчика и пр. Да и старые навыки управления загрузчиком неадекватны для grub efi.



Ресурсы

- .https://help.ubuntu.com/community/UEFI
- .http://archlinux.org.ru/forum/topic/12327/
- .https://wiki.ubuntu.com/SecurityTeam/SecureBoot
- .http://www.uefi.org/specs/download/UEFI_2.4.pdf