惨痛教训之CentOS7.9升级到glibc2.34
起因是在虚拟机中安装gogs这个软件,但是提示缺少glibc然后就开始了折腾之旅,最终我也不知道我这个算不算是完成了升级(反正gogs是跑起来了),仅留下此文供各位借鉴,不要重蹈覆辙(如果有知道到底怎么升级最保险也可留言分享下)!
友情提醒!升级glibc前 一定要备份系统!一定要备份系统!一定要备份系统! 遇到问题先不要关闭ssh或终端窗口,也不要重启,避免再也连不上!
对,我就是那个虚拟机忘记打快照,一路头铁操作下去的人!结果就是所有的命令行都执行不了报错“sed: relocation error: /lib64/libpthread.so.0: symbol __libc_vfork version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference” 桌面环境浏览器网页也无法打开提示“XML 解析错误:未定义的实体”以及无法打开桌面终端!
过程快速回顾:
1、查看本机glibc版本是2.17
2、更新系统 sudo yum update 重启系统后还是2.17
3.1、安装gcc-8.2.0依赖环境
3.2、升级GNU Make 到4.2.1
3.3、升级GCC
3.4、下载glibc 2.28 (我这里真是后悔没有直接下载glibc2.34)
3.5、编译安装glibc2.28
4.1、 继续下载glibc2.34
4.2、编译安装glibc2.34失败,遇到各种问题(所有命令执行都报错)
5、疯狂找教程尝试解决问题,指定环境变量后貌似修复了
6、glibc导致的终端无法打开等问题修复
一、一切的起因gogs
通过官方地址尝试进行二进制安装https://gogs.io/docs/installation/install_from_binary,下载解压后在运行gogs web命令时错误出现

然后我直接yum install glibc命令安装后,查看版本是2.17,执行gogs web还是报一样的错,看来是版本太低了需要升级。

二、升级 glibc 2.17 到2.28(比较危险,虚拟机快照,云服务器快照,服务器备份; 做好最坏打算)
在升级前sudo yum update这个更新命令还是建议执行下,升级完成后重启下。
后面升级过程基本都是参考此教程地址:https://roy.wang/centos7-upgrade-glibc/
有个注意事项后面下载glibc安装包要记下路径位置,后面修复错误时可能会用到!我虚拟机装了宝塔所以在安装gogs时就在server目录下建了gogs文件夹,然后遇到gogs web执行错误后,就直接在该目录下载安装包了,所以下载的文件这些都混一起了!

1、安装gcc-8.2.0所依赖的环境
yum install bison -y yum -y install wget bzip2 gcc gcc-c++ glibc-headers
2、升级GNU Make到4.2.1(我执行命令时都是在gogs目录下)
wget http://ftp.gnu.org/gnu/make/make-4.2.1.tar.gz tar -zxvf make-4.2.1.tar.gz cd make-4.2.1 mkdir build cd build ../configure --prefix=/usr/local/make && make && make install export PATH=/usr/local/make/bin:$PATH ln -s /usr/local/make/bin/make /usr/local/make/bin/gmake make -v

3、升级GCC
yum install -y devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-binutils echo "source /opt/rh/devtoolset-8/enable" >> /etc/profile source /etc/profile
4、下载glibc2.28(这里我应该直接下载2.34版本,之所以下2.28是以为2.28-2.34之间有任何一个版本也行!结果导致2.28安装编译后看起来没问题,然后又下载安装编译2.34导致了一系列问题)
下载glibc前命令窗口的执行路径确保已经手动../切换到了gogs目录下了(如果不手动切换就会停留在第2步的 gogs/make-4.2.1/build/)!
wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.xz xz -d glibc-2.28.tar.xz tar -xvf glibc-2.28.tar cd glibc-2.28 mkdir build
如果是下载2.34只需要把命令里面的4处2.28替换成2.34即可
5、编译安装glibc,切换目录到glibc-2.28 或glibc2.34目录下,然后再执行 cd build 及后面的命令;需要执行很长时间耐心等待!
cd build ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin make -j4 make install
查看信息strings /lib64/libc.so.6 | grep GLIBC发现已经有glibc2.28了,顺利的话到这里就结束了。

6、安装后我尝试gogs web发现还是报错,就决定再升级到glibc2.34版本,切换命令路径到gogs下,然后又照着前面4、5步骤又执行了一遍(区别就是把命令里面的2.28换成了2.34)
6.1、好不容易升级完后发现天塌了! 我在终端里面直接按回车都会报错 !遇到这个问题千万不要关闭当前终端避免后面连接不上!
sed: relocation error: /lib64/libpthread.so.0: symbol __libc_vfork version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference

然后在桌面环境打开浏览器也报错

三、尝试修复
在上面出现问题后感觉很不妙,已经做好了还原系统到很早很早之前备份版本的准备了,在网上又搜索了一番发现一篇可能解决的文章->【如何安全,高效,优雅的提升linux的glibc版本_glibc升级】,参考了里面提供的解决办法

把上面4个命令里面的 /root/glibc-2.34/ 换成自己的路径,因为我是2.34而且是下载到gogs目录下解压编译的,故换成/www/server/gogs/glibc-2.34/即可。
LD_PRELOAD=/lib64/libc-2.34.so sln /www/server/gogs/glibc-2.34/build/libc.so.6 /lib64/libc.so.6 LD_PRELOAD=/lib64/libc-2.34.so sln /www/server/gogs/glibc-2.34/build/dlfcn/libdl.so.2 /lib64/libdl.so.2 LD_PRELOAD=/lib64/libc-2.34.so sln /www/server/gogs/glibc-2.34/build/nptl/libpthread.so.0 /lib64/libpthread.so.0 LD_PRELOAD=/lib64/libc-2.34.so sln /www/server/gogs/glibc-2.34/build/elf/ld-linux-x86-64.so.2 /usr/lib64/ld-linux-x86-64.so.2

执行完后再看基本恢复正常,然后我又切换到/www/server/gogs/glibc-2.34/build这个目录执行了make install编译命令,结果还是报错,但是能看到2.34的版本了,也不知道算不算是成功!

四、桌面环境终端无法打开,转圈后直接消失
1、先尝试把语言改成英文再看能不能打开

2、另外升级glibc后需要执行相关命令确保字符集编码正常安装设置,在安装时的/www/server/gogs/glibc-2.34/build目录执行 make localedata/install-locales 。(需要执行相当长一段时间)

执行完毕后就可以了,然后看了下终端命名、docker、浏览器、gogs运行这些暂时没发现异常。

基于互联网精神,在注明出处的前提下本站文章可自由转载!
本文链接:https://ranjuan.cn/centos-update-glibc2-34/
微信赞赏
支付宝赞赏
发表评论