环境
- Red Hat Enterprise Linux Server release 6.7 (Santiago)
- Kernel: 2.6.32-573.el6.x86_64
- glibc: 2.15
序
我也不知道为啥,9102年的服务器还在用2.6内核,可能这就是redhat吧。
由于服务器上有几个公司在用的服务,让IT帮忙0点备份了系统,早上5点半起床,6点开始尝试升级glibc。如果升级失败导致系统异常,还能让IT在上班前把系统恢复回去。
现在是7点半,已经升级完成、把Seafile部署好了。
记录一下这次升级glibc的过程。
起因
需要在公司服务器上部署Seafile。
看了下内核版本2.6,docker是没戏了,手动部署吧。
下载的Seafile 6.3.4,之所以没用最新的7.0,是因为我在自己虚拟机上用docker部署7.0的时候出现了问题(后来发现完全是因为自己手残)。
配置是交互式的,过程也算简单,唯一遇到的问题是服务器的mysql密码是空的,但交互式配置一定要让我输入密码,这里改了下源码。
配置完之后开始安装,遇到了问题:
/root/haiwen/seafile-server-6.3.4/seafile/bin/ccnet-init: /lib/libc.so.6: version `GLIBC_2.17' not found (required by /root/haiwen/seafile-server-6.3.4/seafile/lib/libssl.so.10)
/root/haiwen/seafile-server-6.3.4/seafile/bin/ccnet-init: /lib/libc.so.6: version `GLIBC_2.17' not found (required by /root/haiwen/seafile-server-6.3.4/seafile/lib/libcrypto.so.10)
/root/haiwen/seafile-server-6.3.4/seafile/bin/ccnet-init: /lib/libc.so.6: version `GLIBC_2.17' not found (required by /root/haiwen/seafile-server-6.3.4/seafile/lib/libevent-2.0.so.5)
/root/haiwen/seafile-server-6.3.4/seafile/bin/ccnet-init: /lib/libc.so.6: version `GLIBC_2.17' not found (required by /root/haiwen/seafile-server-6.3.4/seafile/lib/libglib-2.0.so.0)
/root/haiwen/seafile-server-6.3.4/seafile/bin/ccnet-init: /lib/libc.so.6: version `GLIBC_2.16' not found (required by /root/haiwen/seafile-server-6.3.4/seafile/lib/libkrb5.so.3)
/root/haiwen/seafile-server-6.3.4/seafile/bin/ccnet-init: /lib/libc.so.6: version `GLIBC_2.17' not found (required by /root/haiwen/seafile-server-6.3.4/seafile/lib/libcom_err.so.2)
/root/haiwen/seafile-server-6.3.4/seafile/bin/ccnet-init: /lib/libc.so.6: version `GLIBC_2.17' not found (required by /root/haiwen/seafile-server-6.3.4/seafile/lib/libmount.so.1)
/root/haiwen/seafile-server-6.3.4/seafile/bin/ccnet-init: /lib/libc.so.6: version `GLIBC_2.17' not found (required by /root/haiwen/seafile-server-6.3.4/seafile/lib/libblkid.so.1)
Error: Failed to generate ccnet configuration
看这错误,大概是glibc版本不够吧。
升级glibc
按网上的说法,稍有不慎整机崩溃。我自然是没敢怠慢。
看了下yum里glibc最新只有2.12,找了很多教程,决定手动升级。
glibc源码
http://ftp.gnu.org/pub/gnu/glibc/
选的glibc-2.17.tar.gz
过程
wget http://ftp.gnu.org/pub/gnu/glibc/glibc-2.17.tar.gz
tar -zxvf glibc-2.17.tar.gz
cd glibc-2.17
mkdir build ## 这里一定要新建一个文件夹
cd build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
make
make install
在make install时报错:
# 前面省略
rm -f /root/haiwen/glibc-2.17/build/stubs.h
/root/haiwen/glibc-2.17/build/elf/sln /root/haiwen/glibc-2.17/build/elf/symlink.list
rm -f /root/haiwen/glibc-2.17/build/elf/symlink.list
make[1]: *** [install-symbolic-link] Segmentation fault (core dumped)
make[1]: Leaving directory `/root/haiwen/glibc-2.17'
make: *** [install] Error 2
然后大部分指令都:
Segmentation fault (core dumped)
看来是真的升级失败了。还好之前看了升级失败后恢复的教程,开始尝试:
export LD_LIBRARY_PATH=/lib64:$LD_LIBRARY_PATH
ls -l /lib64|grep 2.14|grep lrw|awk '{print "ln -snf "$11" "$9}'|sed 's/2.14/2.12/g'
很好,指令都恢复了。但是这个时候我新起一个终端远程登录是登录不上的,看来还是有问题。
不甘心,再次make install:
# 前面省略
rm -f /root/haiwen/glibc-2.17/build/stubs.h
/root/haiwen/glibc-2.17/build/elf/sln /root/haiwen/glibc-2.17/build/elf/symlink.list
rm -f /root/haiwen/glibc-2.17/build/elf/symlink.list
test ! -x /root/haiwen/glibc-2.17/build/elf/ldconfig || LC_ALL=C LANGUAGE=C \
/root/haiwen/glibc-2.17/build/elf/ldconfig \
/lib64 /usr/lib64
LD_SO=ld-linux-x86-64.so.2 CC="gcc -B/usr/bin/" /usr/bin/perl scripts/test-installation.pl /root/haiwen/glibc-2.17/build/
Your new glibc installation seems to be ok.
make[1]: Leaving directory `/root/haiwen/glibc-2.17'
成功了。
远程登录也正常了。后面安装Seafile就很顺利了,不说了。
验证
尝试 strings /lib64/libc.so.6 |grep GLIBC:
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_PRIVATE
总结
我不知道失败之后再次安装为什么会成功,也不知道发生了什么、系统会不会因此不稳定。
能安装成功纯属运气好。
所以我提醒尝试升级glibc的你,最好别升级。如果一定要升级,切记做好系统备份!
参考
Linux系统直接升级GLIBC-2.17版本
【原创】大叔经验分享(27)linux服务器升级glibc故障恢复 (这里需要按实际glibc的版本修改一下他教程里的版本)