線上一臺服務器在執行leveldb程序的時候,報錯:"libc.so.6: version `GLIBC_2.14' not found"。 排查緣由及解決方法以下:java
1)產生緣由
是因爲Linux系統的glibc版本過低,而軟件編譯時使用了較高版本的glibc引發的!linux
查看系統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.14shell
到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]# export LD_LIBRARY_PATH=/usr/local/glibc-2.14/lib:$LD_LIBRARY_PATH [root@uatblockchain01 build]# echo $LD_LIBRARY_PATH /opt/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@uatblockchain03 ~]# java -version //一直卡着不動 [root@uatblockchain03 ~]# su - app //一直卡着不動 解決辦法: 將上面那條配置從/etc/profile文件裏刪除,而後source使之生效! 從新登陸機器便可解決! ================================================================================================ 若是是在普通用戶下,就修改普通用戶下的環境變量。好比這裏我是在app帳號下啓動的leveldb程序,那麼: [app@uatblockchain01 ~]$ export LD_LIBRARY_PATH=/usr/local/glibc-2.14/lib:$LD_LIBRARY_PATH [app@uatblockchain01 ~]$ echo $LD_LIBRARY_PATH /opt/glibc-2.14/lib: 修改/lib64/libc.so.6的軟連接來源,由以前的libc-2.12.so修改成libc-2.14.so [root@uatblockchain01 ~]# cd /lib64 [root@uatblockchain01 ~]# ll libc.so.6 lrwxrwxrwx 1 root root 12 Apr 8 03:50 libc.so.6 -> libc-2.12.so [root@uatblockchain01 ~]# 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 ~]# cp /usr/local/glibc-2.14/lib/libc-2.14.so /lib64/ 刪除libc-2.12.so以前的軟連接 [root@uatblockchain01 ~]# unlink /lib64/libc.so.6 或者直接執行 [root@uatblockchain01 ~]# rm -f /lib64/libc.so.6 ============================================================================================== 若是上面刪除命令執行後,致使該機器的不少shell命令沒法執行!甚至於機器沒法登錄!報錯以下: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory 注意:千萬不要關閉當前的終端窗口,由於此時機器可能沒法登錄了。只能在當前終端窗口下進行緊急修復: [root@uatblockchain01 ~]# ldconfig 緣由多是:前面設置"export LD_LIBRARY_PATH= "有誤致使的。 linux調用so的庫文件時,搜素路徑爲當前路徑,再是系統lib目錄。 多是因爲前面提供了一個LD_PRELOAD系統變量來改變這個順序。 設置LD_PRELOAD了後,庫加載的順序就改變了。 搜素路徑爲:LD_PRELOAD ,當前路徑,再是系統lib目錄。 ============================================================================================== 而後作/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程序,就會發現不會有那個報錯了!問題獲得解決!