Bug 37379

Summary: grub может произвольно изменить название пунктов меню
Product: Sisyphus Reporter: Sergey Y. Afonin <asy>
Component: grubAssignee: Николай Костригин <nickel>
Status: ASSIGNED --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: antohami, nickel, placeholder, rider
Version: unstable   
Hardware: all   
OS: Linux   

Description Sergey Y. Afonin 2019-10-25 13:45:41 MSK
Увидел такой момент. Было:

# grub-entries
0       ALT p9 starter kit
1>0     Дополнительные параметры для ALT p9 starter kit>ALT p9 starter kit, vmlinuz
1>1     Дополнительные параметры для ALT p9 starter kit>ALT p9 starter kit, vmlinuz (recovery mode)
1>2     Дополнительные параметры для ALT p9 starter kit>ALT p9 starter kit, 4.19.79-std-def-alt1
1>3     Дополнительные параметры для ALT p9 starter kit>ALT p9 starter kit, 4.9.196-std-def-alt0.M80P.1
1>4     Дополнительные параметры для ALT p9 starter kit>ALT p9 starter kit, 4.9.161-std-def-alt0.M80P.1
2       Memtest86+-5.01

После grub-mkconfig -o /boot/grub/grub.cfg стало:

# grub-entries
0       ALT p9 starter kit
1>0     Advanced options for ALT p9 starter kit>ALT p9 starter kit, vmlinuz
1>1     Advanced options for ALT p9 starter kit>ALT p9 starter kit, vmlinuz (recovery mode)
1>2     Advanced options for ALT p9 starter kit>ALT p9 starter kit, 4.19.79-std-def-alt1
1>3     Advanced options for ALT p9 starter kit>ALT p9 starter kit, 4.9.196-std-def-alt0.M80P.1
1>4     Advanced options for ALT p9 starter kit>ALT p9 starter kit, 4.9.161-std-def-alt0.M80P.1
2       Memtest86+-5.01

