erlang - esl - Problema de instalación de RabbitMQ en Centos 5.5
rabbitmq local (6)
Parece que este kernel no es compatible con Erlang 14B, 14B01 o 14B02
La compilación de Erlang 13B04 condujo a una instalación exitosa de rabbitmq-server
He intentado hacer que rabbitmq-server-2.4.0 funcione en Centos 5.5 en una instancia de Amazon AWS.
Mi instancia usa el siguiente kernel: 2.6.18-xenU-ec2-v1.2
He intentado la instalación de erlang y rabbitmq-server usando: 1) repos de yum 2) instalación directa de rpm 3) compilación desde la fuente.
En todos los casos, aparece el siguiente mensaje cuando intento iniciar el proceso RabbitMQ-Server:
pthread / ethr_event.c: 98: Error fatal en espera __ (): Función no implementada (38)
Cualquier ayuda sería apreciada.
Si erlang está instalado desde el origen, la instalación de rpm de rabbitmq no reconoce erlang indicando que se requiere erlang R12B-3.
Utilizar:
rpm --nodeps -Uvh rabbitmq-server-2.6.1-1.noarch.rpm
Pude instalar y usar RabbitMQ 2.6.1 con éxito en CentOS 5.6 con Erlang R14B04
Para que las personas en el futuro encuentren esta respuesta, el sitio RabbitMQ en sí tiene una respuesta potencial para usted:
Instalación en Linux basado en RPM (CentOS, Fedora, OpenSuse, RedHat)
Erlang en RHEL 5 (y CentOS 5)
Debido a la política de actualización del paquete EPEL, EPEL 5 contiene la versión R12B-5 de Erlang, que es relativamente antigua. rabbitmq-server es compatible con R12B-5, pero el rendimiento puede ser inferior al de las versiones más recientes de Erlang, y ciertas funciones no esenciales no son compatibles (compatibilidad con SSL, complementos basados en HTTP, incluido el complemento de gestión). Por lo tanto, le recomendamos que instale la versión estable más reciente de Erlang. La forma más fácil de hacerlo es usar un repositorio de paquetes provisto para este fin por el propietario del paquete EPEL Erlang. Habilítelo invocando (como raíz):
wget -O /etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo
y luego instalar o actualizar erlang con yum install erlang.
Si recorre la ruta de construir Erlang manualmente en una instalación mínima del sistema operativo, también puede encontrar que necesita instalar wxGTK & wxGTK-devel para que todas las pruebas se compilen y se ejecuten correctamente.
Lo instalé instalando primero erlang por fuente:
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
Después de eso, crea un enlace simbólico para hacer que erl esté disponible para el usuario raíz:
sudo ln -s /usr/local/bin/erl /bin/erl
Instale rabbitmq rpm (Tal vez la última versión del cheque desactualizado):
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
El problema
Al iniciar erlang, el mensaje pthread/ethr_event.c:98: Fatal error in wait__(): Function not implemented (38)
es, en las distribuciones modernas, muy probablemente el resultado de un binario Erlang precompilado que interactúa con un núcleo que no funciona implementar FUTEX_WAIT_PRIVATE y FUTEX_WAKE_PRIVATE. Los núcleos que Amazon proporciona para EC2 no implementan estas macros FUTEX_PRIVATE_.
Intentar crear Erlang desde el origen en un cuadro ec2 puede fallar de la misma manera si la distribución instala los encabezados del kernel en / usr / include / linux como requisito de otros paquetes. (Por ejemplo, Centos requiere el paquete kernel-headers como un requisito previo para gcc, gcc-c ++, glibc-devel y glibc-headers, entre otros). Dado que los encabezados instalados por el paquete no coinciden con el kernel instalado por los scripts de creación de imágenes EC2, Erlang asume incorrectamente que FUTEX_WAIT_PRIVATE y FUTEX_WAKE_PRIVATE están disponibles.
La solución
Para solucionarlo, el más rápido es parchear manualmente erts/include/internal/pthread/ethr_event.h
para usar la implementación no-_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
debe convertirse
//#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
Examen rápido
Si sospecha que el problema privado de futex es su problema, pero desea verificarlo antes de volver a compilar todo Erlang, el siguiente programa puede precisarlo:
#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
en futextest.c
, luego gcc futextest.c
y ./a.out
.
Si su núcleo implementa futexes privados, verá
FUTEX_WAKE SUCCESS
FUTEX_WAIT SUCCESS
FUTEX_WAKE_PRIVATE SUCCESS
FUTEX_WAIT_PRIVATE SUCCESS
Si tienes un kernel sin las _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
FUTEX_WAKE SUCCESS
FUTEX WAIT SUCCESS
FUTEX_WAKE_PRIVATE HAD ERR 38: Function not implemented
FUTEX_WAIT_PRIVATE HAD ERR 38: Function not implemented
Esta corrección debería permitir a Erlang compilar, y generará un entorno que puede instalar rabbitmq contra el uso del método --nodeps que se discute aquí .