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

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

    <bug>
          <bug_id>60316</bug_id>
          
          <creation_ts>2026-08-30 14:32:27 +0300</creation_ts>
          <short_desc>grub-efi-install без проверки перезаписывает EFI резервный файл</short_desc>
          <delta_ts>2026-09-16 10:30:13 +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>grub-efi</component>
          <version>unstable</version>
          <rep_platform>x86_64</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>ASSIGNED</bug_status>
          <resolution></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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Жора Змейкин">me</reporter>
          <assigned_to name="Egor Ignatov">egori</assigned_to>
          <cc>egori</cc>
    
    <cc>nickel</cc>
    
    <cc>placeholder</cc>
    
    <cc>rider</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>293570</commentid>
    <comment_count>0</comment_count>
      <attachid>22085</attachid>
    <who name="Жора Змейкин">me</who>
    <bug_when>2026-08-30 14:32:27 +0300</bug_when>
    <thetext>Created attachment 22085
Набросок патча

Сейчас grub-efi-install, когда доступен shim и готовый EFI-образ GRUB, безусловно пытается записать ALT shim в EFI/BOOT/BOOTX64.EFI. В исходном случае операция закончилась ошибкой «mv: File exists», о чём я написал здесь:
https://bugzilla.altlinux.org/show_bug.cgi?id=59632#c5

Проблем здесь две. Если на ESP уже лежит строчный bootx64.efi, а раздел смонтирован с iocharset=utf8, обращение к BOOTX64.EFI может его не найти. Скрипт создаёт BOOTX64.EFI.new, но mv получает EEXIST, и установка обрывается до регистрации ALT в NVRAM. Параметры монтирования исправляются отдельно в guile-evms, но после этого текущий код просто начнёт успешно перезаписывать существующий резервный файл.

При этом grub-efi-install никак не проверяет, кому принадлежит файл. В EFI/BOOT/BOOTX64.EFI может вообще находиться загрузчик Windows или другого дистрибутива, что в редких случаях может сломать двойную загрузку.

