Bug 39794

Summary: Необходимо монтировать efivars на системах с EFI
Product: Sisyphus Reporter: Антон Мидюков <antohami>
Component: startupAssignee: Alexey Gladkov <legion>
Status: CLOSED NOTABUG QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: glebfm, ldv, legion, rider
Version: unstable   
Hardware: all   
OS: Linux   
Bug Depends on:    
Bug Blocks: 33000    

Description Антон Мидюков 2021-03-12 10:57:34 MSK
Необходимо монтировать efivarfs в /sys/firmware/efi/efivars, так как модуль ядра efivars, который предоставляет /sys/firmware/efi/efivars устарел и, начиная с ядра 5.10 собирается только для x86_64. На aarch64 уже словили проблему из-за отсутствия смонтированного efivarаfs. efivarаfs появилась ещё для ядра 3.10. Так что пора. В systemd уже давно монтируется efivarfs.

Добавтить нужно, что-то вроде этого:
# Mount efivarfs
if [ -d /sys/firmware/efi/efivars ]; then
	action "Mounting efivars filesystem:" mount -t efivarfs none /sys/firmware/efi/efivars
fi
Comment 1 Alexey Gladkov 2021-03-12 17:01:26 MSK
Пропишите в /etc/fstab и он смонтируется. Зачем это нужно именно в setup ?
Comment 2 Антон Мидюков 2021-03-12 17:06:17 MSK
(Ответ для Alexey Gladkov на комментарий #1)
> Пропишите в /etc/fstab и он смонтируется. Зачем это нужно именно в setup ?

Так система может быть переносной, грузиться как в EFI, так и без. Особенно это актуально для live.
Comment 3 Alexey Gladkov 2021-03-12 17:17:58 MSK
(Ответ для Антон Мидюков на комментарий #2)
> Так система может быть переносной, грузиться как в EFI, так и без. Особенно
> это актуально для live.

Если это какое-то специальное решение, то сделайте сервис. Для этого они и нужны. Код будет изолирован, понятен и доступен только тем, кому нужно.

Я считаю, что это плохой идеей пихать всё в rc.sysinit. Там должно быть только то без чего нельзя продолжать загрузку.
Comment 4 Антон Мидюков 2021-03-12 19:54:18 MSK
(Ответ для Alexey Gladkov на комментарий #3)
> (Ответ для Антон Мидюков на комментарий #2)
> > Так система может быть переносной, грузиться как в EFI, так и без. Особенно
> > это актуально для live.
> 
> Если это какое-то специальное решение, то сделайте сервис. Для этого они и
> нужны. Код будет изолирован, понятен и доступен только тем, кому нужно.
> 
> Я считаю, что это плохой идеей пихать всё в rc.sysinit. Там должно быть
> только то без чего нельзя продолжать загрузку.

Так то оно так. Вот только пользователи sysvinit, обновив ядро, теряют возможность обновить grub-efi. Даже хуже, модули то обновятся, а grub на ESP разделе нет, так как grub-install ругнётся на то, что переменные EFI не поддерживаются системой. В результате после перезагрузки такая система не загрузится. Как только модуль ядра efivars выкинут из ядра и для x86_64, мы столкнёмся с такой ситуацией.
Comment 5 Dmitry V. Levin 2021-03-12 20:01:36 MSK
В моей системе c EFI по умолчанию /boot вообще не смонтирован, я его монтирую вручную в тех случаях, когда хочу внести туда изменения.  Будет плохо, если в такой системе rc.sysinit начнёт самовольно монтировать /sys/firmware/efi/efivars.
Comment 6 Alexey Gladkov 2021-03-12 20:06:06 MSK
Почему тогда grub-install не смонтирует /sys/firmware/efi/efivars если он ему нужен ?
Comment 7 Антон Мидюков 2021-03-12 20:14:57 MSK
(Ответ для Alexey Gladkov на комментарий #6)
> Почему тогда grub-install не смонтирует /sys/firmware/efi/efivars если он
> ему нужен ?

Было бы неплохо.

Ладно, аргументацию принимаю, багу закрываю.
Comment 8 Anton Farygin 2021-03-13 09:37:07 MSK
Насколько я помню - наличие в системе смонтированного /sys/firmware/efi/efivars является указанием для grub-install использовать EFI mode вместо legacy pc mode.

Т.е. - это индикатор поддержки EFI системой.
Comment 9 Dmitry V. Levin 2021-03-13 13:17:51 MSK
/* Are we running on an EFI-based system? */
static int
is_efi_system (void)
{
  /*
   * Linux uses efivarfs (mounted on /sys/firmware/efi/efivars) to access the
   * EFI variable store. Some legacy systems may still use the deprecated
   * efivars interface (accessed through /sys/firmware/efi/vars). Where both
   * are present, libefivar will use the former in preference, so attempting
   * to load efivars will not interfere with later operations.
   */
  grub_util_exec_redirect_all ((const char * []){ "modprobe", "efivars", NULL },
                               NULL, NULL, "/dev/null");

  grub_util_info ("Looking for /sys/firmware/efi ..");
  if (is_not_empty_directory ("/sys/firmware/efi"))
    {
      grub_util_info ("...found");
      return 1;
    }
  else
    {
      grub_util_info ("... not found");
      return 0;
    }
}
Comment 10 Anton Farygin 2021-03-13 23:26:02 MSK
Да, конечно. удаление модуля efivars и efivarfs ни к чему не приводит - grub всё равно находит efi и устанавливает себя правильно, даже когда efivarfs не смонтировано. Но это на x86_64.
Ему хватает содержимого /sys/firmware/efi/

В полной системе efivarfs смонтирует systemd.
Comment 11 Антон Мидюков 2021-03-14 03:02:55 MSK
(Ответ для Anton Farygin на комментарий #10)
> Да, конечно. удаление модуля efivars и efivarfs ни к чему не приводит - grub
> всё равно находит efi и устанавливает себя правильно, даже когда efivarfs не
> смонтировано. Но это на x86_64.

Как проводился эксперимент?

Я обнаружил, что на x86_64 происходит следующее при установке с livecd с ядром un-def 5.10. Смонтированный в системе /sys/firmware/efi/efivars для чрута в устанавливаемую систему не виден. В результате grub-install загружает модуль efivars из зачрученной системы. Если в чруте модуля efivars нет для запущенной версии ядра, получаем облом. А для aarch64 модуля efivars уже нет. в ядре std-def модуль efivars загружается сам при загрузке системы, так что всё замечательно.

Вот попробуйте зачрутиться с лайва systemd с ядром un-def (live kworkstation 9.1) в систему, где версия ядра отличается, стандартным способом, c монтированием sysfs, но без монтирования /sys/firmware/efi/efivars. grub-install сделать не сможете.
Comment 12 Anton Farygin 2021-03-14 09:42:21 MSK
я в обычной системе выгрузил модули, размонтировал каталог и поставил grub.
Конечно, модуль должен быть доступен.