Bug 41945 - grub-install не определяет автоматически target riscv64-efi
Summary: grub-install не определяет автоматически target riscv64-efi
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: grub-efi (show other bugs)
Version: unstable
Hardware: riscv64 Linux
: P5 normal
Assignee: Ivan A. Melnikov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-02-15 05:42 MSK by Антон Мидюков
Modified: 2022-02-17 15:25 MSK (History)
5 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Антон Мидюков 2022-02-15 05:42:15 MSK
Для воспроизведения проблемы выполнить:
grub-install --removable

Установка проходит успешно, если выполнить:
grub-install --removable --target=riscv64-efi

Проблема мешает установки с iso образа.
Comment 1 Ivan A. Melnikov 2022-02-15 09:10:29 MSK
Если я правильно читаю исходники, это должно быть исправлено в апстримном коммите 11268841e2e0130a862d15fce86d42cd6501bb49, вошедшем в grub 2.06.

Я пробовал собрать grub 2.06 под riscv64 с нужными патчами, правда пока не тестировал совсем, мне только было интересно, из чего нужные патчи состоят. Видимо, пора всё-таки взяться за обновление.

Сейчас запустил пересобраться ещё раз, где-то через полчаса, надеюсь, можно будет пробовать.

#16081 BUILDING #2 [locked] [test-only] sisyphus_riscv64 srpm=grub-2.06-alt0.5.rv64.src.rpm

2jqt4@ Дмитрий, мне понадобится Ваша помощь. Вы сейчас лучше представляете себе нужные сценарии работы grub.
Comment 2 Ivan A. Melnikov 2022-02-15 13:19:03 MSK
В задаче 16081 на gyle-riscv собрался grub-2.06-alt0.5.rv64.src.rpm.

При попытке обновления в qemu (это simply slinux-20211224-riscv64.img, обновлённый до текущего sisyphus_riscv64 и ядра) вылезло:

modprobe: FATAL: Module efivars not found in directory /lib/modules/5.16.8-un-def-alt2.rv64
/boot/efi/EFI/altlinux/grub*.efi is missing, not fatal yet.

/boot/efi/EFI/BOOT/grub*.efi is missing too. Fatal.
Nothing to update. Please run: grub-install && grub-efi-autoupdate

If your system lacks NVRAM or you are getting persistent errors, please
run: grub-install --removable && grub-efi-autoupdate

Cleaning up / removing...
3: grub-efi-2.04-alt3.rv64
4: grub-common-2.04-alt3.rv64
/boot/efi/EFI/altlinux/grub*.efi is missing, not fatal yet.

/boot/efi/EFI/BOOT/grub*.efi is missing too. Fatal.
Nothing to update. Please run: grub-install && grub-efi-autoupdate

If your system lacks NVRAM or you are getting persistent errors, please
run: grub-install --removable && grub-efi-autoupdate

И после перезагрузки экран grub'а от старого grub'а (2.04).

`grub-install --removable` отрабатывает, правильно определяя платформу:

# grub-install --removable
Installing for riscv64-efi platform.

Installation finished. No error reported.

Просто grub-install -- нет:

# grub-install
Installing for riscv64-efi platform.
Could not prepare Boot variable: Read-only file system
grub-install: error: efibootmgr failed to register the boot entry: Input/output error.

grub-efi-autoupdate не хочет работать точно так же:

# grub-efi-autoupdate
Updating grub in /boot/efi
Installing for riscv64-efi platform.
Could not prepare Boot variable: Read-only file system
grub-install: error: efibootmgr failed to register the boot entry: Input/output error.


Попробовал помочь с read-only filesystem, помог, но не сильно:

# mount /sys/firmware/efi/efivars -o remount,rw
# grub-efi-autoupdate
Updating grub in /boot/efi
Installing for riscv64-efi platform.
grub-install: error: efibootmgr failed to register the boot entry: Unknown error -1.


Пока думаю.
Comment 3 Антон Мидюков 2022-02-15 13:23:00 MSK
Просто grub-install работать не будет, так как нет NVRAM. Только removable.
Comment 4 Ivan A. Melnikov 2022-02-15 13:24:43 MSK
> grub-install: error: efibootmgr failed to register the boot entry: Unknown error -1.

