squid: Недопустимая инструкция (сброшено ядро)

squid: Недопустимая инструкция (сброшено ядро)

ОС: Oracle Solaris 11.3.1.5.2, архитектура ЦП: 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

но я не могу запустить Squid:

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), аварийно завершают работу с ошибкой недопустимой инструкции вскоре после запуска.

Симптомы

Squid аварийно завершает работу с ошибкой Illegal Instruction сразу после запуска на виртуальной машине на процессорах, совместимых с Intel

Объяснение

Система сборки Squid по умолчанию использует -march=native опцию gcc для оптимизации результирующего двоичного файла. К сожалению, некоторые системы (пара-)виртуализации не поддерживают весь набор инструкций, который они рекламируют. Компилятор не знает и генерирует инструкции, которые вызывают эту ошибку.

Обходной путь

Эти оптимизации полезны, но не обязательны для полностью функционального squid, особенно на платформах ia64/amd64. Обнаруженные значения по умолчанию можно переопределить, указав опцию --disable-arch-native в скрипте конфигурации.

(конец цитаты)

Мы работаем на Solaris.внутри VMware ESXi 6.0. Так что, я думаю, вот в чем причина.

Я не буду удалять свой вопрос на тот случай, если кто-то еще с этим столкнется.

решение2

Клиенты с контрактами Oracle Support могут получить версию squid, скомпилированную с -march=nativeотключенным флагом в Solaris 11.3 SRU 17 (11.3.17.5.0) из /supportрепозитория. Это включает исправления для:

  • Ошибка 22051233 - squid сразу падает на процессоре AMD
  • Ошибка 22380085 — 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)

Строка 23 — это строка в скрипте запуска, /lib/svc/method/http-squidгде он пытается запустить Squid. Второе число (1833 в этом примере) кажется инкрементным при каждой неудаче, но бессмысленным.

В конце концов я скопировал двоичный файл Squid /usr/squid/sbin/squidиз старой установки Solaris 11.0 (17 МБ вместо 46 МБ), и затем он, похоже, заработал нормально. Не "правильное" решение, но определенно простое, если у вас есть доступ к старой установке!

Связанный контент