![鱿鱼:非法指令(核心转储)](https://linux22.com/image/114944/%E9%B1%BF%E9%B1%BC%EF%BC%9A%E9%9D%9E%E6%B3%95%E6%8C%87%E4%BB%A4%EF%BC%88%E6%A0%B8%E5%BF%83%E8%BD%AC%E5%82%A8%EF%BC%89.png)
操作系统:Oracle Solaris 11.3.1.5.2,CPU架构:X86
我最近安装了 Squid
$ pkg install squid
这很顺利:
root@darwin1:~# pkg info squid
Name: web/proxy/squid
Summary: Squid Web Proxy Cache
Description: Squid is a caching proxy for the Web supporting HTTP, HTTPS,
FTP, and more.
Category: Web Services/Application and Web Servers
State: Installed
Publisher: solaris
Version: 3.5.5
Build Release: 5.11
Branch: 0.175.3.0.0.30.0
Packaging Date: Fri Aug 21 17:30:06 2015
Size: 51.84 MB
FMRI: pkg://solaris/web/proxy/[email protected],5.11-0.175.3.0.0.30.0:20150821T173006Z
但我无法运行鱿鱼:
root@darwin1:~# /usr/squid/sbin/squid -h
Illegal Instruction (core dumped)
该file
命令给了我这个:
root@darwin1:~# file /usr/squid/sbin/squid
/usr/squid/sbin/squid: ELF 32-bit LSB executable 80386 Version 1, dynamically linked, not stripped
我在本地(非内核)区域内。应该没什么关系吧?
为什么要核心转储?
答案1
抱歉,我想我自己已经找到了答案:http://wiki.squid-cache.org/KnowledgeBase/IllegalInstructionError。
(引用开始)
Squid 3.4 上的非法指令错误
概要 Squid 3.4 及更高版本,运行在某些半虚拟化系统甚至有些声称完全虚拟化(至少目前为止已经确认了KVM、Xen和Xen衍生品)在启动后不久就因非法指令错误而崩溃。
症状
在 Intel 兼容处理器上的虚拟机上启动后,Squid 立即崩溃并出现非法指令错误
解释
Squid 构建系统默认使用
-march=native
gcc 选项来优化生成的二进制文件。不幸的是,某些(半)虚拟化系统不支持他们宣传的整个指令集。编译器不知道,并生成触发此错误的指令。解决方法
这些优化很有帮助,但对于拥有功能齐全的鱿鱼来说不是必需的,特别是在 ia64/amd64 平台上。可以通过
--disable-arch-native
向配置脚本提供选项来覆盖检测到的默认值。
(引文结束)
我们正在运行 SolarisVMware ESXi 6.0 内部。所以我想这就是原因。
我不会删除我自己的问题,因为其他人也会遇到这个问题。
答案2
-march=native
拥有 Oracle 支持合同的客户可以从存储库获取在 Solaris 11.3 SRU 17 (11.3.17.5.0) 中禁用标志编译的鱿鱼版本/support
。这包括以下修复:
- Bug 22051233 -鱿鱼在 AMD 处理器上立即倒下
- Bug 22380085 - 在 VM 内运行时出现 Squid 非法指令
答案3
我在 Solaris 11.3 上也遇到了同样的问题。每次我启动 Squid 服务时,它都会进入maintenance
模式(您可以使用 检查svcs -a | grep squid
):
maintenance 21:17:13 svc:/network/http:squid
在日志 ( /var/svc/log/network-http:squid.log
) 中,我会得到 coredump 错误行:
/lib/svc/method/http-squid: line 23: 1833: Illegal instruction(coredump)
/lib/svc/method/http-squid
第 23 行是启动脚本中尝试启动 Squid 的行。第二个数字(本例中为 1833)似乎在每次失败时都会增加,但毫无意义。
最后,我/usr/squid/sbin/squid
从旧的 Solaris 11.0 安装中复制了 Squid 二进制文件(17MB 而不是 46MB),然后它似乎工作正常。这不是一个“正确”的解决方案,但如果您可以访问旧的安装,这肯定是一个简单的解决方案!