Oracle Linux 8(ARM-Ampere处理器)运行EnvoyProxy时GLIBC版本缺失问题求助
我之前在Oracle Cloud的ARM-Ampere处理器上用Oracle Linux 8启动Envoy时,也碰到过一模一样的报错,折腾了好一阵才找到可行的解决办法,分享给你参考:
先明确你遇到的报错信息:
envoy: /lib64/libm.so.6: version
GLIBC_2.29' not found (required by envoy) envoy: /lib64/libpthread.so.0: versionGLIBC_2.30' not found (required by envoy)
这个问题的核心是Oracle Linux 8默认预装的GLIBC版本是2.28,而你当前用的Envoy二进制包是基于更高版本GLIBC编译的,导致版本不兼容。下面是几个靠谱的解决方向:
使用Envoy官方的静态编译/musl版本
很多预编译Envoy包依赖系统GLIBC,但官方也提供了不依赖系统库的静态编译版本(尤其是musl libc版本)。这类包会把所有依赖打包进去,不需要系统满足高版本GLIBC要求。你直接下载对应arm64架构的musl静态包,解压后就能直接运行,完全避开系统GLIBC版本的限制。手动编译适配当前系统GLIBC的Envoy
如果偏好使用系统库,也可以自己编译Envoy:- 先安装编译依赖:
sudo dnf install gcc gcc-c++ cmake ninja-build git python3-pip - 克隆Envoy源码仓库,切换到稳定的LTS版本分支
- 使用bazel编译时,指定适配Oracle Linux 8的编译参数,确保编译出的二进制依赖系统自带的2.28版本GLIBC。重点是让工具链对齐系统环境,具体参数可以参考官方针对RHEL8系列系统的编译指南。
- 先安装编译依赖:
局部加载高版本GLIBC运行Envoy(绝对不要替换系统GLIBC)
直接替换系统GLIBC会导致系统大部分工具崩溃,风险极高!你可以单独编译高版本GLIBC到非系统目录(比如/opt/glibc-2.30),然后通过环境变量指定临时加载这个高版本库来启动Envoy,命令示例:LD_LIBRARY_PATH=/opt/glibc-2.30/lib:$LD_LIBRARY_PATH ./envoy编译GLIBC时要注意用
--prefix参数指定安装路径,避免覆盖系统文件。
备注:内容来源于stack exchange,提问作者sm-a

