проблема:

При загрузке grub переходит к подсказке (grub>, а не grub rescue>). Мне нужно ввести:

set prefix=(hd0,gpt8)/boot/grub
insmod normal
normal

Чтобы получить нормальное меню grub.

Каждое сообщение, которое я нашел до сих пор, было решено путем выполнения grub-install и/или update-grub после того, как вам удастся загрузить вашу систему.
Я пробовал эти, но проблема не устранена.

< STRONG> детали:

У меня двойная загрузка с Windows 10 и поп-ОС (на основе Ubuntu). У меня ноутбук acer с установленным режимом загрузки UEFI и безопасной загрузкой enabled.

Мои разделы выглядят так:

$ lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,UUID,LABEL,PARTUUID,PARTTYPE
NAME            SIZE FSTYPE MOUNTPOINT UUID                                 LABEL    PARTUUID                             PARTTYPE
sda           238.5G                                                                                                      
├─sda1          529M ntfs              6272EE1672EDEF2B                     Recovery b593e2b8-992e-4d79-9074-d990ba21d10c de94bba4-06d1-4d40-a16a-bfd50179d6ac
├─sda2          100M vfat              64EE-A907                                     6ef6e12c-3858-4a83-a1dd-8297719bd477 c12a7328-f81f-11d2-ba4b-00a0c93ec93b
├─sda3           16M                                                                 1b6ba39a-e528-4cf9-b158-cd1a9312afc2 e3c9e316-0b5c-4db8-817d-f92df00215ae
├─sda4        117.2G ntfs              8E6008B56008A655                              c2f2d5bf-16a3-4e99-a6db-2385b36f3f46 ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
├─sda5         58.6G ntfs              F6D0CCD7D0CC9EED                     Storage  c10e8d39-26c3-4d3b-8548-0aa97816ba0b ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
├─sda6          477M swap              74da5edc-3b6c-4644-a151-6b93562c8fa4          408e91bd-c7e7-4ab8-a2ac-bb2bb7fde375 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f
│ └─cryptswap 476.5M swap   [SWAP]     2d2336c7-64c1-4d53-8e99-f66f9b93bef5                                               
├─sda7          600M vfat   /boot/efi  7565-8082                                     a8c1ff00-3790-4ca0-a360-642e6f1859f0 c12a7328-f81f-11d2-ba4b-00a0c93ec93b
└─sda8           61G ext4   /          d40fe3bd-0749-4c29-9e9b-97a064a659dd          8a3b8567-c511-48cd-a3fa-776b556d17da 0fc63daf-8483-4772-8e79-3d69d8477de4
  • Разделы 1-4 созданы windows, загрузчик стоит на sda2.
  • Раздел 5 создан мной, чтобы легко обмениваться файлами между Windows/Linux.
  • Остальные разделы были созданы поп-осом (после завершения установки винды), загрузчик pop-os находится на sda7.

Я установил grub как:

$ sudo apt install grub-efi
$ sudo grub-install --bootloader-id=grub
Installing for x86_64-efi platform.
Installation finished. No error reported.
$ sudo update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.4.0-7642-generic
Found initrd image: /boot/initrd.img-5.4.0-7642-generic
Found linux image: /boot/vmlinuz-5.4.0-7634-generic
Found initrd image: /boot/initrd.img-5.4.0-7634-generic
Found linux image: /boot/vmlinuz-5.4.0-7629-generic
Found initrd image: /boot/initrd.img-5.4.0-7629-generic
Found linux image: /boot/vmlinuz-5.4.0-7626-generic
Found initrd image: /boot/initrd.img-5.4.0-7626-generic
Found Windows Boot Manager on /dev/sda2@/efi/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for UEFI Firmware Settings
done

После чего мой каталог /boot выглядит так:

