CentOS6.5安裝glibc-2.14后locale出現(xiàn)No?such?file?or?directory解決辦法
?一、掉進(jìn)坑里
最近公司內(nèi)部的一臺(tái)測(cè)試服務(wù)器(CentOS6.5),因?yàn)榘惭b某軟件需要升級(jí)glibc庫(kù),glibc是linux的一個(gè)核心庫(kù),如果直接替換升級(jí)原有版本,可能出現(xiàn)無(wú)法預(yù)料的異常(比如大面積出現(xiàn)命令不能運(yùn)行)。
于是手動(dòng)升級(jí)安裝了glibc-2.14,參考分享Centos6.5升級(jí)glibc過(guò)程
去官網(wǎng)下了個(gè)glibc-2.14的tar包,按照上面的步驟編譯安裝:
$ mkdir build // 在glibc-2.14目錄下建立build文件夾 $ cd build // 進(jìn)入build目錄 $ ../configure --prefix=/opt/glibc-2.14 // 注意:配置glibc并設(shè)置當(dāng)前glibc-2.14安裝目錄 $ make && make install // 編譯安裝glibc-2.14庫(kù)
修改了/lib64/libc.so.6的軟連接指向,程序可以正常運(yùn)行,但中文出現(xiàn)了亂碼問(wèn)題。
于是呼,按照自己的經(jīng)驗(yàn)和網(wǎng)上大多數(shù)N人的說(shuō)法,認(rèn)為這個(gè)簡(jiǎn)單,重新設(shè)置一下語(yǔ)言不就搞定了嗎?
說(shuō)干就干,在Shell中運(yùn)行l(wèi)ocale,出現(xiàn)如下錯(cuò)誤:
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
_注:以上錯(cuò)誤不僅出現(xiàn)在手動(dòng)運(yùn)行l(wèi)ocale命令時(shí),而且每次ssh遠(yuǎn)程登錄進(jìn)shell時(shí)都會(huì)出現(xiàn)。_
二、掙扎無(wú)果
為解決以上問(wèn)題,大量度娘和G狗,嘗試過(guò)以下方法,問(wèn)題依舊。
使用如下命令: export LANG="en_US.utf8" 可以修改環(huán)境變量LANG,修改之后立即生效,當(dāng)時(shí)當(dāng)系統(tǒng)重新啟動(dòng)時(shí)便會(huì)又變成原來(lái)的語(yǔ)言 另外兩種修改語(yǔ)言的方法: 1.配置如下文件: vi /etc/sysconfig/i18n 將原來(lái)的配置如: LANG="zh_CN.utf8" 修改為 LANG="en_US.utf8" 保存之后不會(huì)立即生效,而是要重啟之后生效。
三、青春的沖動(dòng)
焦頭爛額之時(shí),出去smoking了一下,看來(lái)還是要回到問(wèn)題的本質(zhì),既然出現(xiàn)了 No such file or directory錯(cuò)誤,說(shuō)明應(yīng)該是我們配置了某種不存在或者系統(tǒng)不支持的locale,比如上面解決辦法中的通過(guò)個(gè)修改語(yǔ)言LANG=”en_US.UTF-8”,將locale設(shè)置成了zh_CN.UTF-8,而操作系統(tǒng)在通過(guò)配置去初始化本地化環(huán)境的時(shí)候,沒(méi)有找到相應(yīng)的語(yǔ)言包(其實(shí)不只是語(yǔ)言包,locale還包括時(shí)區(qū)、貨幣度量等), 即OS找不到對(duì)應(yīng)的locale文件,想明白這個(gè)問(wèn)題就好辦了。
先使用locale命令看看系統(tǒng)中有沒(méi)有這個(gè)locale
[****@****** bin]# locale -a|grep en_US en_US en_US.iso88591 en_US.iso885915 en_US.utf8
一看傻眼了,里面有en_US.utf8,也就是說(shuō)OS是支持將locale配置成en_US.utf8的,那為什么還是出現(xiàn)如下錯(cuò)誤:
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
四、柳暗花明
是不是忽略了什么,再次回到原點(diǎn)審視。突然,想到了一個(gè)問(wèn)題:我們重新安裝了一個(gè)新的glibc庫(kù),而不是覆蓋升級(jí),也就是說(shuō)系統(tǒng)中目前至少有兩個(gè)locale命令,CentOS如何知道用哪個(gè)?
會(huì)不會(huì)是用了我們新裝的/opt/glibc-2.14/bin/locale,而不是系統(tǒng)默認(rèn)的/usr/bin/locale,用下面的命令很容易驗(yàn)證這個(gè)想法:
[****@****** bin]# /opt/glibc-2.14/bin/locale -a C POSIX
果然,這個(gè)locale只支持C和POSIX,而沒(méi)有en_US.utf8,所以如果我們將locale配置成en_US.utf8,自然會(huì)報(bào)No such file or directory錯(cuò)誤。
問(wèn)題又來(lái)了,/opt/glibc-2.14/bin/locale命令所列舉的本地化locale語(yǔ)言包,是從哪里來(lái)的?是通過(guò)配置文件?還是直接讀取某個(gè)目錄里面的文件?
當(dāng)然如果去看源代碼很容易找到上面問(wèn)題的答案,因?yàn)榘潮容^懶,便大膽猜測(cè):應(yīng)該是從某個(gè)目錄里面讀取的,這個(gè)目錄里面應(yīng)該有系統(tǒng)所支持的所有的locale文件。這樣猜測(cè)是源于錯(cuò)誤消息是“沒(méi)有這樣的文件或目錄”。
為了找到這個(gè)目錄的位置,想到了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.
果然上面出現(xiàn)了一個(gè)路徑/opt/glibc-2.14/lib/locale/locale-archive,通過(guò)名字很容易猜出這個(gè)很可能就是locale命令去讀取所有被支持的locale目錄(/或歸檔文件)位置。
五、問(wèn)題KO
ls一下上面那個(gè)目錄,的確里面是空的,沒(méi)有l(wèi)ocale-archive這個(gè)歸檔文件。
[****@****** bin]# ll /opt/glibc-2.14/lib/locale/
現(xiàn)在解決辦法就很簡(jiǎn)單了,直接將/usr/bin/locale這個(gè)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
可能有小伙伴會(huì)問(wèn)了,你怎么知道/usr/bin/locale使用的locale文件目錄是/usr/lib/locale/locale-archive,答案很簡(jiǎn)單:度娘一把,很容易查到。
copy完成后,exit會(huì)話,重新登錄進(jìn)來(lái),再運(yùn)行/opt/glibc-2.14/bin/locale命令,未出現(xiàn)No such file or directory錯(cuò)誤了,而且之前的亂碼問(wèn)題也解決了。
六、后記
上面記錄一次了筆者自己解決centos 6.5環(huán)境下手動(dòng)安裝glibc庫(kù)后出現(xiàn)的亂碼問(wèn)題,過(guò)程中涉及到一些關(guān)于locale的原理知識(shí),也順便了解了一下。
By the way,上面猜測(cè)的/opt/glibc-2.14/bin/locale命令locale讀取路徑,后來(lái)也的確看一下locale.c源碼,證實(shí)的確是從/opt/glibc-2.14/lib/locale/locale-archive讀取的(當(dāng)然還有其他的讀取位置)。
到此這篇關(guān)于CentOS6.5安裝glibc-2.14后locale出現(xiàn)No such file or directory解決辦法的文章就介紹到這了,更多相關(guān)安裝glibc出現(xiàn)中文亂碼解決辦法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux 新的API signalfd、timerfd、eventfd使用說(shuō)明
這篇文章主要介紹了Linux 新的API signalfd、timerfd、eventfd使用說(shuō)明的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10詳解linux后臺(tái)運(yùn)行和關(guān)閉、查看后臺(tái)任務(wù)
本篇主要介紹了inux后臺(tái)運(yùn)行和關(guān)閉、查看后臺(tái)任務(wù),詳細(xì)的介紹了fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令這些命令,有興趣的可以了解一下。2016-12-12linux下通過(guò)Squid反向代理搭建CDN緩存服務(wù)器的配置方法
在移動(dòng)機(jī)房放置一臺(tái)CDN代理服務(wù)器,通過(guò)智能DNS解析,讓電信用戶直接訪問(wèn)Web服務(wù)器、讓移動(dòng)用戶訪問(wèn)CDN代理服務(wù)器,解決移動(dòng)用戶訪問(wèn)Web服務(wù)器慢的問(wèn)題2013-06-06讓Apache支持Rewrite靜態(tài)頁(yè)面重寫(xiě)的方法
Apache下Rewrite靜態(tài)頁(yè)面重寫(xiě)的方法,需要的朋友可以參考下。2010-07-07Linux下用dnsmasq做dns cache server的配置方法
最近國(guó)外的服務(wù)器本地DNS總是出故障,閃斷一會(huì)兒都會(huì)影響業(yè)務(wù)。于是在機(jī)房里找了兩臺(tái)Server,安裝上keepalived和dnsmasq實(shí)際本地的DNS緩存2014-08-08