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 无法运行的问题。