В этом плане мне нравится поведение как у openSUSE: отсутствующий резервный файл устанавливать, собственный обновлять, а чужой или неизвестный оставлять без изменений. Я попытался повторить такой подход и набросал патч, он проверяет vendor-запись SBAT и ищет резервный файл без учёта регистра</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>299014</commentid>
    <comment_count>1</comment_count>
    <who name="Egor Ignatov">egori</who>
    <bug_when>2026-09-16 10:29:37 +0300</bug_when>
    <thetext>(In reply to Жора Змейкин from comment #0)
&gt; Created attachment 22085 [details]
&gt; Набросок патча
&gt; 
&gt; Сейчас grub-efi-install, когда доступен shim и готовый EFI-образ GRUB,
&gt; безусловно пытается записать ALT shim в EFI/BOOT/BOOTX64.EFI. В исходном
&gt; случае операция закончилась ошибкой «mv: File exists», о чём я написал здесь:
&gt; https://bugzilla.altlinux.org/show_bug.cgi?id=59632#c5
&gt; 
&gt; Проблем здесь две. Если на ESP уже лежит строчный bootx64.efi, а раздел
&gt; смонтирован с iocharset=utf8, обращение к BOOTX64.EFI может его не найти.
&gt; Скрипт создаёт BOOTX64.EFI.new, но mv получает EEXIST, и установка
&gt; обрывается до регистрации ALT в NVRAM. Параметры монтирования исправляются
&gt; отдельно в guile-evms, но после этого текущий код просто начнёт успешно
&gt; перезаписывать существующий резервный файл.

Описал решение в https://bugzilla.altlinux.org/show_bug.cgi?id=59632#c6

&gt; При этом grub-efi-install никак не проверяет, кому принадлежит файл. В
&gt; EFI/BOOT/BOOTX64.EFI может вообще находиться загрузчик Windows или другого
&gt; дистрибутива, что в редких случаях может сломать двойную загрузку.

grub-efi-install не должен проверять кому принадлежит файл, его задача - установить grub в одном из доступных режимов. А вот необходимость установки(обновления) и режим выбирает grub-efi-autoupdate[1].

&gt; В этом плане мне нравится поведение как у openSUSE: отсутствующий резервный
&gt; файл устанавливать, собственный обновлять, а чужой или неизвестный оставлять
&gt; без изменений. Я попытался повторить такой подход и набросал патч, он
&gt; проверяет vendor-запись SBAT и ищет резервный файл без учёта регистра

Сейчас grub-efi-autoupdate для обхода проблем некоторых прошивок всегда делает установку в режиме &quot;force extra removable&quot;, то есть при установке в EFI\altlinux делает копию в EFI\BOOT.

При необходимости в рамках этого бага можем обсудить:
1. Дополнительные режимы установки для grub-efi-install (например установка для Secure Boot только в EFI\altlinux\, хоть это и противоречит документации shim[2])
2. Улучшения логики автоопределения режима обновления в grub-efi-autoupdate (продолжение https://bugzilla.altlinux.org/41959)


[1] https://git.altlinux.org/gitoskop/#/gears/g/grub.git/-/blob/sisyphus/altlinux/grub-efi-autoupdate
[2] https://github.com/rhboot/shim/blob/72fd4b70e7562d25234204249462da97080ef56f/README.fallback#L23</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>22085</attachid>
            <date>2026-08-30 14:32:27 +0300</date>
            <delta_ts>2026-08-30 14:32:27 +0300</delta_ts>
            <desc>Набросок патча</desc>
            <filename>0001-grub-efi-install-preserve-foreign-extra-fallback.patch</filename>
            <type>text/plain</type>
            <size>4119</size>
            <attacher name="Жора Змейкин">me</attacher>
            
              <data encoding="base64">RnJvbSBlODIyNTBhNTk5MDdhMThmNmFjNDMwZjQ4ZDhmOWJhMGM3ODlhZmFmIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBaaG9yYSBabWV5a2luIDxtZUBrYXR6ZS05NDIucnU+CkRhdGU6
IFR1ZSwgMjUgQXVnIDIwMjYgMDI6MTU6MDAgKzAzMDAKU3ViamVjdDogZ3J1Yi1lZmktaW5zdGFs
bDogcHJlc2VydmUgdW5yZWNvZ25pemVkIGV4dHJhIGZhbGxiYWNrCgpXaGVuIGdydWItZWZpLWlu
c3RhbGwgcnVucyBpbiBTRUNVUkVfQk9PVCBtb2RlIHdpdGhvdXQgLS1yZW1vdmFibGUsIGxvY2F0
ZSBhbgpleGlzdGluZyBFRkkvQk9PVCBmYWxsYmFjayB3aXRob3V0IHJlbHlpbmcgb24gYSBsb29r
dXAgb2YgaXRzIGNhbm9uaWNhbAp1cHBlcmNhc2UgbmFtZS4gVGhpcyBhbHNvIGhhbmRsZXMgVkZB
VCBlbnRyaWVzIHdob3NlIHN0b3JlZCBzcGVsbGluZyBkaWZmZXJzCmluIGNhc2UuCgpPbmx5IHVw
ZGF0ZSBhbiBleGlzdGluZyBmYWxsYmFjayB3aGVuIGl0cyBsYXN0IFNCQVQgdmVuZG9yIHJvdyBp
ZGVudGlmaWVzIGFuCkFMVCBMaW51eCBzaGltIG9yIEdSVUIgYmluYXJ5LiBQcmVzZXJ2ZSB1bnJl
Y29nbml6ZWQgZmFsbGJhY2sgYnVuZGxlcyB3aGlsZQphbGxvd2luZyB2ZW5kb3ItZmlsZSBpbnN0
YWxsYXRpb24gYW5kIG5vcm1hbCBOVlJBTSBoYW5kbGluZyB0byBjb21wbGV0ZS4KLS0tCiBhbHRs
aW51eC9ncnViLWVmaS1pbnN0YWxsIHwgNjQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKy0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgNTYgaW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMo
LSkKCmRpZmYgLS1naXQgYS9hbHRsaW51eC9ncnViLWVmaS1pbnN0YWxsIGIvYWx0bGludXgvZ3J1
Yi1lZmktaW5zdGFsbAppbmRleCA2ZTI1NzgyZWYuLjMwYzc3NzExOCAxMDA3NTUKLS0tIGEvYWx0
bGludXgvZ3J1Yi1lZmktaW5zdGFsbAorKysgYi9hbHRsaW51eC9ncnViLWVmaS1pbnN0YWxsCkBA
IC0zOSw2ICszOSw3IEBAIG9wdF90YXJnZXQ9IiIKIG9wdF9tb2RlPSJhdXRvIgogb3B0X3ZlcmJv
c2U9MAogb3B0X2RyeV9ydW49MAorc2VjdXJlX2Jvb3RfZXh0cmFfZmFsbGJhY2tfbWFuYWdlZD0w
CiBncnViX2luc3RhbGxfZXh0cmFfYXJncz0oKQogCiBHUlVCX1NZU0NPTkY9Ii9ldGMvc3lzY29u
ZmlnL2dydWIyIgpAQCAtMzQ1LDYgKzM0Niw1MiBAQCBzYWZlX2NvcHkoKSB7CiAgICAgdmVyYm9z
ZSAiY29waWVkICRzcmMgLT4gJGRzdCIKIH0KIAorIyAtLS0gRUZJIGJpbmFyeSBvd25lcnNoaXAg
LS0tCisKK2lzX2FsdF9mYWxsYmFjaygpIHsKKyAgICBsb2NhbCBlZmlfYmluYXJ5PSIkMSIKKyAg
ICBsb2NhbCB2ZW5kb3JfbmFtZT0iIiB2ZW5kb3JfcGFja2FnZV9uYW1lPSIiIGxhc3Rfc2JhdF9l
bnRyeT0iIgorCisgICAgWyAtciAiJGVmaV9iaW5hcnkiIF0gfHwgcmV0dXJuIDEKKworICAgIGxh
c3Rfc2JhdF9lbnRyeT0iJChncnViLWR1bXBzYmF0ICIkZWZpX2JpbmFyeSIgMj4vZGV2L251bGwg
fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyIC1kICdcMCcgfCB0YWlsIC1uMSkiIHx8
IHJldHVybiAxCisKKyAgICBJRlM9LCByZWFkIC1yIF8gXyB2ZW5kb3JfbmFtZSB2ZW5kb3JfcGFj
a2FnZV9uYW1lIF8gXyBcCisgICAgICAgIDw8PCAiJGxhc3Rfc2JhdF9lbnRyeSIKKworICAgIFsg
IiR2ZW5kb3JfbmFtZSIgPSAiQUxUIExpbnV4IiBdIHx8IHJldHVybiAxCisKKyAgICBjYXNlICIk
dmVuZG9yX3BhY2thZ2VfbmFtZSIgaW4KKyAgICAgICAgc2hpbXxncnViKSByZXR1cm4gMCA7Owor
ICAgICAgICAqKSAgICAgICAgIHJldHVybiAxIDs7CisgICAgZXNhYworfQorCitpbnN0YWxsX3Nl
Y3VyZV9ib290X2V4dHJhX2ZhbGxiYWNrKCkgeworICAgIGxvY2FsIGJvb3RfZGlyPSIkMSIgc2hp
bV9zcmM9IiQyIiBtbV9zcmM9IiQzIiBmYl9zcmM9IiQ0IgorICAgIGxvY2FsIGZhbGxiYWNrCisK
KyAgICAjIFVzZSB0aGUgc3BlbGxpbmcgcmV0dXJuZWQgYnkgdGhlIGRpcmVjdG9yeSBzY2FuOiB1
cHBlcmNhc2UgbG9va3VwIG1heQorICAgICMgZmFpbCBvbiBWRkFUIG1vdW50ZWQgd2l0aCBhbiBp
bmNvbXBhdGlibGUgaW9jaGFyc2V0LgorICAgIGZhbGxiYWNrPSIkKGZpbmQgIiRib290X2RpciIg
LW1heGRlcHRoIDEgXAorICAgICAgICAtaW5hbWUgIkJPT1Qke2VmaV9zdWZmaXhfdXBwZXJ9LkVG
SSIgLXByaW50IC1xdWl0KSIKKyAgICBmYWxsYmFjaz0iJHtmYWxsYmFjazotJGJvb3RfZGlyL0JP
T1Qke2VmaV9zdWZmaXhfdXBwZXJ9LkVGSX0iCisKKyAgICBpZiBbIC1lICIkZmFsbGJhY2siIF07
IHRoZW4KKyAgICAgICAgaWYgISBpc19hbHRfZmFsbGJhY2sgIiRmYWxsYmFjayI7IHRoZW4KKyAg
ICAgICAgICAgIGluZm8gInByZXNlcnZpbmcgZXhpc3RpbmcgdW5yZWNvZ25pemVkIGZhbGxiYWNr
OiAkZmFsbGJhY2siCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBmaQorICAgICAgICB2
ZXJib3NlICJ1cGRhdGluZyBleGlzdGluZyBBTFQgZmFsbGJhY2s6ICRmYWxsYmFjayIKKyAgICBm
aQorCisgICAgc2VjdXJlX2Jvb3RfZXh0cmFfZmFsbGJhY2tfbWFuYWdlZD0xCisgICAgc2FmZV9j
b3B5ICIkc2hpbV9zcmMiICIkZmFsbGJhY2siCisgICAgc2FmZV9jb3B5ICIkbW1fc3JjIiAgICIk
Ym9vdF9kaXIvbW0ke2VmaV9zdWZmaXh9LmVmaSIKKyAgICBzYWZlX2NvcHkgIiRmYl9zcmMiICAg
IiRib290X2Rpci9mYiR7ZWZpX3N1ZmZpeH0uZWZpIgorfQorCiAjIC0tLSBncnViLWluc3RhbGwg
LS0tCiAKIHJ1bl9ncnViX2luc3RhbGwoKSB7CkBAIC00MDcsOSArNDU0LDggQEAgaW5zdGFsbF9z
ZWN1cmVfYm9vdCgpIHsKICAgICAgICAgc2FmZV9jb3B5ICIkZ3J1Yl9zcmMiICIkdmVuZG9yX2Rp
ci9ncnViJHtlZmlfc3VmZml4fS5lZmkiCiAgICAgICAgIGdlbmVyYXRlX2dydWJfY2ZnICIkdmVu
ZG9yX2RpciIKICAgICAgICAgZ2VuZXJhdGVfYm9vdF9jc3YgIiR2ZW5kb3JfZGlyIgotICAgICAg
ICBzYWZlX2NvcHkgIiRzaGltX3NyYyIgIiRib290X2Rpci9CT09UJHtlZmlfc3VmZml4X3VwcGVy
fS5FRkkiCi0gICAgICAgIHNhZmVfY29weSAiJG1tX3NyYyIgICAiJGJvb3RfZGlyL21tJHtlZmlf
c3VmZml4fS5lZmkiCi0gICAgICAgIHNhZmVfY29weSAiJGZiX3NyYyIgICAiJGJvb3RfZGlyL2Zi
JHtlZmlfc3VmZml4fS5lZmkiCisgICAgICAgIGluc3RhbGxfc2VjdXJlX2Jvb3RfZXh0cmFfZmFs
bGJhY2sgXAorICAgICAgICAgICAgIiRib290X2RpciIgIiRzaGltX3NyYyIgIiRtbV9zcmMiICIk
ZmJfc3JjIgogICAgIGZpCiB9CiAKQEAgLTQ3OCwxMSArNTI0LDEzIEBAIGNsZWFudXBfZXNwKCkg
ewogICAgICAgICAgICAgICAgICAgICAic2hpbSR7ZWZpX3N1ZmZpeH0uZWZpIiBcCiAgICAgICAg
ICAgICAgICAgICAgICJCT09UJHtlZmlfc3VmZml4X3VwcGVyfS5DU1YiCiAgICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgICAgY2xlYW51cF9zdGFsZV9maWxlcyAiJGJvb3RfZGlyIiBcCi0g
ICAgICAgICAgICAgICAgICAgICJncnViJHtlZmlfc3VmZml4fS5lZmkiIFwKLSAgICAgICAgICAg
ICAgICAgICAgImdydWIuY2ZnIiBcCi0gICAgICAgICAgICAgICAgICAgICJzaGltJHtlZmlfc3Vm
Zml4fS5lZmkiIFwKLSAgICAgICAgICAgICAgICAgICAgIkJPT1Qke2VmaV9zdWZmaXhfdXBwZXJ9
LkNTViIKKyAgICAgICAgICAgICAgICBpZiBbICIkc2VjdXJlX2Jvb3RfZXh0cmFfZmFsbGJhY2tf
bWFuYWdlZCIgPSAxIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgY2xlYW51cF9zdGFsZV9m
aWxlcyAiJGJvb3RfZGlyIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiZ3J1YiR7ZWZpX3N1
ZmZpeH0uZWZpIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiZ3J1Yi5jZmciIFwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICJzaGltJHtlZmlfc3VmZml4fS5lZmkiIFwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICJCT09UJHtlZmlfc3VmZml4X3VwcGVyfS5DU1YiCisgICAgICAgICAgICAg
ICAgZmkKICAgICAgICAgICAgICAgICBjbGVhbnVwX3N0YWxlX2ZpbGVzICIkdmVuZG9yX2RpciIg
XAogICAgICAgICAgICAgICAgICAgICAiZmIke2VmaV9zdWZmaXh9LmVmaSIKICAgICAgICAgICAg
IGZpCi0tIAoyLjUwLjEK
</data>

          </attachment>
      

    </bug>

</bugzilla>