轉: https://www.cnblogs.com/kevingrace/p/8744417.html
線上一台服務器在執行leveldb程序的時候,報錯:"libc.so.6: version `GLIBC_2.14' not found"。 排查原因及解決方法如下:
1)產生原因
是由於Linux系統的glibc版本太低,而軟件編譯時使用了較高版本的glibc引起的!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
查看系統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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
[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下面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
如下升級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
|