Bug 57924 - _install_langs ломает установку glibc-locales
Summary: _install_langs ломает установку glibc-locales
Status: NEW
Alias: None
Product: Sisyphus
Classification: Development
Component: glibc (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Gleb F-Malinovskiy
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2026-02-18 23:13 MSK by Ivan A. Melnikov
Modified: 2026-02-21 10:53 MSK (History)
7 users (show)

See Also:


Attachments
лог выполнения команды из описания бага с 'rpmi -vvv' в роли rpmi (202.32 KB, application/gzip)
2026-02-18 23:16 MSK, Ivan A. Melnikov
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Ivan A. Melnikov 2026-02-18 23:13:16 MSK
Похоже, rpm не может установить текущий glibc-locales с нуля, если _install_langs равен не all. Воспроизводится так:

$ hsh --install-langs="en:ru" --initroot --no-cache
[...]
error: unpacking of archive failed on file /usr/share/locale/en_GB/LC_MESSAGES/libc.mo;69961c5f: cpio: open
error: glibc-locales-6:2.40.0.142.2eb180-alt1.x86_64: install failed
[...]
hsh-initroot: Failed to install build package list.


При этом если в уже установленной системе поменять %_install_langs на en:ru в /etc/rpm/macros, переустановить glibс-locales, похоже, получается.
Comment 1 Ivan A. Melnikov 2026-02-18 23:16:17 MSK
Created attachment 20722 [details]
лог выполнения команды из описания бага с 'rpmi -vvv' в роли rpmi
Comment 2 Ivan A. Melnikov 2026-02-18 23:24:30 MSK
Из логов:

D: skipnstate 040755  1 (   0,   0)     0 /usr/share/locale/en_GB
D: skipnstate 040755  1 (   0,   0)     0 /usr/share/locale/en_GB/LC_MESSAGES
D: create     100644  1 (   0,   0)  1433 /usr/share/locale/en_GB/LC_MESSAGES/libc.mo;69961b4f
error: unpacking of archive failed on file /usr/share/locale/en_GB/LC_MESSAGES/libc.mo;69961b4f: cpio: open

Вообще интересная история:

$ rpm -qa glibc-locales
glibc-locales-2.40.0.142.2eb180-alt1.x86_64
$ rpm -q --qf '[%{FILENAMES} =%{FILELANGS}=\n]' glibc-locales | grep /usr/share/locale/en_GB
/usr/share/locale/en_GB =en_GB=
/usr/share/locale/en_GB/LC_MESSAGES =en_GB=
/usr/share/locale/en_GB/LC_MESSAGES/libc.mo ==
/usr/share/locale/en_GB/LC_TIME =en_GB=

То есть, файл без заявленного языка лежит в каталогах, относящизся к языку en_GB (замечу, не en, как все нормальные люди). Похоже, что из-за этого каталоги пропускаются при установке, и создать файл не получается.

Наверное можно говорить, что это проблема упаковки glibc-locales. Но rpm вроде как должен справляться с такими ситуациями.
Comment 3 Andrew Vasilyev 2026-02-18 23:37:55 MSK
 А --install-langs="en_GB:ru" работает :-)
Comment 4 Vitaly Chikunov 2026-02-19 01:34:36 MSK
Кстати, там явно должно было вывестись errno. Если это пофиксить, то полный текст такой:

error: unpacking of archive failed on file /usr/share/locale/en_GB/LC_MESSAGES/libc.mo;69963d42: cpio: open failed - No such file or directory
Comment 5 Vitaly Chikunov 2026-02-19 01:53:43 MSK
Сравнение rpmi -vvv 

# обычного инсталла

$ grep usr/share/locale/en_GB c
D: create     040755  1 (   0,   0)     0 /usr/share/locale/en_GB
D: create     040755  1 (   0,   0)     0 /usr/share/locale/en_GB/LC_MESSAGES
D: create     100644  1 (   0,   0)  1433 /usr/share/locale/en_GB/LC_MESSAGES/libc.mo;699641ed

# с --install-langs="en:ru"

$ grep usr/share/locale/en_GB a
D: skipnstate 040755  1 (   0,   0)     0 /usr/share/locale/en_GB
D: skipnstate 040755  1 (   0,   0)     0 /usr/share/locale/en_GB/LC_MESSAGES
D: create     100644  1 (   0,   0)  1433 /usr/share/locale/en_GB/LC_MESSAGES/libc.mo;69964187
error: unpacking of archive failed on file /usr/share/locale/en_GB/LC_MESSAGES/libc.mo;69964187: cpio: open failed - No such file or directory

То есть дира /usr/share/locale/en_GB не создается (skipnstate) и потом в ней не может быть создан файл libc.mo.
Comment 6 Vitaly Chikunov 2026-02-19 03:12:00 MSK
Думаю, это правильное поведение запаковки пакета glibc или find-lang из rpm-build.

  $ rpm -q glibc-locales --qf '[%{filenames} %{FILELANGS}\n]' | grep /usr/share/locale/en_GB
  /usr/share/locale/en_GB en_GB
  /usr/share/locale/en_GB/LC_MESSAGES en_GB
  /usr/share/locale/en_GB/LC_MESSAGES/libc.mo
  /usr/share/locale/en_GB/LC_TIME en_GB

Дира /usr/share/locale/en_GB/LC_MESSAGES помечена как относящая к локали en_GB, а файл в этой дире не помечен, поэтому, он распаковывается в диру, которой нет.

  %files locales -f libc.lang

Файл libc.lang генерируется в спеке.

 builder@x86_64:~/RPM/BUILD/glibc-2.40.0.142.2eb180-alt1$ grep /usr/share/locale/en_GB libc.lang
 /usr/share/locale/en_GB/LC_MESSAGES/libc.mo
 %lang(en_GB) %dir /usr/share/locale/en_GB
 %lang(en_GB) %dir /usr/share/locale/en_GB/LC_MESSAGES
 %lang(en_GB) %dir /usr/share/locale/en_GB/LC_TIME

find-lang для всех libc.mo определяет их локаль по буквам до `_`, то есть для en_GB она %lang(en), затем есть специальное условие, что токен `%lang(en)` удаляется.
Comment 7 Vitaly Chikunov 2026-02-20 16:37:43 MSK
(In reply to Vitaly Chikunov from comment #4)
> Кстати, там явно должно было вывестись errno. Если это пофиксить, то полный
> текст такой:
> 
> error: unpacking of archive failed on file
> /usr/share/locale/en_GB/LC_MESSAGES/libc.mo;69963d42: cpio: open failed - No
> such file or directory

FYI, коммит, который это добавляет, в задании https://git.altlinux.org/tasks/408814/
Comment 8 Vitaly Chikunov 2026-02-21 10:53:14 MSK
Как альтернативный вариант - rpm мог бы создавать все надкаталоги в случае ENOENT.