Ошибка установки RabbitMQ на Centos 5.5

Я пытаюсь запустить rabbitmq-server-2.4.0 и работать на Centos 5.5 на примере Amazon AWS.

В моем экземпляре используется следующее ядро: 2.6.18-xenU-ec2-v1.2

Я попытался установить erlang и rabbitmq-server, используя: 1) yum repos 2) установка прямого об/мин 3) компиляция из источника.

В каждом случае я получаю следующее сообщение при попытке запустить Процесс RabbitMQ-Server:

pthread/ethr_event.c: 98: Неустранимая ошибка в ожидании __(): Функция не реализовано (38)

Любая помощь будет оценена.

Ответ 1

Проблема

При запуске erlang сообщение pthread/ethr_event.c:98: Fatal error in wait__(): Function not implemented (38) на современных дистрибутивах, скорее всего, является результатом предварительно скомпилированного двоичного файла Erlang, взаимодействующего с ядром, которое не реализует FUTEX_WAIT_PRIVATE и FUTEX_WAKE_PRIVATE. Ядра Amazon для EC2 не реализуют эти макросы FUTEX_PRIVATE_.

Попытка построить Erlang из источника в поле ec2 может завершиться неудачно, если дистрибутив устанавливает заголовки ядра в /usr/include/linux в качестве требования к другим пакетам. (Например, Centos требует, чтобы пакет заголовков ядра являлся предварительным условием для gcc, gcc-С++, glibc-devel и glibc-заголовков, среди прочих). Поскольку заголовки, установленные пакетом, не соответствуют ядру, установленному сценариями создания образа EC2, Erlang неправильно предполагает, что FUTEX_WAIT_PRIVATE и FUTEX_WAKE_PRIVATE доступны.

Исправление

Чтобы исправить это, самым быстрым является исправление вручную erts/include/internal/pthread/ethr_event.h, чтобы использовать реализацию non-_PRIVATE futex:

#if defined(FUTEX_WAIT_PRIVATE) && defined(FUTEX_WAKE_PRIVATE)
#  define ETHR_FUTEX_WAIT__ FUTEX_WAIT_PRIVATE
#  define ETHR_FUTEX_WAKE__ FUTEX_WAKE_PRIVATE
#else
#  define ETHR_FUTEX_WAIT__ FUTEX_WAIT
#  define ETHR_FUTEX_WAKE__ FUTEX_WAKE
#endif

должен стать

//#if defined(FUTEX_WAIT_PRIVATE) && defined(FUTEX_WAKE_PRIVATE)
//#  define ETHR_FUTEX_WAIT__ FUTEX_WAIT_PRIVATE
//#  define ETHR_FUTEX_WAKE__ FUTEX_WAKE_PRIVATE  
//#else
#  define ETHR_FUTEX_WAIT__ FUTEX_WAIT
#  define ETHR_FUTEX_WAKE__ FUTEX_WAKE
//#endif

Быстрый тест

Если вы подозреваете, что проблема с частным futex является вашей проблемой, но вы хотите проверить его, прежде чем перекомпилировать все Erlang, следующая программа может закрепить его:

#include <sys/syscall.h>
#include <unistd.h>
#include <sys/time.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
typedef uint32_t u32; /* required on older kernel headers to fix a bug in futex.h Delete this line if it causes problems. */
#include <linux/futex.h>

int main(int argc, char *argv[])
{
#if defined(FUTEX_WAIT) && defined(FUTEX_WAKE) 
        uint32_t i = 1;
        int res = 0;
        res = syscall(__NR_futex, (void *) &i, FUTEX_WAKE, 1,
                        (void*)0,(void*)0, 0);
        if (res != 0)
        {
                printf("FUTEX_WAKE HAD ERR %i: %s\n", errno, strerror(errno));
        } else {
                printf("FUTEX_WAKE SUCCESS\n");
        }

        res = syscall(__NR_futex, (void *) &i, FUTEX_WAIT, 0,
                        (void*)0,(void*)0, 0);
        if (res != 0)
        {
                printf("FUTEX_WAIT HAD ERR %i: %s\n", errno, strerror(errno));
        } else {
                printf("FUTEX_WAIT SUCCESS\n");
        }
#else
        printf("FUTEX_WAKE and FUTEX_WAIT are not defined.\n");
#endif

#if defined(FUTEX_WAIT_PRIVATE) && defined(FUTEX_WAKE_PRIVATE) 
        uint32_t j = 1;
        int res_priv = 0;
        res_priv = syscall(__NR_futex, (void *) &j, FUTEX_WAKE_PRIVATE, 1,
                        (void*)0,(void*)0, 0);
        if (res_priv != 0)
        {
                printf("FUTEX_WAKE_PRIVATE HAD ERR %i: %s\n", errno, strerror(errno));
        } else {
                printf("FUTEX_WAKE_PRIVATE SUCCESS\n");
        }

        res_priv = syscall(__NR_futex, (void *) &j, FUTEX_WAIT_PRIVATE, 0,
                        (void*)0,(void*)0, 0);
        if (res_priv != 0)
        {
                printf("FUTEX_WAIT_PRIVATE HAD ERR %i: %s\n", errno, strerror(errno));
        } else {
                printf("FUTEX_WAIT_PRIVATE SUCCESS\n");
        }
#else
        printf("FUTEX_WAKE_PRIVATE and FUTEX_WAIT_PRIVATE are not defined.\n");
#endif


        return 0;
}

