centos 升级 glibc和glibcxxx ,解决error: Failed dependencies等问题
背景:
在vm中的linux中,安装mysql5.6的过程中,出现了缺少依赖的问题,具体报错如下。
报错一:
[root@node0 local]# rpm -ivh MySQL-server-5.6.47-1.el7.x86_64.rpm warning: MySQL-server-5.6.47-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY error: Failed dependencies: libstdc++.so.6(GLIBCXX_3.4.15)(64bit) is needed by MySQL-server-5.6.47-1.el7.x86_64
报错二:
[root@node1 local]# rpm -ivh MySQL-client-5.6.47-1.el7.x86_64.rpm warning: MySQL-client-5.6.47-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY error: Failed dependencies: libc.so.6(GLIBC_2.14)(64bit) is needed by MySQL-client-5.6.47-1.el7.x86_64 libc.so.6(GLIBC_2.17)(64bit) is needed by MySQL-client-5.6.47-1.el7.x86_64
目的:
本文记录在centos6.x环境上,安装第三方软件,依赖高版本的glibc和glibcxxx时,该文通过收集网上相关信息,通过升级glibc和glibcxx版本,解决以上依赖报错。
环境:
vm、centos6.1 、64bit 、mysql5.6.47。
风险:
glibc和glibcxx是linux较为底层的运行类库,其他第三方类库都会依赖于他们,如果操作不当会引起系统无法登陆,如非必要,尽量不要去升级他们。
具体步骤:
glibc (从2.12升级至2.17)
通过搜索网上的信息,大概找到了两种解决方法。一、下载glibc源码包,手动编译安装;二、使用现成的rpm包安装。第一种方法我曾尝试多次,虽然可升级成功,但是系统的ls、cp、rm等命令不能使用,暂时没有找到完美解决的办法;第二种方法可成功升级并且命令也可以正常使用,但是包是第三方发布的,具体内部做了什么不清楚,而且需要后续观察是否有异常。
方法一:
(1)查看当前系统glibc版本。 使用命令 strings /lib64/libc.so.6 |grep GLIBC_ ,查看系统能支持的所有版本。
(2)下载glibc2.17。 官网:http://ftp.gnu.org/pub/gnu/glibc/ ,这里下载2.17。 如果慢可以找中国的镜像站点http://www.gnu.org/prep/ftp.html
(3)解压、创建build目录、configure生成makefile、make、make install。
tar –zxvf glibc-2.17.tar.gz cd glibc-2.17 mkdir build cd build //一定进到这个目录才能进行后续操作,不然会报错 ../configure --prefix=/usr // 配置glibc并设置当前glibc-2.17的安装目录,可以自定义目录后期便于失误了删除重做,/usr 是默认目录
make –j4 //4线程make 可以在命令后加上参数,如make >& log,将过程信息写入到log文件中,便于后期排错。 make install //同make
(4)建立软连接,就是这一步会导致ls等命令无法使用。
使用如下命令建立连接 : ln -sf /opt/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6
这里是将libc.so.6进行替换,将连接指向新版本的glibc-2.17类库。没有手动rm libc.so.6这个文件,直接在 ln -s 后加了参数f,进行强制替换。
如果出现了这个问题,切勿关闭当前登录窗口,不然会导致系统无法登陆。使用以下命令进行错误恢复。
LD_PRELOAD=/lib64/libc-2.12.so ln -sf /lib64/libc-2.12.so /lib64/libc.so.6
(5) 验证版本 ldd -- version
总结:这个方法应该适用一部分系统,在我的环境当中,未能解决我的问题。 第四步中的问题,可以参考 https://www.arkuu.com/article/90.html 中描述的方法解决,但是我没有尝试,可用性待确认。
参考资料:
https://garywu520.github.io/blog/2018/12/13/Glibc%E7%BC%96%E8%AF%91%E5%8D%87%E7%BA%A7%E5%88%B02-17/
https://blog.csdn.net/officercat/article/details/39520227
https://blog.csdn.net/CH2JC/article/details/86420718
https://www.arkuu.com/article/90.html
方法二、
适用rpm包进行升级。我的环境是用这种方法升级成功的。
(1)下载rpm包 下载地址:https://gist.github.com/harv/f86690fcad94f655906ee9e37c85b174
(2)安装
rpm -Uvh glibc-2.17-55.el6.x86_64.rpm \ glibc-common-2.17-55.el6.x86_64.rpm \ glibc-devel-2.17-55.el6.x86_64.rpm \ glibc-headers-2.17-55.el6.x86_64.rpm
上面命令如果报错,在结尾加上命令 --force --nodeps
参考资料:
http://movingon.cn/2017/05/05/CentOS-6-x-%E5%A6%82%E4%BD%95%E5%8D%87%E7%BA%A7-glibc-2-17/
https://gist.github.com/harv/f86690fcad94f655906ee9e37c85b174
http://blog.ttionya.com/article-1559.html
glibcxxx (从3.4.13升级至3.4.19)
上面截图报错二的原因一般是由于当前编译器gcc版本低造成的,通过升级gcc解决上面的报错。当前环境从gcc4.4.7升级至4.8.2。
操作步骤:
(1)查看当前glibcxx版本 strings /usr/lib/libstdc++.so.6 | grep GLIBC
(2)查看软连接信息 ls -l /usr/lib64/libstdc++.so.6 ,不同版本的glibcxx,对应的目标文件版本号不同,4.8.2对应的小版本号是libstdc++.so.6.0.18
(3)下载gcc4.8.2源码包。http://ftp.tsukuba.wide.ad.jp/software/gcc/releases 或者https://gcc.gnu.org/pub/gcc/releases/
(4)yum 安装 gcc yum -y install gcc gcc-c++ libstdc++ libstdc++-devel autoconf make
如果不执行这个步骤,汇报下面的错误
make[2]: Leaving directory `/home/imdb/gcc-4.8.2/gcc-build-4.8.2' make[1]: *** [stage1-bubble] 错误 2 make[1]: Leaving directory `/home/imdb/gcc-4.8.2/gcc-build-4.8.2' make: *** [all] 错误 2
(5)解压源码包,安装依赖的类库。
这里有两种安装方法,联网自动安装和离线手动安装。
联网自动安装通过 ./contrib/download_prerequisites 这个脚本去下载类库,解压安装依赖的类库,但是在我操作的过程中,这个脚本里提供的下载网址速度很慢,无法满足需要,我就选择了下载到本地离线安装。
离线手动安装 可以vim contrib/download_prerequisites ,查看里面具体的操作,分成三步 下载、解压、连接。可以用迅雷替代wget下载里面的三个文件或者使用镜像地址下载,镜像地址可以参考https://gcc.gnu.org/mirrors.html。 手动安装时,主要注意目录,将下载好的gmp 、mpfr 、mpc目录名称重命名(去掉版本号),把他们放gcc4.8.2这个目录下,这样做是为了在编译gcc时,同时编译这三个类库。
(6)创建build目录,在build目录中configure,make,make install, make的时间比较久,做好准备,也可以做个 &> log 文件,记录安装日志。
(7)验证版本 strings /usr/lib/libstdc++.so.6 | grep GLIBC
参考资料:
https://www.cnblogs.com/yingsi/p/3775664.html
https://blog.51cto.com/531117978/2311161