Hide Forgot
Description of problem: We're running a docker container and recently upgraded to the base RHEL7.3 image, which includes glibc-common-2.17-157.el7.x86_64 We have a customer facing application which needs makes use of the locales, and needs to be able to support a large list of languages. Previously we were able to re-install glib-common to pull in all the additional locales. Since glibc-common-2.17-157.el7.x86_64, reinstalls no-longer seem to regenerate /usr/lib/locale/locale-archive and locale -a only lists C POSIX en_US en_US.iso88591 en_US.iso885915 en_US.utf8 I updated /etc/rpm/macros.image-language-conf to use vi:fr:pl:zh_TW:en_GB:hr:eo:lt:da:id:nb:nl:rw:ja:hu:en_CA:tr:be:en_US:cs:sk:bg:ca:en:fi:ru:sv:el:gl:ko:de:zh_CN:es:it:pt_BR However locale archive still isn't regenerated because /usr/lib/locale/locale-archive.tmpl is empty After copying /usr/lib/locale/locale-archive to /usr/lib/locale/locale-archive.tmpl at the suggestion of fweimer [root@464c7644827a /]# cp /usr/lib/locale/locale-archive /usr/lib/locale/locale-archive.tmpl cp: overwrite '/usr/lib/locale/locale-archive.tmpl'? y I consistently get an assertion: [root@464c7644827a /]# /usr/sbin/build-locale-archive --install-langs vi:fr:pl:zh_TW:en_GB:hr:eo:lt:da:id:nb:nl:rw:ja:hu:en_CA:tr:be:en_US:cs:sk:bg:ca:en:fi:ru:sv:el:gl:ko:de:zh_CN:es:it:pt_BR build-locale-archive: build-locale-archive.c:301: fill_archive: Assertion `used < head->namehash_used' failed. Aborted (core dumped) Version-Release number of selected component (if applicable): glibc-common-2.17-157.el7.x86_64 How reproducible: every time Steps to Reproduce: 1. launch registry.access.redhat.com/rhel7 (id 91c58d6c27c4) 2. reinstall glibc-common yum -y reinstall glibc-common --disablerepo=* --enablerepo=rhel-7-server-rpms 3. (optional) attempt to bulid the locale archive /usr/sbin/build-locale-archive --install-langs vi:fr:pl:zh_TW:en_GB:hr:eo:lt:da:id:nb:nl:rw:ja:hu:en_CA:tr:be:en_US:cs:sk:bg:ca:en:fi:ru:sv:el:gl:ko:de:zh_CN:es:it:pt_BR 4. replace empty archive template with current locale-archive cp /usr/lib/locale/locale-archive /usr/lib/locale/locale-archive.tmpl 5. Attempt to regenerate archive (minimal list to generate error) /usr/sbin/build-locale-archive --install-langs en_US:en Actual results: (archive generation) build-locale-archive: build-locale-archive.c:301: fill_archive: Assertion `used < head->namehash_used' failed. Aborted (core dumped) Expected results: Successful rebuild of archive Additional info:
This seems to reproduce outside of the image as well: # cp /usr/lib/locale/locale-archive /usr/lib/locale/locale-archive.tmpl cp: overwrite ‘/usr/lib/locale/locale-archive.tmpl’? y # /usr/sbin/build-locale-archive --install-langs en_US:en # cp /usr/lib/locale/locale-archive /usr/lib/locale/locale-archive.tmpl cp: overwrite ‘/usr/lib/locale/locale-archive.tmpl’? y # /usr/sbin/build-locale-archive --install-langs en_US:en build-locale-archive: build-locale-archive.c:301: fill_archive: Assertion `used < head->namehash_used' failed. Aborted Based on that, the cause is that it's not possible to feed a stripped archive back into build-locale-archive.
This is mostly a documentation issue with the container images. In order to broaden the set of installed locales, you need to reinstall glibc-common *after* removing the file /etc/rpm/macros.image-language-conf and removing the override_install_langs=en_US line from /etc/yum.conf. Otherwise, reinstalling glibc-common will just redo the locale stripping, and the desired locales will never be there after installation (even if we fixed this assertion failure, they are just gone from the file system, which is the entire point of locale stripping). So to recap, this should get you going: rm -f /etc/rpm/macros.image-language-conf sed -i '/^override_install_langs=/d' /etc/yum.conf yum reinstall glibc-common After that, you'll have a full complement of locales. Further steps are needed only if you want to reduce image size.