線上一台服務器在執行leveldb程序的時候,報錯:"libc.so.6: version `GLIBC_2.14' not found"。 排查原因及解決方法如下:
1)產生原因
是由於Linux系統的glibc版本太低,而軟件編譯時使用了較高版本的glibc引起的!
查看系統glibc支持的版本 [root@localhost ~]# strings /lib64/libc.so.6 |grep GLIBC_ GLIBC_2.2.5 GLIBC_2.2.6 GLIBC_2.3 GLIBC_2.3.2 GLIBC_2.3.3 GLIBC_2.3.4 GLIBC_2.4 GLIBC_2.5 GLIBC_2.6 GLIBC_2.7 GLIBC_2.8 GLIBC_2.9 GLIBC_2.10 GLIBC_2.11 GLIBC_2.12 GLIBC_PRIVATE [root@localhost ~]# rpm -qa |grep glibc glibc-common-2.12-1.209.el6_9.2.x86_64 glibc-2.12-1.209.el6_9.2.x86_64 glibc-headers-2.12-1.209.el6_9.2.x86_64 glibc-devel-2.12-1.209.el6_9.2.x86_64 可以看到最高只支持2.12版本。現在需要將glibc支持的版本升級到GLIBC_2.14
2)升級glibc支持的版本到GLIBC_2.14
到http://www.gnu.org/software/libc/下載最新版本,這里下載了glibc-2.14.tar.xz 這個版本,解壓到/usr/local/src目錄下
百度雲盤下載地址:https://pan.baidu.com/s/1YGia4YD45s42xMq9VapJow
提取密碼:nejp
[root@uatblockchain01 ~]# cd /usr/local/src/
[root@uatblockchain01 src]# ll
total 9888
-rw-r--r-- 1 root root 10122492 Apr 8 03:21 glibc-2.14.tar.xz
[root@uatblockchain01 src]# tar -vxf glibc-2.14.tar.xz
創建/var/VMdisks,將解壓后的glibc-2.14移到/var/VMdisks目錄下
[root@uatblockchain01 src]# mkdir -p /var/VMdisks
[root@uatblockchain01 src]# mv glibc-2.14 /var/VMdisks/
在glibc源碼目錄建立構建目錄,並cd進入構建目錄
[root@uatblockchain01 src]# cd /var/VMdisks/glibc-2.14/
[root@uatblockchain01 glibc-2.14]# mkdir build && cd build/
[root@uatblockchain01 build]# ../configure --prefix=/usr/local/glibc-2.14
[root@uatblockchain01 build]# make -j4
[root@uatblockchain01 build]# make install
臨時修改環境變量
[root@uatblockchain01 build]# echo $LD_LIBRARY_PATH
[root@uatblockchain01 build]#
[root@uatblockchain01 build]# export LD_LIBRARY_PATH=/usr/local/glibc-2.14/lib:$LD_LIBRARY_PATH
[root@uatblockchain01 build]# echo $LD_LIBRARY_PATH
/usr/local/glibc-2.14/lib:
可以發現,上面設置export LD_LIBRARY_PATH環境變量之后,查看$LD_LIBRARY_PATH的值后面有個冒號":"!
這是因為在設置export LD_LIBRARY_PATH之前,$LD_LIBRARY_PATH默認值就是空的。
最好如下設置
[root@uatblockchain01 build]# export LD_LIBRARY_PATH=/usr/local/glibc-2.14/lib
[root@uatblockchain01 build]# echo $LD_LIBRARY_PATH
/usr/local/glibc-2.14/lib
================================================================================================
需要注意:
這里環境變量要如上一樣臨時修改,決不能寫在/etc/profile文件里,並source使之生效!
否則會導致某些shell命令執行不了。比如:
[root@uatblockchain01 build]# vim /etc/profile
.......
export LD_LIBRARY_PATH=/usr/local/glibc-2.14/lib:$LD_LIBRARY_PATH
[root@uatblockchain01 build]# source /etc/profile
這樣,將會出現一些命令卡住的現象。
[root@uatblockchain01 build]# java -version //一直卡着不動
[root@uatblockchain01 build]# su - app //一直卡着不動
解決辦法:
將上面那條配置從/etc/profile文件里刪除,然后source使之生效!重新登錄機器即可解決!
================================================================================================
需要注意:
如果是在普通用戶下,就修改普通用戶下的環境變量。比如這里我是在app賬號下啟動的leveldb程序,那么:
[app@uatblockchain01 ~]$ echo $LD_LIBRARY_PATH
[app@uatblockchain01 ~]$
[app@uatblockchain01 ~]$ export LD_LIBRARY_PATH=/usr/local/glibc-2.14/lib
[app@uatblockchain01 ~]$ echo $LD_LIBRARY_PATH
/usr/local/glibc-2.14/lib
================================================================================================
修改/lib64/libc.so.6的軟鏈接來源,由之前的libc-2.12.so修改為libc-2.14.so
[root@uatblockchain01 build]# cd /lib64
[root@uatblockchain01 lib64]# ll libc.so.6
lrwxrwxrwx 1 root root 12 Apr 8 03:50 libc.so.6 -> libc-2.12.so
[root@uatblockchain01 lib64]# ll /usr/local/glibc-2.14/lib/libc-2.14.so
-rwxr-xr-x 1 root root 9645192 Apr 8 03:28 /usr/local/glibc-2.14/lib/libc-2.14.so
[root@uatblockchain01 lib64]# cp /usr/local/glibc-2.14/lib/libc-2.14.so /lib64/
刪除libc-2.12.so之前的軟鏈接
[root@uatblockchain01 lib64]# unlink /lib64/libc.so.6
或者直接執行
[root@uatblockchain01 lib64]# rm -f /lib64/libc.so.6
================================================================================================
需要注意:
如上面操作,在取消之前libc.so.6的軟鏈接或者刪除/lib64/libc.so.6之后,可能導致系統的好多命令都無法使用!
這時候要特別注意:千萬不要關閉當前的終端窗口!!!因為此時機器可能無法登陸了,只能在當前終端窗口下進行緊急修復:
可能出現下面兩個報錯!
<<< 報錯1 >>>
error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
解決辦法:
[root@uatblockchain01 lib64]# ldconfig
原因可能是:前面設置"export LD_LIBRARY_PATH"的環境變量有誤導致的。
linux調用so的庫文件時,搜素路徑為當前路徑,接着再是系統lib目錄。可能是由於前面提供了一個LD_PRELOAD系統變量來改變這個順序。
設置LD_PRELOAD了后,庫加載的順序就改變了。搜素路徑為:LD_PRELOAD ,當前路徑,接着再是系統lib目錄。
<<< 報錯2 >>>
error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
上面報錯,既然命令無法尋址到軟連接,那么直接命令行給它!即將原來的/lib64/libc.so.6庫再軟鏈接連接回去!!
可以采用下面兩種挽救方法:
挽救方法1:
[root@uatblockchain01 lib64]# unset LD_LIBRARY_PATH
[root@uatblockchain01 lib64]# LD_PRELOAD=/lib64/libc-2.12.so ln -s /lib64/libc-2.12.so /lib64/libc.so.6
[root@uatblockchain01 lib64]# ldconfig
挽救方法2:
[root@uatblockchain01 lib64]# unset LD_LIBRARY_PATH
[root@uatblockchain01 lib64]# ldconfig -l -v /lib64/libc-2.12.so
[root@uatblockchain01 lib64]# ldconfig
需要注意:
1. libc庫必須是原來使用的而不是你更新過的lib庫!
2. LD_PRELOAD允許你定義在程序運行前優先加載的動態鏈接庫,因此在使用ln前就加載了lib庫,而不是等到使用ln時加載,這樣就能臨時使用命令了。
3. 不僅僅是ln,只要加了LD_PRELOAD=/lib64/libc-2.12.so,后面可以跟一切"因為libc.so.6軟鏈接被取消或被刪除"而不能用的命令。
================================================================================================
然后做/lib64/libc.so.6新的軟鏈接,軟鏈接到libc-2.14.so
[root@uatblockchain01 lib64]# ln -s libc-2.14.so /lib64/libc.so.6
[root@uatblockchain01 lib64]# ll libc.so.6
lrwxrwxrwx 1 root root 12 Apr 8 03:50 libc.so.6 -> libc-2.14.so
最后再查看系統glibc支持的版本:
[root@uatblockchain01 lib64]# strings /lib64/libc.so.6 |grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_PRIVATE
發現glibc最高可以支持到2.14版本了,然后再執行leveldb程序,就會發現不會有那個報錯了!問題得到解決!
另外需要謹記:libc庫是很多命令操作得依賴庫,libc.so.6至關重要,絕對不能刪,不能改名!!
更簡單升級方法:不改變環境變量,可以直接將glibc新版本編譯安裝到系統默認路徑/usr下面
如下升級glibc版本到2.17做法 # wget http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz # tar -xvf glibc-2.17.tar.gz # cd glibc-2.17 # mkdir build; cd build # ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin # make -j 8 # make install 查看版本,發現已升級到2.17版本 # ldd --version # strings /lib64/libc.so.6 |grep GLIBC_ =============================================================== 如下升級glibc版本到2.18做法 # wget http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz # tar -xvf glibc-2.18.tar.gz # cd glibc-2.18 # mkdir build && cd build && ../configure --prefix=/usr && make -j4 && make install
