glibc升级

发布时间:2022-07-03 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了glibc升级脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

 转: 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
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 &amp;& cd build && ../configure --prefix=/usr && make -j4 && make install

 转: 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

脚本宝典总结

以上是脚本宝典为你收集整理的glibc升级全部内容,希望文章能够帮你解决glibc升级所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。