升级glic:解决libc.so.6:versionGLIBC_2.14notfound问题
线上⼀台服务器在执⾏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
到下载最新版本,这⾥下载了glibc-2. 这个版本,解压到/usr/local/src⽬录下
百度云盘下载地址:
提取密码: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.
[root@uatblockchain01 src]# tar -vxf glibc-2.
创建/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
leveldb使用挽救⽅法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 /gnu/glibc/glibc-2.
# tar -xvf glibc-2.
# 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 /gnu/glibc/glibc-2.
# tar -xvf glibc-2.
# cd glibc-2.18
# mkdir build && cd build && ../configure --prefix=/usr && make -j4 && make install

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。