오징어: 불법 명령어(코어 덤프)

오징어: 불법 명령어(코어 덤프)

운영 체제: 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 플랫폼에서 Squid가 완전히 작동하는 데 반드시 필요한 것은 아닙니다. --disable-arch-native 감지된 기본값은 구성 스크립트에 옵션을 제공하여 무시할 수 있습니다 .

(인용 끝)

우리는 솔라리스를 실행하고 있습니다VMware ESXi 6.0 내부. 그래서 그런 것 같아요.

다른 사람들도 이 문제를 겪을 것이기 때문에 내 질문은 삭제하지 않겠습니다.

답변2

-march=nativeOracle 지원 계약을 맺은 고객은 저장소에서 Solaris 11.3 SRU 17(11.3.17.5.0)에서 비활성화된 플래그로 컴파일된 Squid 버전을 얻을 수 있습니다 /support. 여기에는 다음 수정 사항이 포함됩니다.

  • 버그 22051233 - Squid가 AMD 프로세서에 즉시 떨어집니다.
  • 버그 22380085 - VM 내부에서 실행할 때 오징어의 잘못된 명령

답변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)에 코어 덤프 오류 줄이 표시됩니다.

/lib/svc/method/http-squid: line 23: 1833: Illegal instruction(coredump)

/lib/svc/method/http-squid23번째 줄은 Squid를 시작하려고 시도하는 시작 스크립트의 줄입니다. 두 번째 숫자(이 경우 1833)는 실패할 때마다 증가하는 것처럼 보이지만 의미가 없습니다.

마지막으로 /usr/squid/sbin/squid이전 Solaris 11.0 설치에서 Squid 바이너리(46MB 대신 17MB)를 복사했는데 제대로 작동하는 것 같았습니다. 이것은 "올바른" 솔루션은 아니지만 이전 설치에 액세스할 수 있다면 확실히 쉬운 솔루션입니다!

관련 정보