一.故障现象
在源码安装NGINX的过程中,提示sbin/nginx: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by sbin/nginx),考虑升级glibc,升级后提示error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument。截图如下
升级glibc步骤命令,执行如下操作后出现故障。
- 1.# 查看版本,发现仅支持到2.12
-
- strings /lib64/libc.so.6 |grep GLIBC
-
- cd /opt
-
- wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
-
- tar zxvf glibc-2.14.tar.gz
-
- cd glibc-2.14
-
- mkdir build && cd build
-
- ../configure --prefix=/opt/glibc-2.14
-
- make -j4
-
- make install
-
- # 编译完成后,将libc-2.14.so拷贝到/lib64目录下(本机环境为CentOS-6 64位系统)
-
- cp /opt/glibc-2.14/lib/libc-2.14.so /lib64/
-
- # 软链到
-
- ln -sf /lib64/libc-2.14.so /lib64/libc.so.6
- -----------------------------------
二.处理思路
glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc;它本身也提供了许多其它一些必要功能服务的实现;
libc.so.6是一个链接到glibc的软链接;
对glibc的升级其实是对libc.so.6这个库的更改;
libc.so.6删除之后会导致系统很多命令的失效,所以对libc.so.6的更改要小心小心再小心,很容易将系统搞崩溃;
需要知道libc.so.6这个库在哪个位置,一般是/lib、/lib64、/usr/lib、/usr/lib64这四个文件夹下
用strings命令查看版本号;
- find / -iname libc.so.6
-
- strings /lib/libc.so.6 | grep GLIBC_
三.处理思路
两种方法升级,一种是通过rpm包升级,另外一种是通过编译glibc,然后将生成的库链接到libc.so.6上,通过rpm包对centos6.x的32位系统的升级;下载地址:Index of /results/mosquito/myrepo-el6/epel-6-i386/glibc-2.17-55.fc20/
首先需要有这四个rpm包:glibc-2.17-55.el6.i686.rpm、glibc-common-2.17-55.el6.i686.rpm、glibc-devel-2.17-55.el6.i686.rpm、glibc-headers-2.17-55.el6.i686.rpm
然后依次安装这四个包:
- rpm -Uvh glibc-2.17-55.el6.i686.rpm
- rpm -Uvh glibc-common-2.17-55.el6.i686.rpm
- rpm -Uvh glibc-devel-2.17-55.el6.i686.rpm
- rpm -Uvh glibc-headers-2.17-55.el6.i686.rpm
通过rpm包对centos6.x的64位系统的升级包下载地址
Index of /results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/
四.rpm等命令执行不了的处理
如果没有预先的升级好gcc,都会出现升级失败的问题。当然,一旦升级失败,系统都会出现如下状态:
许多简单的命令都无法使用,此时必须谨记:不能断开当前shell连接,以centos6.7系统为例,执行以下命令:
- LD_PRELOAD=/lib64/libc-2.12.so
- ln -sf /lib64/libc-2.12.so /lib64/libc.so.6
即可恢复。其他的系统或者系统已经进行过libc升级的,请使用另外一台类似的机器进行类比,找到/lib64/libc.so.6软链接的对象,进行修改即可。