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