Однако после всех этих экспериментов и перезагрузки я уже увидел экран grub 2.06 (сверху версия), который вполне прилично загрузил систему. Хм.
Comment 5 Ivan A. Melnikov 2022-02-15 13:28:54 MSK
(In reply to Антон Мидюков from comment #3)
> Просто grub-install работать не будет, так как нет NVRAM. Только removable.

Мне не нравится, что рекомендованная cкриптами пакета команда, даже вторая (grub-install --removable && grub-efi-autoupdate), при обновлении grub завершается ошибкой. Мне вообще не нравится, что после обновления нужно вызывать какую-то команду.

Но если это нормально и так же примерно ведёт себя, например, на aarch64, или, например, нам просто надо было образы по-другому готовить, то и ладно.
Comment 6 Антон Мидюков 2022-02-15 13:32:34 MSK
(Ответ для Ivan A. Melnikov на комментарий #5)
> (In reply to Антон Мидюков from comment #3)
> > Просто grub-install работать не будет, так как нет NVRAM. Только removable.
> 
> Мне не нравится, что рекомендованная cкриптами пакета команда, даже вторая
> (grub-install --removable && grub-efi-autoupdate), при обновлении grub
> завершается ошибкой. Мне вообще не нравится, что после обновления нужно
> вызывать какую-то команду.

Надо багу на основной grub-efi по этому поводу повесить.
Comment 7 Anton Farygin 2022-02-15 13:39:25 MSK
на x86 ничего дополнительного вызывать не надо.
Comment 8 Антон Мидюков 2022-02-15 13:54:28 MSK
(Ответ для Anton Farygin на комментарий #7)
> на x86 ничего дополнительного вызывать не надо.

Там, где есть NVRAM. А где нет, надо.
Предлагаю рассмотреть такой сценарий использования.
Есть система, которую пользователь носит на переносном SSD. Эту систему тоже нужно обновлять. Но в NVRAM писать не нужно. При обновлении ожидается, что grub обновится в режиме removable, а не установит в NVRAM.
Если нет /boot/efi/EFI/altlinux, но есть /boot/efi/EFI/BOOT/ то при обновлении grub-efi не нужно делать grub-install, нужно делать grub-install --removable.
Если нет ни того, ни другого, вообще ничего делать не нужно.
Хотелось бы такую логику для такого сценария использования.
Comment 9 Ivan A. Melnikov 2022-02-15 15:05:00 MSK
> /boot/efi/EFI/BOOT/grub*.efi is missing too. Fatal.

Не понятно, почему в EFI/BOOT ищется grub*.efi. Вот кусок grub-install.c после применения всех патчей:


```
       if (removable)
         {
           /* The specification makes stricter requirements of removable
              devices, in order that only one image can be automatically loaded
              from them.  The image must always reside under /EFI/BOOT, and it
              must have a specific file name depending on the architecture.
           */
           efi_distributor = "BOOT";
           if (!efi_suffix)
             grub_util_error ("%s", _("You've found a bug"));
           efi_file = xasprintf ("BOOT%s.EFI", efi_suffix_upper);
         }
       else
         {
           /* It is convenient for each architecture to have a different
              efi_file, so that different versions can be installed in parallel.
           */
           efi_file = xasprintf ("grub%s.efi", efi_suffix);
         }
```

Если используется removable, в EFI/BOOT должен лежать BOOT*.efi. Так он и делает, по крайней мере на riscv64.

Код из grub-efi-autoupdate, который ищет EFI/BOOT/grub*.efi, появился в http://git.altlinux.org/gears/g/grub.git?a=commitdiff;h=3af85716bdb15e6434d37e76ff3e29a02eba3425

Похоже на баг в этом коммите, но может я чего-то не знаю, я в grub недавно полез.

2nickel@: Николай, что скажете?
Comment 10 Ivan A. Melnikov 2022-02-15 15:31:41 MSK
(In reply to Ivan A. Melnikov from comment #9)
> Код из grub-efi-autoupdate, который ищет EFI/BOOT/grub*.efi, появился в
> http://git.altlinux.org/gears/g/grub.git?a=commitdiff;
> h=3af85716bdb15e6434d37e76ff3e29a02eba3425
> 
> Похоже на баг в этом коммите, но может я чего-то не знаю, я в grub недавно
> полез.

Я полистал спецификацию UEFI и решил, что надо, как минимум, так:

http://git.altlinux.org/people/iv/packages/?p=grub.git;a=commitdiff;h=37f49df00955dd0ec746603af1a56e31e35902a3

Ждём:

#16975 AWAITING #1 [test-only] sisyphus_riscv64 grub.git=2.06-alt0.5.rv64.1
Comment 11 Антон Мидюков 2022-02-15 15:53:26 MSK
(Ответ для Ivan A. Melnikov на комментарий #10)
> (In reply to Ivan A. Melnikov from comment #9)
> > Код из grub-efi-autoupdate, который ищет EFI/BOOT/grub*.efi, появился в
> > http://git.altlinux.org/gears/g/grub.git?a=commitdiff;
> > h=3af85716bdb15e6434d37e76ff3e29a02eba3425
> > 
> > Похоже на баг в этом коммите, но может я чего-то не знаю, я в grub недавно
> > полез.
> 
> Я полистал спецификацию UEFI и решил, что надо, как минимум, так:
> 
> http://git.altlinux.org/people/iv/packages/?p=grub.git;a=commitdiff;
> h=37f49df00955dd0ec746603af1a56e31e35902a3
> 
> Ждём:
> 
> #16975 AWAITING #1 [test-only] sisyphus_riscv64 grub.git=2.06-alt0.5.rv64.1

Николай ориентировался на Secure Boot. Его патч работает только на x86_64.
Comment 12 Ivan A. Melnikov 2022-02-15 17:06:47 MSK
(In reply to Ivan A. Melnikov from comment #10)
> Я полистал спецификацию UEFI и решил, что надо, как минимум, так:
> 
> http://git.altlinux.org/people/iv/packages/?p=grub.git;a=commitdiff;
> h=37f49df00955dd0ec746603af1a56e31e35902a3

А вот нет, расширение тоже должно быть заглавными буквами:

http://git.altlinux.org/people/iv/packages/?p=grub.git;a=commitdiff;h=e2f359146bc70c0b0e2c4793b8d83d0ac373ad8a

Попробуем ещё раз:

#16980 BUILDING #1 [locked] [test-only] sisyphus_riscv64 grub.git=2.06-alt0.5.rv64.2
Comment 13 Николай Костригин 2022-02-15 17:42:57 MSK
(Ответ для Ivan A. Melnikov на комментарий #9)
> > /boot/efi/EFI/BOOT/grub*.efi is missing too. Fatal.
> 
> Не понятно, почему в EFI/BOOT ищется grub*.efi. Вот кусок grub-install.c
> после применения всех патчей:
> 
[...]
> 
> 2nickel@:  Николай, что скажете?

Дело в том, что на x86_64 BOOTX64.EFI - это не grub, a переименованный shim. Заменив его на grub потеряем загружаемость системы в Secure Boot.
Я подумаю как можно разрулить сложившуюся ситуацию.
Comment 14 Ivan A. Melnikov 2022-02-15 18:08:47 MSK
(In reply to Николай Костригин from comment #13)
> (Ответ для Ivan A. Melnikov на комментарий #9)
> > > /boot/efi/EFI/BOOT/grub*.efi is missing too. Fatal.
> > 
> > Не понятно, почему в EFI/BOOT ищется grub*.efi. Вот кусок grub-install.c
> > после применения всех патчей:
> > 
> [...]
> > 
> > 2nickel@:  Николай, что скажете?
> 
> Дело в том, что на x86_64 BOOTX64.EFI - это не grub, a переименованный shim.
> Заменив его на grub потеряем загружаемость системы в Secure Boot.

Думаю, в этом файле может быть и переименованный grub, если на этой системе не использовался secure boot, а использовался grub --removable. Или даже что угодно.

> Я подумаю как можно разрулить сложившуюся ситуацию.

Спасибо. Я думаю, стоит завести для этого другой баг.

Пока же в sisyphus_riscv64 я готов собрать grub с моим вариантом  исправления grub-efi-autoupdate. В тривиальном случае обновление проходит, будем тестировать что-то более интересное.
Comment 15 Anton Farygin 2022-02-15 18:11:38 MSK
А почему в этом месте нельзя проверить оба варианта ?
 $EFI_DIR/EFI/BOOT/BOOT*.EFI и GRUB*.EFI ?
Comment 16 Ivan A. Melnikov 2022-02-15 18:19:41 MSK
(In reply to Ivan A. Melnikov from comment #14)
> > Я подумаю как можно разрулить сложившуюся ситуацию.
> 
> Спасибо. Я думаю, стоит завести для этого другой баг.

https://bugzilla.altlinux.org/41959
Comment 17 Николай Костригин 2022-02-15 18:20:28 MSK
(Ответ для Anton Farygin на комментарий #15)
> А почему в этом месте нельзя проверить оба варианта ?
>  $EFI_DIR/EFI/BOOT/BOOT*.EFI и GRUB*.EFI ?

Проверить можно.
Просто напомню, что наличие EFI/BOOT - это не признак "--removable" установки после того, как его добавили для объезда ошибок в некоторых новых UEFI-прошивках (где основная загрузочная запись пропадала при отсутствии EFI\BOOT).

Раньше в усложнении условий в efi-boot-autoupdate не было необходимости, а сейчас просто придется рассмотреть все возможные варианты.
Comment 18 Ivan A. Melnikov 2022-02-15 18:21:28 MSK
(In reply to Anton Farygin from comment #15)
> А почему в этом месте нельзя проверить оба варианта ?
>  $EFI_DIR/EFI/BOOT/BOOT*.EFI и GRUB*.EFI ?

Пойдёмте в #41959.
Comment 19 Ivan A. Melnikov 2022-02-17 15:21:43 MSK
[#16998] DONE (try 2) grub.git=2.06-alt0.5.rv64.3

Завтра приедет.
Comment 20 Антон Мидюков 2022-02-17 15:25:38 MSK
(Ответ для Ivan A. Melnikov на комментарий #19)
> [#16998] DONE (try 2) grub.git=2.06-alt0.5.rv64.3
> 
> Завтра приедет.

Спасибо!