CentOS6.5 gcc4.4升级后libc.so.6冲突回滚:手把手救场笔记

昨晚刚把gcc4.4升到6.5,重启后ssh直接炸锅,libc.so.6: version `GLIBC_2.14' not found红字刷屏,业务进程全挂。别慌,这台老机器是我吃饭的家伙,十分钟内必须让它重新开口说话。下面把踩坑+回滚全过程一字不落写下来,照着敲,九成能活。

先别急着重装——确认现场
1. 控制台或iDRAC先登进去,看能不能进单用户模式。
开机按任意键进GRUB,选中内核按e,在kernel行末尾加single init=/bin/bash,回车+b启动。
2. 系统起来后,mount -o remount,rw /把根目录挂成可写,先df -h确认/没满,再ls -l /lib64/libc.so.6看软链指向。
如果看到libc-2.12.so被改成了libc-2.14/2.17,那基本可以确定:升级gcc时顺手把glibc也“带飞”了,CentOS6.5原生只认2.12,高了就罢工。
最稳的回滚思路:就地降级glibc

重装系统?数据量上百G,备份窗口没有,PASS。
用LiveCD拷文件?机器在异地机房,PASS。
最省时的办法:把旧版本libc请回来,软链指回去,让系统先能启起来,再慢慢收拾残局。
Step1 找到救命包——提前备好官方rpm
升级前如果做了yum缓存,那恭喜你:
cd /var/cache/yum/x86_64/6/base/packages
大概率能看到glibc-2.12-1.209.el6.x86_64.rpm和glibc-common-2.12-1.209.el6.x86_64.rpm。
没有缓存?用外网机wget拖同版本rpm,scp拷进单用户目录。
别图省事去网上随便下“2.12”就装,小版本号必须和原来一致,rpm -q --queryformat '%{VERSION}-%{RELEASE}\n' -p glibc*.rpm先核对。
Step2 强制降级——无视依赖先救命
单用户下网络没启,yum不能用,直接rpm上阵:
rpm -Uvh --force --nodeps glibc-2.12-1.209.el6.x86_64.rpm glibc-common-2.12-1.209.el6.x86_64.rpm
看到warning: /lib64/libc-2.12.so already exists别管,–force会覆盖。
装完立即ln -sf /lib64/libc-2.12.so /lib64/libc.so.6,再ldconfig -v刷新缓存。
Step3 验证系统活没活
1. /lib64/libc.so.6敲回车,如果打印出版本列表里最高只有GLIBC_2.12,说明软链成功。
2. ls /lib64/ld-linux-x86-64.so.2确认loader也指回2.12版。
3. 直接执行/sbin/init,系统切回正常运行级,sshd能启,业务进程陆续拉起来,top看负载下降,基本回血。
Step4 把gcc也恢复原位
glibc降级后,高版gcc还会调用新符号,直接跑会段错误。
用yum history list找升级事务ID,yum history undo ID号一键回退gcc、cpp、libgcc整套包。
如果history被清,就手动rpm -e把devtoolset或源码装的gcc6目录删干净,再yum install gcc gcc-c++装回4.4.7。
确认gcc --version输出4.4.7 20120313 (Red Hat 4.4.7-23)。
Step5 收尾——锁定版本+备份
1. 在/etc/yum.conf里加exclude=glibc* glibc-devel* glibc-common*,防止下次误升级。
2. 把刚救命的glibc-2.12-1.209.el6.x86_64.rpm单独拷到/root/backup,写个3行小脚本:
#!/bin/bash
cp -f /root/backup/glibc*.rpm /tmp && rpm -Uvh --force /tmp/glibc*.rpm && ldconfig
chmod +x /root/rollback_glibc.sh,下次再翻车直接跑脚本,两分钟搞定。
3. 给同事留一份操作手册,贴机房显眼处,别再用yum -y update一把梭。
常见作死场景对照
• 用源码编译升级glibc,make install直接覆盖系统目录——十秒内系统必死,只能用LiveCD救。
• 看到网上教程“wget libc6_2.17.deb,alien转rpm”就装——包结构不同,ldconfig崩,回滚都救不了。
• 只回滚libc,没管libpthread、librt,结果dns解析、多线程程序继续报错——记得把glibc整套降级。
CentOS6.5天生只认glibc2.12,升级gcc可以,但千万别动libc;一旦冲突,单用户+旧版rpm强制降级+软链指回是最快最稳的回滚路线,数据不丢,业务不停,十分钟内可收工。
