CentOS6.5安装glibc-2.14后locale出现No such file or directory解决办法

 更新时间:2021年11月26日 17:18:48   作者:重庆春哥  
大家好,本篇文章主要讲了CentOS6.5安装glibc-2.14后locale出现No such file or directory解决办法,感兴趣的同学赶快来看看吧,希望对你有帮助

 一、掉进坑里

最近公司内部的一台测试服务器(CentOS6.5),因为安装某软件需要升级glibc库,glibc是linux的一个核心库,如果直接替换升级原有版本,可能出现无法预料的异常(比如大面积出现命令不能运行)。
于是手动升级安装了glibc-2.14,参考分享Centos6.5升级glibc过程
去官网下了个glibc-2.14的tar包,按照上面的步骤编译安装:

$ mkdir build  // 在glibc-2.14目录下建立build文件夹
$ cd build     // 进入build目录
$ ../configure --prefix=/opt/glibc-2.14 // 注意:配置glibc并设置当前glibc-2.14安装目录
$ make && make install     // 编译安装glibc-2.14库

修改了/lib64/libc.so.6的软连接指向,程序可以正常运行,但中文出现了乱码问题

于是呼,按照自己的经验和网上大多数N人的说法,认为这个简单,重新设置一下语言不就搞定了吗?

说干就干,在Shell中运行locale,出现如下错误:

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

_注:以上错误不仅出现在手动运行locale命令时,而且每次ssh远程登录进shell时都会出现。_

二、挣扎无果

为解决以上问题,大量度娘和G狗,尝试过以下方法,问题依旧。

使用如下命令:
export LANG="en_US.utf8"
可以修改环境变量LANG,修改之后立即生效,当时当系统重新启动时便会又变成原来的语言
另外两种修改语言的方法:
1.配置如下文件:
vi /etc/sysconfig/i18n
将原来的配置如:
LANG="zh_CN.utf8"
修改为
LANG="en_US.utf8"
保存之后不会立即生效,而是要重启之后生效。

三、青春的冲动

焦头烂额之时,出去smoking了一下,看来还是要回到问题的本质,既然出现了 No such file or directory错误,说明应该是我们配置了某种不存在或者系统不支持的locale,比如上面解决办法中的通过个修改语言LANG=”en_US.UTF-8”,将locale设置成了zh_CN.UTF-8,而操作系统在通过配置去初始化本地化环境的时候,没有找到相应的语言包(其实不只是语言包,locale还包括时区、货币度量等), 即OS找不到对应的locale文件,想明白这个问题就好办了。

先使用locale命令看看系统中有没有这个locale

[****@****** bin]# locale -a|grep en_US
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8

一看傻眼了,里面有en_US.utf8,也就是说OS是支持将locale配置成en_US.utf8的,那为什么还是出现如下错误:

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

四、柳暗花明

是不是忽略了什么,再次回到原点审视。突然,想到了一个问题:我们重新安装了一个新的glibc库,而不是覆盖升级,也就是说系统中目前至少有两个locale命令,CentOS如何知道用哪个?

会不会是用了我们新装的/opt/glibc-2.14/bin/locale,而不是系统默认的/usr/bin/locale,用下面的命令很容易验证这个想法:

[****@****** bin]# /opt/glibc-2.14/bin/locale -a 
C
POSIX

果然,这个locale只支持C和POSIX,而没有en_US.utf8,所以如果我们将locale配置成en_US.utf8,自然会报No such file or directory错误。

问题又来了,/opt/glibc-2.14/bin/locale命令所列举的本地化locale语言包,是从哪里来的?是通过配置文件?还是直接读取某个目录里面的文件?
当然如果去看源代码很容易找到上面问题的答案,因为俺比较懒,便大胆猜测:应该是从某个目录里面读取的,这个目录里面应该有系统所支持的所有的locale文件。这样猜测是源于错误消息是“没有这样的文件或目录”。

为了找到这个目录的位置,想到了strings命令,直接使用如下命令:

[****@****** bin]# strings /opt/glibc-2.14/bin/locale|grep locale
setlocale
/locale.
locale (GNU %s) %s
/opt/glibc-2.14/lib/locale
/opt/glibc-2.14/share/locale
all-locales
/opt/glibc-2.14/lib/locale/locale-archive
locale: %-15.15s archive: /opt/glibc-2.14/lib/locale/locale-archive
locale: %-15.15s directory: %.*s
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.

