对glibc的操作非常危险,如果您对Linux操作系统的操作仅限于查看别人的资料来解决问题的话,我还是比较真诚的劝退你了。只所以还是写下这篇博文,一是为了记录自己排错的过程,二是更正目前网络中一些不太正确的博文,防止将新手带入坑中。
centos7.9 在运行一些软件时,会出现/lib64/libc.so.6: version GLIBC_2.18 not found
的提示,原因是centos7.9默认使用的是glibc 2.17。为了运行这类程序,我们理所当然的想到升级glibc。以下就是升级glibc 到 2.18的命令。大家感兴趣的话可以在测试环境中实验,如果没有充分的把握千万不要在生产环境中使用。
1.安装glibc 2.18
使用下面的命令安装glibc 2.18
wget https://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
tar zxvf glibc-2.18.tar.gz
cd glibc-2.18
mkdir build && cd build
../configure --prefix=/usr
make -j$(nproc)
make install
在执行上述命令时很顺畅,并没有报错提示,安装完成后,使用命令ldd --version
,查看当前的glibc,发现已经是2.18了。并且再次前面报错的程序时能够正常运行了。
正当你感到如释重担的时候,可是当系统重启后,你会惊奇的发现已经无法进入桌面系统了。查了许多资料,问题指向是glibc 2.18版本的问题,只要把glibc 2.18 回滚到glibc 2.17,就会解决以上问题了。
重启系统后,我的虚拟机已经无法显示桌面了,好在ssh还可以登录。
进入/lib64
目录,使用下面的命令查看当前glibc 2.18的相关信息。
cd /lib64
ll -h | grep "2\.18"
从上图我们可以发现,有很多软链接都指向了2.18
的版本。我们可以到正常运行的系统中查看一下看看有什么区别。
通过对比发现,在构建glibc 2.18 时使用--prefix=/usr
安装的glibc 2.18将软连接都改成2.18了。接下来我们只要把2.18改回2.17就应该能将glibc版本回滚了。
📓 请认真核查对应的软链接。
2.重新安装glibc
首先使用下面的命令重新安装glibc.
yum update
yum reinstall -y glibc
3.重新链接到glibc 2.17
进入/lib64
目录,先将所有的glibc 2.18相关的连接库删除。
rm -rf ld-2.18.so libanl-2.18.so libBrokenLocale-2.18.so libc-2.18.so libcidn-2.18.so libcrypt-2.18.so libdl-2.18.so libm-2.18.so libnsl-2.18.so libnss_compat-2.18.so libnss_db-2.18.so libnss_dns-2.18.so libnss_files-2.18.so libnss_hesiod-2.18.so libnss_nis-2.18.so libnss_nisplus-2.18.so libpthread-2.18.so libresolv-2.18.so librt-2.18.so libutil-2.18.so
然后再删除libc.so.6
,删除libc.so.6
以后,很多常用的命令就无法使用了,我们使用sln
命令进行重新链接。
重建glibc 2.17链接。
sln ld-2.17.so ld-linux-x86-64.so.2
sln ld-2.17.so libanl.so.1
sln libBrokenLocale-2.17.so libBrokenLocale.so.1
sln libcidn-2.17.so libcidn.so.1
sln libcrypt-2.17.so libcrypt.so.1
sln libdl-2.17.so libdl.so.2
sln libm-2.17.so libm.so.6
sln libnsl-2.17.so libnsl.so.1
sln libnss_compat-2.17.so libnss_compat.so.2
sln libnss_db-2.17.so libnss_db.so.2
sln libnss_dns-2.17.so libnss_dns.so.2
sln libnss_files-2.17.so libnss_files.so.2
sln libnss_hesiod-2.17.so libnss_hesiod.so.2
sln libnss_nisplus-2.17.so libnss_nisplus.so.2
sln libnss_nis-2.17.so libnss_nis.so.2
sln libpthread-2.17.so libpthread.so.0
sln libresolv-2.17.so libresolv.so.2
sln librt-2.17.so librt.so.1
sln libutil-2.17.so libutil.so.1
接下来重建libc.so.6
链接到libc-2.17.so
sln libc-2.17.so libc.so.6
完成上述操作后,重启系统,桌面能够正常登录了。
然而事情远没有结束。
正常登录系统后,你会发现系统还比较卡顿,然后使用ldd --version
命令查看当前的glibc 版本仍然是2.18.
同时我心中也有点暗自高兴,难道通过上面的一通操作把centos7的glibc版本已经正常升级到2.18了吗?接着我去运行之前有报错提示的程序,结果有点让我失望,还是提示/lib64/libc.so.6: version GLIBC_2.18 not found
,看来目前的glibc版本已经是2.17了,只是ldd
命令显示的不正常而已。
4.重新安装glibc相关软件包
首先使用以下命令查看当前的glibc 2.17相关的软件包。
rpm -qa | grep glibc
使用下面的命令重新安装glibc。
yum reinstall -y glibc-2.17-326.el7_9.x86_64 glibc-headers-2.17-326.el7_9.x86_64 glibc-devel-2.17-326.el7_9.x86_64 compat-glibc-2.12-4.el7.centos.x86_64 glibc-common-2.17-326.el7_9.x86_64 compat-glibc-headers-2.12-4.el7.centos.x86_64
再次使用ldd --version
命令查看glibc的版本已经是2.17了。
重启系统,一切正常。