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 新的API signalfd、timerfd、eventfd使用说明

    Linux 新的API signalfd、timerfd、eventfd使用说明

    这篇文章主要介绍了Linux 新的API signalfd、timerfd、eventfd使用说明的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • 详解linux后台运行和关闭、查看后台任务

    详解linux后台运行和关闭、查看后台任务

    本篇主要介绍了inux后台运行和关闭、查看后台任务,详细的介绍了fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令这些命令,有兴趣的可以了解一下。
    2016-12-12
  • linux下通过Squid反向代理搭建CDN缓存服务器的配置方法

    linux下通过Squid反向代理搭建CDN缓存服务器的配置方法

    在移动机房放置一台CDN代理服务器,通过智能DNS解析,让电信用户直接访问Web服务器、让移动用户访问CDN代理服务器,解决移动用户访问Web服务器慢的问题
    2013-06-06
  • 让Apache支持Rewrite静态页面重写的方法

    让Apache支持Rewrite静态页面重写的方法

    Apache下Rewrite静态页面重写的方法,需要的朋友可以参考下。
    2010-07-07
  • Linux下如何永久修改主机名的方法步骤

    Linux下如何永久修改主机名的方法步骤

    这篇文章主要介绍了Linux下如何永久修改主机名的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • linux下的守护进程

    linux下的守护进程

    守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。同时,守护进程完成许多系统任务。
    2014-11-11
  • linux 磁盘转移空间的方法

    linux 磁盘转移空间的方法

    本篇文章主要介绍了linux 磁盘转移空间的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Ubuntu服务器常用命令汇总

    Ubuntu服务器常用命令汇总

    ubunt常用服务器命令操作,闲来无事,分享ubuntu服务器版常用命令,绝对有用。希望大家好好享受,但是不要拿自己的服务器做测试,建议您在windows下建立虚拟机再操作
    2020-10-10
  • Linux下用dnsmasq做dns cache server的配置方法

    Linux下用dnsmasq做dns cache server的配置方法

    最近国外的服务器本地DNS总是出故障,闪断一会儿都会影响业务。于是在机房里找了两台Server,安装上keepalived和dnsmasq实际本地的DNS缓存
    2014-08-08
  • Linux环境下查看日志文件命令详解

    Linux环境下查看日志文件命令详解

    大家好,本篇文章主要讲的是Linux环境下查看日志文件命令详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12

最新评论