Учитывая, что значение может быть использовано в saved_entry в /boot/grub/grubenv хочется blocker поставить. Так и придётся за нечитабельные метки с uuid завязываться...
Comment 1 Николай Костригин 2019-10-31 10:22:33 MSK
Спасибо за отчет. Посмотрю. На других дистрибутивах не пробовали?
Comment 2 Sergey Y. Afonin 2019-10-31 10:50:16 MSK
(In reply to comment #1)

> Спасибо за отчет. Посмотрю. На других дистрибутивах не пробовали?

В других не пробовал. На самом деле баг больше для того пока, чтобы на него ссылку сделать, так как непонятно, что делать, если подумать. Локализация загрузочного меню нужна по идее, так что и изменения будут в зависимости от локали при генерации. Разве что допиливать Grub до варианта, когда локализация будет только при отображении меню, а не в конфиге.
Comment 3 Николай Костригин 2020-02-12 10:26:32 MSK
(Ответ для Sergey Y. Afonin на комментарий #2)

> В других не пробовал. 

На kworkstation 9.0 beta не воспроизводится.
Чтобы добиться описанного поведения приходится принудительно делать 
LC_ALL=C update-grub

Соответственно, возможно, в starter kit'ах просто нужно синхронизировать локализацию между установщиком и целевой системой.
Comment 4 Антон Мидюков 2020-02-12 10:56:28 MSK
В каком стартерките проблема? В стартерките и регулярке lxde такой проблемы нет, проверил.
Comment 5 Антон Мидюков 2020-02-12 11:09:13 MSK
(Ответ для Антон Мидюков на комментарий #4)
> В каком стартерките проблема? В стартерките и регулярке lxde такой проблемы
> нет, проверил.

Дошло. Если переключиться в tty, то у root LANG=POSIX, соответственно, update-grub сделает на english всё.

А в дистрибутивах у нас в соседней tty у root какой язык?
Comment 6 Антон Мидюков 2020-02-12 11:15:57 MSK
(Ответ для Sergey Y. Afonin на комментарий #0)
> Учитывая, что значение может быть использовано в saved_entry в
> /boot/grub/grubenv хочется blocker поставить. Так и придётся за
> нечитабельные метки с uuid завязываться...

Да нормально grub на такие перемены реагирует. Ругается при запуске на полсекунды, но выбирает пункт правильный всё равно.
Comment 7 Николай Костригин 2020-02-12 12:11:29 MSK
(Ответ для Антон Мидюков на комментарий #5)
> Дошло. Если переключиться в tty, то у root LANG=POSIX, соответственно,
> update-grub сделает на english всё.
> 
> А в дистрибутивах у нас в соседней tty у root какой язык?

в kworkstation 9.0 beta тоже на соседней tty у root LANG=POSIX
Comment 8 Николай Костригин 2020-02-12 16:11:20 MSK
(Ответ для Антон Мидюков на комментарий #6)
> (Ответ для Sergey Y. Afonin на комментарий #0)
> > Учитывая, что значение может быть использовано в saved_entry в
> > /boot/grub/grubenv хочется blocker поставить. Так и придётся за
> > нечитабельные метки с uuid завязываться...
> 
> Да нормально grub на такие перемены реагирует. Ругается при запуске на
> полсекунды, но выбирает пункт правильный всё равно.

Поддерживаю. Тем более, что по пунктам перестановок нет:

[root@localhost ~]# diff --width=80 -y grub_entries.ru grub_entries.en 
0       ALT Workstation K 9.0 BETA      0       ALT Workstation K 9.0 BETA
1>0     Дополнительные параметры для  | 1>0     Advanced options for ALT Work
1>1     Дополнительные параметры для  | 1>1     Advanced options for ALT Work
1>2     Дополнительные параметры для  | 1>2     Advanced options for ALT Work
1>3     Дополнительные параметры для  | 1>3     Advanced options for ALT Work
2       Windows 7 (на /dev/sda1)      | 2       Windows 7 (on /dev/sda1)
3       ALT Workstation K 8.3  (Centa | 3       ALT Workstation K 8.3  (Centa
4>0     Дополнительные параметры для  | 4>0     Advanced options for ALT Work
4>1     Дополнительные параметры для  | 4>1     Advanced options for ALT Work
4>2     Дополнительные параметры для  | 4>2     Advanced options for ALT Work
4>3     Дополнительные параметры для  | 4>3     Advanced options for ALT Work
4>4     Дополнительные параметры для  | 4>4     Advanced options for ALT Work
4>5     Дополнительные параметры для  | 4>5     Advanced options for ALT Work
4>6     Дополнительные параметры для  | 4>6     Advanced options for ALT Work
4>7     Дополнительные параметры для  | 4>7     Advanced options for ALT Work
4>8     Дополнительные параметры для  | 4>8     Advanced options for ALT Work
4>9     Дополнительные параметры для  | 4>9     Advanced options for ALT Work
4>10    Дополнительные параметры для  | 4>10    Advanced options for ALT Work
4>11    Дополнительные параметры для  | 4>11    Advanced options for ALT Work
5       Debian GNU/Linux 9 (stretch)  | 5       Debian GNU/Linux 9 (stretch) 
6>0     Дополнительные параметры для  | 6>0     Advanced options for Debian G
6>1     Дополнительные параметры для  | 6>1     Advanced options for Debian G
6>2     Дополнительные параметры для  | 6>2     Advanced options for Debian G
6>3     Дополнительные параметры для  | 6>3     Advanced options for Debian G
6>4     Дополнительные параметры для  | 6>4     Advanced options for Debian G
7       Windows 7 (на /dev/sdb1)      | 7       Windows 7 (on /dev/sdb1)
8       Memtest86+-5.01                 8       Memtest86+-5.01

а в /boot/grub/grubenv saved_entry хранится в виде числового указателя:

[root@localhost ~]# cat /boot/grub/grubenv 
# GRUB Environment Block
saved_entry=1>1

Таким образом нарушения порядка загрузки при любом языке пунктов меню не будет
Comment 9 Николай Костригин 2020-02-12 16:18:12 MSK
(Ответ для Sergey Y. Afonin на комментарий #2)
> (In reply to comment #1)
> 
> > Спасибо за отчет. Посмотрю. На других дистрибутивах не пробовали?
> 
> В других не пробовал. На самом деле баг больше для того пока, чтобы на него
> ссылку сделать, так как непонятно, что делать, если подумать. Локализация
> загрузочного меню нужна по идее, так что и изменения будут в зависимости от
> локали при генерации. Разве что допиливать Grub до варианта, когда
> локализация будет только при отображении меню, а не в конфиге.

Могу предложить в update-grub внести кусочек из alterator-grub:

  #!/bin/sh -e

  . /etc/sysconfig/grub2
+ if [ -s /etc/sysconfig/i18n ]; then
+              . /etc/sysconfig/i18n
+ fi

  [ -n "$GRUB_AUTOUPDATE_CFGNAME" ] || GRUB_AUTOUPDATE_CFGNAME="/boot/grub/grub.cfg"

  exec grub-mkconfig -o "$GRUB_AUTOUPDATE_CFGNAME" "$@"

Тогда на консоли root update-grub будет давать локализованный конфиг, а "grub-mkconfig -o /boot/grub/grub.cfg" в POSIX:

[root@localhost ~]# update-grub 
Генерируется файл настройки grub ?
Найдена тема: /boot/grub/themes/branding-xalt-kworkstation/theme.txt
Found background image: /boot/grub/themes/branding-xalt-kworkstation/grub.png
Найден образ linux: /boot/vmlinuz
Найден образ initrd: /boot/initrd.img
Найден образ linux: /boot/vmlinuz-std-def
skipping symlink: /boot/vmlinuz-std-def
Найден образ linux: /boot/vmlinuz-4.19.102-std-def-alt1
Найден образ initrd: /boot/initrd-4.19.102-std-def-alt1.img
Найден образ linux: /boot/vmlinuz-un-def
skipping symlink: /boot/vmlinuz-un-def
Найден образ linux: /boot/vmlinuz-5.4.17-un-def-alt1
Найден образ initrd: /boot/initrd-5.4.17-un-def-alt1.img
Найден Windows 7 на /dev/sda1
Найден ALT Workstation K 8.3  (Centaurea Ruthenica) на /dev/sda5
Найден Debian GNU/Linux 9 (stretch) на /dev/sda6
Найден Windows 7 на /dev/sdb1
Found memtest image: memtest-5.01.bin
завершено

[root@localhost ~]# grub-mkconfig -o /boot/grub/grub.cfg 
Generating grub configuration file ...
Found theme: /boot/grub/themes/branding-xalt-kworkstation/theme.txt
Found background image: /boot/grub/themes/branding-xalt-kworkstation/grub.png
Found linux image: /boot/vmlinuz
Found initrd image: /boot/initrd.img
Found linux image: /boot/vmlinuz-std-def
skipping symlink: /boot/vmlinuz-std-def
Found linux image: /boot/vmlinuz-4.19.102-std-def-alt1
Found initrd image: /boot/initrd-4.19.102-std-def-alt1.img
Found linux image: /boot/vmlinuz-un-def
skipping symlink: /boot/vmlinuz-un-def
Found linux image: /boot/vmlinuz-5.4.17-un-def-alt1
Found initrd image: /boot/initrd-5.4.17-un-def-alt1.img
Found Windows 7 on /dev/sda1
Found ALT Workstation K 8.3  (Centaurea Ruthenica) on /dev/sda5
Found Debian GNU/Linux 9 (stretch) on /dev/sda6
Found Windows 7 on /dev/sdb1
Found memtest image: memtest-5.01.bin
done
Comment 10 Антон Мидюков 2020-02-12 16:34:31 MSK
(Ответ для nickel@altlinux.org на комментарий #9)
> Могу предложить в update-grub внести кусочек из alterator-grub:
> 
>   #!/bin/sh -e
> 
>   . /etc/sysconfig/grub2
> + if [ -s /etc/sysconfig/i18n ]; then
> +              . /etc/sysconfig/i18n
> + fi
> 
>   [ -n "$GRUB_AUTOUPDATE_CFGNAME" ] ||
> GRUB_AUTOUPDATE_CFGNAME="/boot/grub/grub.cfg"
> 
>   exec grub-mkconfig -o "$GRUB_AUTOUPDATE_CFGNAME" "$@"
> 
> Тогда на консоли root update-grub будет давать локализованный конфиг, а
> "grub-mkconfig -o /boot/grub/grub.cfg" в POSIX:

А при обновлении ядра у нас update-grub выполняется? Если так, то хороший вариант.
Comment 11 Николай Костригин 2020-02-12 17:36:54 MSK
(Ответ для Антон Мидюков на комментарий #10)
> (Ответ для nickel@altlinux.org на комментарий #9)
> > Могу предложить в update-grub внести кусочек из alterator-grub:
> > 
> >   #!/bin/sh -e
> > 
> >   . /etc/sysconfig/grub2
> > + if [ -s /etc/sysconfig/i18n ]; then
> > +              . /etc/sysconfig/i18n
> > + fi
> > 
> >   [ -n "$GRUB_AUTOUPDATE_CFGNAME" ] ||
> > GRUB_AUTOUPDATE_CFGNAME="/boot/grub/grub.cfg"
> > 
> >   exec grub-mkconfig -o "$GRUB_AUTOUPDATE_CFGNAME" "$@"
> > 
> > Тогда на консоли root update-grub будет давать локализованный конфиг, а
> > "grub-mkconfig -o /boot/grub/grub.cfg" в POSIX:
> 
> А при обновлении ядра у нас update-grub выполняется? Если так, то хороший
> вариант.

Судя по всему, выполняется "grub-mkconfig -o /boot/grub/grub.cfg" напрямую. update-grub в процессе обновления ядра не участвует.
Comment 12 Sergey Y. Afonin 2020-10-24 14:51:18 MSK
(In reply to nickel@altlinux.org from comment #8)

> а в /boot/grub/grubenv saved_entry хранится в виде числового указателя:
> 
> [root@localhost ~]# cat /boot/grub/grubenv 
> # GRUB Environment Block
> saved_entry=1>1

Вообще-то нет. Тут хранится то, что записали. И число тут использовать плохо: Допустим тут 1>4 (из первого сообщения), и тут раз, и удаляется "4.19.79-std-def-alt1".