鱿鱼:非法指令(核心转储)

鱿鱼:非法指令(核心转储)

操作系统: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),然后它似乎工作正常。这不是一个“正确”的解决方案,但如果您可以访问旧的安装,这肯定是一个简单的解决方案!

相关内容