Вставьте его в futextest.c, затем gcc futextest.c и ./a.out.

Если ваше ядро ​​реализует частные futexes, вы увидите

FUTEX_WAKE SUCCESS
FUTEX_WAIT SUCCESS
FUTEX_WAKE_PRIVATE SUCCESS
FUTEX_WAIT_PRIVATE SUCCESS

Если у вас есть ядро ​​без функций _PRIVATE futex, вы увидите

FUTEX_WAKE SUCCESS
FUTEX WAIT SUCCESS
FUTEX_WAKE_PRIVATE HAD ERR 38: Function not implemented
FUTEX_WAIT_PRIVATE HAD ERR 38: Function not implemented

Это исправление должно позволить Erlang компилироваться и даст среду, в которой вы можете установить rabbitmq против используя описанный здесь метод --nodeps.

Ответ 2

Я установил его, сначала установив erlang по источнику:

sudo yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
wget http://www.erlang.org/download/otp_src_R13B04.tar.gz
tar xfvz otp_src_R13B04.tar.gz
cd otp_src_R13B04/
./configure
sudo make install

После этого создайте символическую ссылку, чтобы сделать erl доступным для пользователя root:
sudo ln -s /usr/local/bin/erl /bin/erl

Установите rpm-rpm (возможно, устаревшая проверка последней версии):

wget http://www.rabbitmq.com/releases/rabbitmq-server/v2.4.1/rabbitmq-server-2.4.1-1.noarch.rpm
rpm -Uvh rabbitmq-server-2.4.1-1.noarch.rpm

Ответ 3

Если erlang установлен из источника, rpm установка rabbitmq не может распознать erlang, заявив, что требуется erlang R12B-3.
Использование:
  rpm --nodeps -Uvh rabbitmq-server-2.6.1-1.noarch.rpm

Я смог установить и использовать RabbitMQ 2.6.1 успешно на CentOS 5.6 с Erlang R14B04

Ответ 4

Кажется, что это ядро ​​несовместимо с Erlang 14B, 14B01 или 14B02

Компиляция Erlang 13B04 привела к успешной установке сервера rabbitmq

Ответ 5

Для людей, которые в будущем найдут этот ответ, сам сайт RabbitMQ найдет для вас потенциальный ответ:

Установка на Linux на основе RPM (CentOS, Fedora, OpenSuse, RedHat)

Erlang на RHEL 5 (и CentOS 5)

Из-за политики обновления пакета EPEL EPEL 5 содержит версию Erlang R12B-5, который является относительно старым. rabbitmq-сервер поддерживает R12B-5, но производительность может быть ниже, чем для более ранних версий Erlang, и некоторые неосновные функции не поддерживаются (поддержка SSL, HTTP-based плагины, включая плагин управления). Поэтому мы рекомендуем вы устанавливаете самую последнюю стабильную версию Erlang. Самый простой способ для этого необходимо использовать репозиторий пакетов, предоставленный для этой цели, посредством владелец пакета EPEL Erlang. Включите его, вызвав (как root):

wget -O/etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo

а затем установите или обновите erlang с помощью yum install erlang.

Ответ 6

Если вы спуститесь по пути сборки Erlang вручную при минимальной установке ОС, вы также можете обнаружить, что вам нужно установить wxGTK и wxGTK-devel, чтобы все тесты были правильно построены и запущены.