$ sudo tree -a /boot
/boot
├── config-5.4.0-7626-generic
├── config-5.4.0-7629-generic
├── config-5.4.0-7634-generic
├── config-5.4.0-7642-generic
├── efi
│   ├── c0cc91f7cdfcb9a597d9db525eb08842
│   ├── EFI
│   │   ├── BOOT
│   │   │   └── BOOTX64.EFI
│   │   ├── Linux
│   │   ├── grub
│   │   │   ├── grub.cfg
│   │   │   └── grubx64.efi
│   │   ├── Pop_OS-d40fe3bd-0749-4c29-9e9b-97a064a659dd
│   │   │   ├── cmdline
│   │   │   ├── initrd.img
│   │   │   ├── initrd.img-previous
│   │   │   ├── vmlinuz.efi
│   │   │   └── vmlinuz-previous.efi
│   │   └── systemd
│   │       └── systemd-bootx64.efi
│   ├── loader
│   │   ├── entries
│   │   │   ├── Pop_OS-current.conf
│   │   │   └── Pop_OS-oldkern.conf
│   │   ├── loader.conf
│   │   └── random-seed
│   └── System Volume Information
│       ├── AadRecoveryPasswordDelete
│       └── ClientRecoveryPasswordRotation
├── grub
│   ├── fonts
│   │   └── unicode.pf2
│   ├── grub.cfg
│   ├── grubenv
│   └── x86_64-efi
│       ├── acpi.mod
|       < files omitted ... > 
│       └── zstd.mod
├── initrd.img -> initrd.img-5.4.0-7642-generic
├── initrd.img-5.3.0-7642-generic
< files omitted ... > 
├── initrd.img.old -> initrd.img-5.4.0-7634-generic
├── System.map-5.4.0-7626-generic
< files omitted ... > 
├── vmlinuz -> vmlinuz-5.4.0-7642-generic
├── vmlinuz-5.4.0-7626-generic
< files omitted ... > 
└── vmlinuz.old -> vmlinuz-5.4.0-7634-generic

16 directories, 314 files

Файлы под /boot/efi/EFI/grub, /boot/efi/EFI/BOOT и /boot/grub недавно добавлены grub-install.

Кроме того, это выглядит хорошо для меня:

$ cat /boot/efi/EFI/grub/grub.cfg 
search.fs_uuid d40fe3bd-0749-4c29-9e9b-97a064a659dd root hd0,gpt8 
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

После перезагрузки я нажал F2 и сумел добавить EFI/grub/grubx64 в начало порядка загрузки. введите здесь описание изображения

После сохранения и выхода я попадаю в подсказку grub.

Затем с помощью команды set я вижу следующий вывод (некоторые записи опущены):

grub> set
cmdpath=(hd0,gpt7)/EFI/grub
grub_cpu=x86_64
grub_platform=efi
prefix=(hd0,gpt7)/EFI/ubuntu
root=(hd0,gpt7)

Я уже потерялся, кажется, был загружен правильный загрузчик (cmdpath=(hd0,gpt7)/EFI/pop), но настройки в EFI/grub/grub.cfg полностью игнорируются. Откуда он берет эти неправильные настройки?

После исправления prefix, как описано выше, я получаю полнофункциональное меню grub с записью для 1. pop-os, 2. резервных изображений pop-os, 3. окон и 4. настройки загрузки. Я пробовал все варианты, и все они работают.

Итак, мне удалось загрузиться в popOs, efibootmgr -v говорит мне следующее:

$ efibootmgr -v
BootCurrent: 0003
Timeout: 0 seconds
BootOrder: 0003,0001,0002,0000,2001,2002,2003
Boot0000* Windows Boot Manager     HD(2,GPT,6ef6e12c-3858-4a83-a1dd-8297719bd477,0x109000,0x32000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)RC
Boot0001* systemd                  PciRoot(0x0)/Pci(0x17,0x0)/Sata(2,0,0)/HD(7,GPT,a8c1ff00-3790-4ca0-a360-642e6f1859f0,0x160d3000,0x12c000)/File(\EFI\systemd\systemd-bootx64.efi)A01 ..
Boot0002* HDD0: HFS256G39TND-N210A PciRoot(0x0)/Pci(0x17,0x0)/Sata(2,0,0)/HD(7,GPT,a8c1ff00-3790-4ca0-a360-642e6f1859f0,0x160d3000,0x12c000)RC
Boot0003* grub                     PciRoot(0x0)/Pci(0x17,0x0)/Sata(2,0,0)/HD(7,GPT,a8c1ff00-3790-4ca0-a360-642e6f1859f0,0x160d3000,0x12c000)/File(\EFI\grub\grubx64.efi)A01 ..
Boot0004* EFI USB Device           RC
Boot0005* EFI DVD/CDROM            RC
Boot0006* EFI Network              RC
Boot2001* EFI USB Device           RC
Boot2002* EFI DVD/CDROM            RC
Boot2003* EFI Network              RC

