使用Chef工具引导CentOS 5.8服务器时触发非法指令错误求助
解决CentOS 5.8上Chef Client首次运行时的openssl.so非法指令错误
这种在部分CentOS 5.8服务器上触发的openssl.so: [BUG] Illegal instruction错误,我之前帮朋友排查过类似情况,大概率是Chef预编译包的指令集兼容性或者系统老旧库不兼容导致的,下面给你几个可行的排查和解决方向:
先确认问题根源
首先可以快速定位是不是CPU指令集的问题:
- 在出问题的服务器上执行
cat /proc/cpuinfo | grep flags,查看CPU支持的指令集;再对比正常运行的服务器,看看有没有缺失的高级指令(比如sse4_2、avx这类)。Chef官方的预编译包通常是在较新的CPU上编译的,老服务器的CPU不支持这些指令就会触发非法指令错误。
另外可以单独测试Ruby的openssl模块,确认问题点:
/opt/chef/embedded/bin/ruby -r openssl -e "puts OpenSSL::VERSION"
如果同样报错,那基本可以锁定是Chef嵌入式的openssl库和服务器环境不兼容。
具体解决方案
1. 用适配老CPU的方式安装Chef
CentOS 5.8属于比较老旧的系统,Chef的预编译包可能已经不再适配它的硬件。你可以尝试两种方式:
- 安装更旧的Chef版本:比如Chef 12的早期版本(对应Ruby 2.1或更早),这些版本的预编译包可能还兼容老CPU。卸载当前版本后重新安装:
rpm -e chef wget https://packages.chef.io/files/stable/chef/12.19.36/el/5/chef-12.19.36-1.el5.x86_64.rpm rpm -ivh chef-12.19.36-1.el5.x86_64.rpm - 本地编译Chef:在出问题的CentOS 5.8服务器上手动编译,这样生成的库会完全适配本地CPU。步骤大概是:
- 安装编译依赖:
yum install gcc make ruby-devel openssl-devel zlib-devel - 用gem安装Chef(会自动编译适配本地环境的库):
gem install chef -v 12.19.36 --no-ri --no-rdoc
- 安装编译依赖:
2. 替换Chef嵌入式的openssl库为系统库
如果不想换Chef版本,可以尝试把系统自带的openssl库替换掉Chef嵌入式的版本(注意先备份):
# 备份原文件 mv /opt/chef/embedded/lib/ruby/2.3.0/x86_64-linux/openssl.so /opt/chef/embedded/lib/ruby/2.3.0/x86_64-linux/openssl.so.bak # 软连接系统的openssl库(路径可能需要根据实际调整,用find /usr -name libssl.so找) ln -s /usr/lib64/libssl.so.0.9.8e /opt/chef/embedded/lib/ruby/2.3.0/x86_64-linux/openssl.so
这个方法可能存在版本兼容风险,替换后记得测试Chef Client是否能正常运行。
3. 重新下载并安装Chef包
有时候是下载过程中包损坏导致的,重新下载对应版本的安装包再试:
rpm -e chef # 替换成你需要的Chef版本下载链接 wget https://packages.chef.io/files/stable/chef/13.8.5/el/5/chef-13.8.5-1.el5.x86_64.rpm rpm -ivh chef-13.8.5-1.el5.x86_64.rpm
4. 谨慎升级系统glibc(风险较高)
CentOS 5.8的glibc版本较低,可能和Chef嵌入式库不兼容。但升级glibc容易导致系统崩溃,除非必要不建议这么做。如果要尝试,先备份系统,然后找适配CentOS 5的glibc升级包(比如从第三方源获取),逐步升级。
额外建议
对比正常服务器和出问题服务器的CPU型号、glibc版本(ldd --version)、系统openssl版本(openssl version),找出差异点,能更快定位问题。
内容的提问来源于stack exchange,提问作者MuhammadNe
相关产品推荐
相关产品推荐

