先说下为什么要升级glibc:
1. 首先大家一定要特别特别特别的谨慎和小心,除非确定升级的必要,否则不要随意升级glibc,因为会带来很大的麻烦。
2. OK,那金牛座为啥要升级glibc呢?因为我正在进行 React Native 开发时项目所依赖的包需要更高版本的glibc库支持, 而Centos6.5 中glibc默认版本为2.12, 比如调试时经常会遇到报错:
adb: /lib64/libc.so.6: version GLIBC_2.14 not found(required by adb)
adb: /lib64/libc.so.6: version GLIBC_2.15 not found(required by adb)
这两行报错意味着我们需要对glibc进行升级了,自然是升级到 glibc-2.15 这个高版本才对。
问题背景:
升级完后,重新SSH远程登录,结果报错:
Last login: Fri Jun 29 09:16:05 2018 from 192.168.1.37
-bash: warning: setlocale: LC_CTYPE: cannot change locale (zh_CN.UTF-8): No such file or directory
-bash: warning: setlocale: LC_COLLATE: cannot change locale (zh_CN.UTF-8): No such file or directory
-bash: warning: setlocale: LC_MESSAGES: cannot change locale (zh_CN.UTF-8): No such file or directory
-bash: warning: setlocale: LC_NUMERIC: cannot change locale (zh_CN.UTF-8): No such file or directory
-bash: warning: setlocale: LC_TIME: cannot change locale (zh_CN.UTF-8): No such file or directory
接下来,终端运行 locale 命令,同样报错:
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
于此同时,发现所有的中文目录都变成了一堆 ???????? ,即中文乱码现象。
问题原因:
系统使用了我们升级后的 /usr/local/glibc-2.15/bin/locale,而不是原来的 /usr/bin/locale,尝试运行 /usr/local/glibc-2.15/bin/locale -a 来查看所有的本地化locale语言包:
[root@node1 ~]# /usr/local/glibc-2.15/bin/locale -a
/usr/local/glibc-2.15/bin/locale: Cannot set LC_CTYPE to default locale: No such file or directory
/usr/local/glibc-2.15/bin/locale: Cannot set LC_MESSAGES to default locale: No such file or directory
/usr/local/glibc-2.15/bin/locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
POSIX
很明显了,只有C 和 POSIX两项,所以才会报告No such file or directory错误。
定位locale配置文档:
[root@node1 ~]# strings /usr/local/glibc-2.15/bin/locale | grep locale
setlocale
b/localeH
b/localeH
/locale.
locale (GNU %s) %s
all-locales
/usr/local/glibc-2.15/lib/locale/locale-archive
locale: %-15.15s archive: /usr/local/glibc-2.15/lib/locale/locale-archive
/usr/local/glibc-2.15/lib/locale
locale: %-15.15s directory: %.*s
/usr/local/glibc-2.15/share/locale
Cannot set LC_CTYPE to default locale
Cannot set LC_MESSAGES to default locale
Cannot set LC_COLLATE to default locale
Cannot set LC_ALL to default locale
Write names of available locales
Get locale-specific information.
解决方案-1:
其实安装包INSTALL文档说的很清楚,自己去翻翻吧,一条命令搞定:
cd /path/to/glibc-2.15/build
make localedata/install-locales
解决方案-2:
根据上述定位我们得到locale的配置文件为: /usr/local/glibc-2.15/lib/locale/locale-archive,不出所料这个文档并不存在,正是问题关键所在,所以我们只需要设定好这个文件就行啦,怎么搞?方法就是再次使用 strings 命令定位出 /usr/bin/locale 的配置文档,然后复制过去就OK啦:
mkdir -pv /usr/local/glibc-2.15/lib/locale/
cp /usr/lib/locale/locale-archive /usr/local/glibc-2.15/lib/locale/