2018年7月

1 前言

在测试服务器上想把 tensorflow 相关代码部署一下

却发现 CentOS 6.1 带的 glibclibstdc++ 都太老了,tensorflow跑不起来。

于是想手动升级一下这两个 lib。

2 警告

如果你找到了这篇文章,并且你也想手动升级系统的libc:

“不要做这件蠢事”
“不要做这件蠢事”
“不要做这件蠢事”

太多抄来抄去的文章会教人替换 libc,却不说明任何细节和注意事项。

你需要做的,是使用LD_PRELOAD这个环境变量指定你所要使用的libc.so,而不是直接替换系统自带的 libc

3 如果你真的要这样做

如果你真的要手动升级 libc
并不在乎任何可能出现的兼容性问题,且知道其他可能出现的危害的话。

务必先切换到root账户,再进行libc软链接替换的操作。
否则在执行 sudo rm /lib64/libc.so.6 删除libc的软链接之后,
你会发现 sudo 以及一切 setuid 的程序都是不接受 LD_PRELOAD 参数的,导致你没有权限修复 libc 的软链接。

具体的步骤是:

  1. 编译一个新版的 glibc,并安装到独立的目录
  2. 切换到 root 账户
  3. 删除 /lib64/libc.so.6 这个软链接
  4. 设置 LD_PRELOAD 指定一个可用的 libc 所在目录,使 ln 恢复正常
  5. 使用 ln -s 将新版的 glibc 软链接到原处,也就是 /lib64/libc.so.6

4 如果已经出事了

唯一的方法是通过 livecd / 其他系统 挂载硬盘恢复 libc

5 我最后是如何解决这个问题的

在找虚拟化部门的同事修好了 libc 的软链接后,尝试编译新的 gcc 来获取新版的 libstdc++

手动指定两个新的 lib 后运行 tensorflow 后报错 Illegal instruction.

更换到 CentOS 7 后解决了 tensorflow 无法运行的问题。