Похоже, 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, похоже, получается.
Created attachment 20722 [details] лог выполнения команды из описания бага с 'rpmi -vvv' в роли rpmi
Из логов: 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 вроде как должен справляться с такими ситуациями.
А --install-langs="en_GB:ru" работает :-)
Кстати, там явно должно было вывестись 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
Сравнение 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.
Думаю, это правильное поведение запаковки пакета 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)` удаляется.
(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/
Как альтернативный вариант - rpm мог бы создавать все надкаталоги в случае ENOENT.