что, как я ожидаю, должно произойти

  1. Я запускаю grub в (hd0,gpt7)/EFI/grub/grub.efi из прошивки UEFI.
  2. grub читает файл конфигурации по адресу (hd0,gpt7)/EFI/grub/grub.cfg. Это устанавливает root в (hd0,gpt8) и prefix до (hd0,gpt8)/boot/grub.
  3. grub загружает конфигурацию в (hd0,gpt8)/boot/grub/grub.cfg.
  4. grub представляет мне меню, я выбираю ОС, которую хочу загрузить, и продолжаю свой день.

что происходит на самом деле

  1. Я запускаю grub в (hd0,gpt7)/EFI/grub/grub.efi из прошивки UEFI.
  2. grub не читает файл конфигурации в (hd0,gpt7)/EFI/grub/grub.cfg. Вместо этого он устанавливает root в (hd0,gpt7) и prefix до (hd0,gpt7)/boot/ubuntu.

    Я вручную исправляю неверный prefix, как описано выше.
  3. grub загружает конфигурацию в (hd0,gpt8)/boot/grub/grub.cfg.
  4. grub представляет мне меню, я выбираю ОС, которую хочу загрузить, и продолжаю свой день.

что я пробовал:

  • отключение безопасной загрузки (без разницы)
  • повторный запуск grub-install и upgrade-grub (без разницы)
  • sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub --recheck --debug /dev/sda &> grub.log (без разницы, выведите здесь)
0
Sam De Meyer 22 Окт 2020 в 01:14
Вы показываете два раздела vfat, оба установлены как ESP. Как правило, вы можете иметь только один как ESP, но записи для grub и, возможно, UEFI используют UUID и GUID, поэтому флаг больше указывает на то, где установлен загрузчик. И затем у вас есть старая запись UEFI grub в Windows ESP, которая не загружается? Убедитесь, что GUID/partUUID в загрузочной записи UEFI соответствует partuuid. lsblk -o name,mountpoint,label,size,fstype,uuid,partuuid | egrep -v "^loop" и sudo efibootmgr -v
 – 
oldfred
18 Окт 2020 в 16:56
Привет, спасибо за ваш отзыв. Я действительно не знаю, что вы подразумеваете под «оба настроены на ESP», как мне это проверить? Я также поместил вывод команд, которые вы дали, в суть (gist.github. com/SamDM/…). Если я правильно интерпретирую вывод, записи, похоже, совпадают.
 – 
Sam De Meyer
18 Окт 2020 в 17:26
Кроме того, на dev/sda я не вижу файлов, связанных с grub. Я считаю, что все файлы в этом разделе созданы Windows (дерево файлов: gist.github.com /СамДМ/…).
 – 
Sam De Meyer
18 Окт 2020 в 17:31
Если вы посмотрите внимательно, ваша запись «ubuntu» в 0007 использует GUID из sda2. Всплывающая запись, которая отображается по умолчанию, использует sda7. В большинстве Acer вам нужно установить «доверие» при входе, чтобы он работал. Является ли запись Pop «доверенной»? ubuntuforums.org/showthread.php?t=2297947 Многим Acer также требуется обновление UEFI. askubuntu.com/questions/908854/… & askubuntu.com/questions/627416/… & askubuntu.com/questions/ 1217061/…
 – 
oldfred
18 Окт 2020 в 19:19
Да, меня немного озадачивает Boot0007, который указывает на несуществующий файл в файловой системе. Это может быть остаток старой установки Ubuntu. И, может быть, я должен попробовать удалить его. Хотя я сомневаюсь, что это что-то решит, попробовать стоит. Чтобы ответить на ваш вопрос, я действительно добавил запись EFI/pop/grubx64.efi в доверенные загрузчики в настройках прошивки Acer. Это файл, сгенерированный grub-install. Я почти уверен, что эта запись pop также является той, которая загружается с cmdpath=(hd0,gpt7)/EFI/pop в оболочке grub.
 – 
Sam De Meyer
18 Окт 2020 в 21:14

2 ответа

Лучший ответ

Точная причина этой проблемы пока не совсем ясна, но она может иметь какое-то отношение к неправильно настроенным пакетам grub мейнтейнерами popOs.

Мне удалось обойти это, скопировав файлы grub, созданные grub-install, в /boot/efi/EFI/ubuntu. Если вы используете popOs и выполнили grub-install без каких-либо опций, то должно работать следующее:

sudo mv /boot/efi/EFI/pop /boot/efi/EFI/ubuntu

Альтернативный обходной путь, который я не тестировал:

sudo cp /boot/grub/x86_64-efi/grub.efi /boot/efi/EFI/pop/grubx64.efi

Для получения дополнительной информации см. отчет об ошибке.

