Bug 57107 - /usr/lib/rpm/grub.filetrigger не всегда обновляет меню при обновлении grub
Summary: /usr/lib/rpm/grub.filetrigger не всегда обновляет меню при обновлении grub
Status: NEW
Alias: None
Product: Sisyphus
Classification: Development
Component: grub (show other bugs)
Version: unstable
Hardware: all Linux
: P5 normal
Assignee: Николай Костригин
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-12-03 14:39 MSK by Ivan A. Melnikov
Modified: 2025-12-04 13:30 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 Ivan A. Melnikov 2025-12-03 14:39:20 MSK
Обноружил при тестировании нового memtest86+ на loongarch64.

При одновременном обновлении grub и memtest86+ *иногда* не обновляется /boot/grub/grub.cfg, в результате чего в меню остаётся неработующая строка от старого memtest86+
Comment 1 Ivan A. Melnikov 2025-12-03 15:31:29 MSK
Исследовал проблему и пришёл к такому выводу: проблема в конструкции

if grep [...]; then
 ...
fi | if grep -Eqs [...]; then
 ...
fi

`grep -Eqs [...]` выходит, как только обнаруживает match; если первый grep при этом продолжает писать, он получает SIGPIPE, завершается ошибкой, и в первое условие оказыватся ложным.


Упростим grub.filetrigger вот до такого:

$ cat ./a.sh
#!/bin/sh

if grep -E '^/boot/(vmlinuz|xen|memtest)|^/usr/lib(64|)/grub'; then
 echo >&2 "regenerating"
fi | if grep -Eqs '^/usr/lib(64|)/grub'; then
 echo >&2 "grub updated"
fi


В простейшем случае всё работает:

$ echo "/usr/lib64/grub" | ./a.sh
grub updated
regenerating

Однако можно подобрать входные данные, при которых первый grep упадёт, и regenerating выдаваться не будет. У меня на локалхосте это стабильно вот так:

$ yes "/usr/lib64/grub" | head -n 100000 | ./a.sh
grub updated

То есть, будет ли вызван grub-mkconfig зависит от количества обновляемых пакетов и порядка, в котором имена файлов из этих пакетов подаются на вход файлтригерру. Особенно возрастают шансы воспроизвести проблему, если в одной транзакции обновляется много пакетов или большие пакеты, и grub.filetrigger должен сработать на несколько из них.
Comment 2 Ivan A. Melnikov 2025-12-04 13:30:58 MSK
Пока сделал так:

https://git.altlinux.org/people/iv/packages/grub.git?a=commitdiff;h=d458c1e4364fa8ab9b5338737952137a92f2f189

Хотя по-моему логичнее и проще сделать два отдельных файлтриггера.