1 前言
在测试服务器上想把 tensorflow 相关代码部署一下
却发现 CentOS 6.1 带的 glibc 和 libstdc++ 都太老了,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 的软链接。
具体的步骤是:
- 编译一个新版的
glibc,并安装到独立的目录 - 切换到
root账户 - 删除
/lib64/libc.so.6这个软链接 - 设置
LD_PRELOAD指定一个可用的libc所在目录,使ln恢复正常 - 使用
ln -s将新版的glibc软链接到原处,也就是/lib64/libc.so.6
4 如果已经出事了
唯一的方法是通过 livecd / 其他系统 挂载硬盘恢复 libc。
5 我最后是如何解决这个问题的
在找虚拟化部门的同事修好了 libc 的软链接后,尝试编译新的 gcc 来获取新版的 libstdc++
手动指定两个新的 lib 后运行 tensorflow 后报错 Illegal instruction.
更换到 CentOS 7 后解决了 tensorflow 无法运行的问题。