0
Sam De Meyer 27 Окт 2020 в 19:11

Когда grubx64.efi генерируется grub-mkimage, в него может быть встроено значение по умолчанию prefix.

В Debian это установлено в /EFI/debian, когда grub-mkimage вызывается grub-install; в Ubuntu префикс будет /EFI/ubuntu соответственно. Это приводит к тому, что GRUB сначала читает мини-файл конфигурации, расположенный как /EFI/(debian|ubuntu)/grub.cfg, который обычно содержит всего несколько строк, чтобы перенаправить GRUB туда, где находится каталог/файловая система /boot, чтобы прочитать реальный файл конфигурации из там:

<any configuration lines required to cover complications like software RAID, disk encryption or LVM>
search.fs_uuid <UUID of the filesystem that contains /boot>
set prefix=($root)'/boot/grub' # or just ($root)/grub if /boot is a separate filesystem 
configfile $prefix/grub.cfg

Если вы используете пакет GRUB для Pop!OS, в его значениях по умолчанию grub-install/grub-mkimage может быть похожий остаточный «убунтуизм», если упаковщики Pop не обратили на это достаточного внимания. И поскольку загрузчик UEFI Pop по умолчанию, по-видимому, является gummiboot, а не GRUB, такая ошибка могла остаться незамеченной.

Если вы установили пакет grub-efi-amd64-signed для обеспечения совместимости с безопасной загрузкой, ваш исходный пакет /boot/efi/EFI/pop/grubx64.efi может на самом деле отличаться от /boot/grub/x86_64-efi/grub.efi, так как первый прошел процесс подписания безопасной загрузки и обычно все встроенные модули GRUB.

Возможно, разработчики Pop!OS использовали пакет Ubuntu grub-efi-amd64-signed как есть, не применяя изменения, которые они внесли в версию, не подписанную SecureBoot?


Задний план:

Когда grub-install используется с опцией --uefi-secure-boot или если обнаружена безопасная загрузка, вместо использования grub-mkimage для создания оптимизированного grubx64.efi для системы GRUB устанавливается на , он использует предварительно скомпилированный и подписанный Secure Boot /usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed.

По крайней мере, в Debian это построено с использованием воспроизводимых методов сборки, поэтому с соответствующей версией исходного пакета и отдельным файлом подписи Secure Boot любой может скомпилировать его для себя и убедиться, что результат будет абсолютно идентичен предварительно собранному версия. Правильная работа этой части, по-видимому, была основной причиной, по которой потребовалось некоторое время, чтобы обеспечить поддержку безопасной загрузки в Debian.

1
telcoM 27 Окт 2020 в 02:56
Привет, твой ответ привел меня к решению! Вы правы в том, что поиск EFI/ubuntu/grub.cfg жестко встроен в двоичный файл. Итак, вот что я сделал: sudo mv /boot/efi/EFI/grub /boot/efi/EFI/ubuntu. Затем я сделал перезагрузку и попал прямо в полнофункциональное меню grub с параметрами для popOs (на gpt7 и 8), окнами (на gpt 2 и 4) и настройками прошивки UEFI. Все работает отлично. Это похоже на недосмотр разработчиков popOs. Потому что по умолчанию grub-install помещает (небольшой) файл конфигурации в /boot/efi/EFI/pop.
 – 
Sam De Meyer
27 Окт 2020 в 00:55
Спасибо за подсказки. Если бы вы могли включить мой обходной путь в свой ответ, я приму его как «решенный». Если вас не волнует репутация SO, я опубликую свой собственный ответ, описывающий обходной путь.
 – 
Sam De Meyer
27 Окт 2020 в 00:58
Теперь, когда я знаю, что искать, я также нашел следующий обходной путь (сам не проверял): sudo cp /boot/grub/x86_64-efi/grub.efi /boot/efi/EFI/pop/grubx64.efi. См. github.com/pop-os/pop/issues/1007.
 – 
Sam De Meyer
27 Окт 2020 в 01:17
1
Не стесняйтесь опубликовать свой собственный ответ. Если копирование /boot/grub/x86_64-efi/grub.efi в /boot/efi/EFI/pop/grubx64.efi помогает, возможно, фактический пакет GRUB для Pop!OS теперь исправлен, но исправление, возможно, не было распространено на пакет grub-efi-amd64-signed (который обеспечивает другая копия grubx64.efi, подписанная для безопасной загрузки).
 – 
telcoM
27 Окт 2020 в 02:28