果然上面出现了一个路径/opt/glibc-2.14/lib/locale/locale-archive,通过名字很容易猜出这个很可能就是locale命令去读取所有被支持的locale目录(/或归档文件)位置。

五、问题KO

ls一下上面那个目录,的确里面是空的,没有locale-archive这个归档文件。

[****@****** bin]# ll /opt/glibc-2.14/lib/locale/

现在解决办法就很简单了,直接将/usr/bin/locale这个locale命令使用的locale-archive文件copy到/opt/glibc-2.14/lib/locale/locale-archive即可

[****@****** bin]# cp /usr/lib/locale/locale-archive /opt/glibc-2.14/lib/locale/locale-archive

可能有小伙伴会问了,你怎么知道/usr/bin/locale使用的locale文件目录是/usr/lib/locale/locale-archive,答案很简单:度娘一把,很容易查到。

copy完成后,exit会话,重新登录进来,再运行/opt/glibc-2.14/bin/locale命令,未出现No such file or directory错误了,而且之前的乱码问题也解决了。

六、后记

上面记录一次了笔者自己解决centos 6.5环境下手动安装glibc库后出现的乱码问题,过程中涉及到一些关于locale的原理知识,也顺便了解了一下。
By the way,上面猜测的/opt/glibc-2.14/bin/locale命令locale读取路径,后来也的确看一下locale.c源码,证实的确是从/opt/glibc-2.14/lib/locale/locale-archive读取的(当然还有其他的读取位置)。

到此这篇关于CentOS6.5安装glibc-2.14后locale出现No such file or directory解决办法的文章就介绍到这了,更多相关安装glibc出现中文乱码解决办法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • linux下如何配置DNS域名

    linux下如何配置DNS域名

    这篇文章主要介绍了linux下如何配置DNS域名问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Linux下安装grafana并且添加influxdb监控的方法

    Linux下安装grafana并且添加influxdb监控的方法

    这篇文章主要介绍了Linux下安装grafana并且添加influxdb监控的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • CentOS下MySQL的彻底卸载的几种方法

    CentOS下MySQL的彻底卸载的几种方法

    本篇文章主要介绍了CentOS下MySQL的彻底卸载的几种方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 如何在 Ubuntu 服务器上添加和删除用户

    如何在 Ubuntu 服务器上添加和删除用户

    这篇文章详细介绍了在Ubuntu服务器上如何使用命令行工具添加和删除用户,包括adduser、useradd、deluser等命令的使用方法和示例,感兴趣的朋友一起看看吧
    2024-12-12
  • linux 清理内存命令详细介绍

    linux 清理内存命令详细介绍

    这篇文章主要介绍了linux 清理内存命令详细介绍的相关资料,这里对Linux 清理内存进行了详解及查看内存条命令,需要的朋友可以参考下
    2016-11-11
  • Vim中查找替换及正则表达式的使用详解

    Vim中查找替换及正则表达式的使用详解

    Vim中的正则表达式功能很强大,如果能自由运用,则可以完成很多难以想象的操作。下面这篇文章主要给大家介绍了关于Vim中查找替换及正则表达式使用的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • Linux 文件权限的详细介绍

    Linux 文件权限的详细介绍

    这篇文章主要介绍了Linux 文件权限的详细介绍,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • 关于Apache默认编码错误 导致网站乱码的解决方案

    关于Apache默认编码错误 导致网站乱码的解决方案

    Apache默认编码UTF-8在解析A网站的时候没有任何问题,当运行B网站时出现的"蝌蚪文"乱码问题
    2011-12-12
  • Centos7的apache网站环境搭建wordpress

    Centos7的apache网站环境搭建wordpress

    本篇文章给大家详细分析了在Centos7的apache网站环境搭建wordpress的详细操作方法,有兴趣的朋友参考下。
    2018-02-02
  • 详解在Ubuntu16.10上安装docker ce

    详解在Ubuntu16.10上安装docker ce

    本篇文章主要介绍了详解在Ubuntu16.10上安装docker ce,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05

最新评论