<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>39794</bug_id>
          
          <creation_ts>2021-03-12 10:57:34 +0300</creation_ts>
          <short_desc>Необходимо монтировать efivars на системах с EFI</short_desc>
          <delta_ts>2021-03-14 09:42:21 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>startup</component>
          <version>unstable</version>
          <rep_platform>all</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>NOTABUG</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>33000</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Антон Мидюков">antohami</reporter>
          <assigned_to name="Alexey Gladkov">legion</assigned_to>
          <cc>glebfm</cc>
    
    <cc>ldv</cc>
    
    <cc>legion</cc>
    
    <cc>rider</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>196929</commentid>
    <comment_count>0</comment_count>
    <who name="Антон Мидюков">antohami</who>
    <bug_when>2021-03-12 10:57:34 +0300</bug_when>
    <thetext>Необходимо монтировать 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 &quot;Mounting efivars filesystem:&quot; mount -t efivarfs none /sys/firmware/efi/efivars
fi</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196935</commentid>
    <comment_count>1</comment_count>
    <who name="Alexey Gladkov">legion</who>
    <bug_when>2021-03-12 17:01:26 +0300</bug_when>
    <thetext>Пропишите в /etc/fstab и он смонтируется. Зачем это нужно именно в setup ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196936</commentid>
    <comment_count>2</comment_count>
    <who name="Антон Мидюков">antohami</who>
    <bug_when>2021-03-12 17:06:17 +0300</bug_when>
    <thetext>(Ответ для Alexey Gladkov на комментарий #1)
&gt; Пропишите в /etc/fstab и он смонтируется. Зачем это нужно именно в setup ?

Так система может быть переносной, грузиться как в EFI, так и без. Особенно это актуально для live.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196937</commentid>
    <comment_count>3</comment_count>
    <who name="Alexey Gladkov">legion</who>
    <bug_when>2021-03-12 17:17:58 +0300</bug_when>
    <thetext>(Ответ для Антон Мидюков на комментарий #2)
&gt; Так система может быть переносной, грузиться как в EFI, так и без. Особенно
&gt; это актуально для live.

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

Я считаю, что это плохой идеей пихать всё в rc.sysinit. Там должно быть только то без чего нельзя продолжать загрузку.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196940</commentid>
    <comment_count>4</comment_count>
    <who name="Антон Мидюков">antohami</who>
    <bug_when>2021-03-12 19:54:18 +0300</bug_when>
    <thetext>(Ответ для Alexey Gladkov на комментарий #3)
&gt; (Ответ для Антон Мидюков на комментарий #2)
&gt; &gt; Так система может быть переносной, грузиться как в EFI, так и без. Особенно
&gt; &gt; это актуально для live.
&gt; 
&gt; Если это какое-то специальное решение, то сделайте сервис. Для этого они и
&gt; нужны. Код будет изолирован, понятен и доступен только тем, кому нужно.
&gt; 
&gt; Я считаю, что это плохой идеей пихать всё в rc.sysinit. Там должно быть
&gt; только то без чего нельзя продолжать загрузку.

Так то оно так. Вот только пользователи sysvinit, обновив ядро, теряют возможность обновить grub-efi. Даже хуже, модули то обновятся, а grub на ESP разделе нет, так как grub-install ругнётся на то, что переменные EFI не поддерживаются системой. В результате после перезагрузки такая система не загрузится. Как только модуль ядра efivars выкинут из ядра и для x86_64, мы столкнёмся с такой ситуацией.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196941</commentid>
    <comment_count>5</comment_count>
    <who name="Dmitry V. Levin">ldv</who>
    <bug_when>2021-03-12 20:01:36 +0300</bug_when>
    <thetext>В моей системе c EFI по умолчанию /boot вообще не смонтирован, я его монтирую вручную в тех случаях, когда хочу внести туда изменения.  Будет плохо, если в такой системе rc.sysinit начнёт самовольно монтировать /sys/firmware/efi/efivars.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196942</commentid>
    <comment_count>6</comment_count>
    <who name="Alexey Gladkov">legion</who>
    <bug_when>2021-03-12 20:06:06 +0300</bug_when>
    <thetext>Почему тогда grub-install не смонтирует /sys/firmware/efi/efivars если он ему нужен ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196943</commentid>
    <comment_count>7</comment_count>
    <who name="Антон Мидюков">antohami</who>
    <bug_when>2021-03-12 20:14:57 +0300</bug_when>
    <thetext>(Ответ для Alexey Gladkov на комментарий #6)
&gt; Почему тогда grub-install не смонтирует /sys/firmware/efi/efivars если он
&gt; ему нужен ?

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

Ладно, аргументацию принимаю, багу закрываю.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196947</commentid>
    <comment_count>8</comment_count>
    <who name="Anton Farygin">rider</who>
    <bug_when>2021-03-13 09:37:07 +0300</bug_when>
    <thetext>Насколько я помню - наличие в системе смонтированного /sys/firmware/efi/efivars является указанием для grub-install использовать EFI mode вместо legacy pc mode.

Т.е. - это индикатор поддержки EFI системой.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196948</commentid>
    <comment_count>9</comment_count>
    <who name="Dmitry V. Levin">ldv</who>
    <bug_when>2021-03-13 13:17:51 +0300</bug_when>
    <thetext>/* 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 * []){ &quot;modprobe&quot;, &quot;efivars&quot;, NULL },
                               NULL, NULL, &quot;/dev/null&quot;);

  grub_util_info (&quot;Looking for /sys/firmware/efi ..&quot;);
  if (is_not_empty_directory (&quot;/sys/firmware/efi&quot;))
    {
      grub_util_info (&quot;...found&quot;);
      return 1;
    }
  else
    {
      grub_util_info (&quot;... not found&quot;);
      return 0;
    }
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196952</commentid>
    <comment_count>10</comment_count>
    <who name="Anton Farygin">rider</who>
    <bug_when>2021-03-13 23:26:02 +0300</bug_when>
    <thetext>Да, конечно. удаление модуля efivars и efivarfs ни к чему не приводит - grub всё равно находит efi и устанавливает себя правильно, даже когда efivarfs не смонтировано. Но это на x86_64.
Ему хватает содержимого /sys/firmware/efi/

В полной системе efivarfs смонтирует systemd.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196954</commentid>
    <comment_count>11</comment_count>
    <who name="Антон Мидюков">antohami</who>
    <bug_when>2021-03-14 03:02:55 +0300</bug_when>
    <thetext>(Ответ для Anton Farygin на комментарий #10)
&gt; Да, конечно. удаление модуля efivars и efivarfs ни к чему не приводит - grub
&gt; всё равно находит efi и устанавливает себя правильно, даже когда efivarfs не
&gt; смонтировано. Но это на 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 сделать не сможете.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196958</commentid>
    <comment_count>12</comment_count>
    <who name="Anton Farygin">rider</who>
    <bug_when>2021-03-14 09:42:21 +0300</bug_when>
    <thetext>я в обычной системе выгрузил модули, размонтировал каталог и поставил grub.
Конечно, модуль должен быть доступен.</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>