На новой системе (кодовое имя для блога - 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
Я оказался перед экраном "минимальный (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