CentOS 5.5上的RabbitMQ安装问题 [英] RabbitMQ install issue on Centos 5.5

查看:202
本文介绍了CentOS 5.5上的RabbitMQ安装问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我已经尝试在Amazon AWS实例上的Centos
5.5上运行了rabbitmq-server-2.4.0。使用以下内核:2.6.18-xenU-ec2-v1.2



我尝试使用以下方式安装erlang和rabbitmq-server:
1) yum repos
2)直接rpm安装
3)从源代码编译。



在每种情况下,尝试启动时都会收到以下消息
RabbitMQ服务器进程:



pthread / ethr_event.c:98:wait __()中的致命错误:函数不是
已实现(38)



任何帮助将不胜感激。

解决方案

问题



当启动erlang时,消息 pthread / ethr_event.c:98:wait __()中的致命错误:函数未实现(38)在现代发行版中最可能是预编译的Erlang二进制文件与内核交互的结果,该内核不实现FUTEX_WAIT_PRIVATE和FUTEX_WAKE_PR IVATE。亚马逊为EC2提供的内核不实现这些FUTEX_PRIVATE_宏。



尝试在ec2框上的源代码构建Erlang可能会以同样的方式失败如果发行版将内核头安装到/ usr / include / linux中作为其他包的要求。 (例如,Centos要求将内核头文件包作为gcc,gcc-c ++,glibc-devel和glibc-headers等的先决条件)。由于程序包安装的头文件与EC2映像创建脚本所安装的内核不匹配,所以Erlang不正确地假定FUTEX_WAIT_PRIVATE并且FUTEX_WAKE_PRIVATE可用。



修复



要解决它,最快的是手动修补 erts / include / internal / pthread / ethr_event.h 使用非_PRIVATE futex实现:

  #if defined(FUTEX_WAIT_PRIVATE)&&定义(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)&&定义(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; / *需要在较旧的内核头文件中修复futex.h中的错误如果导致问题,请删除此行。 * /
#include< linux / futex.h>

int main(int argc,char * argv [])
{
#if defined(FUTEX_WAIT)&&定义(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\\\
,errno,strerror(errno));
} else {
printf(FUTEX_WAKE SUCCESS\\\
);
}

res = syscall(__ NR_futex,(void *)& i,FUTEX_WAIT,0,
(void *)0,(void *)0,0)
如果(res!= 0)
{
printf(FUTEX_WAIT HAD ERR%i:%s\\\
,errno,strerror(errno));
} else {
printf(FUTEX_WAIT SUCCESS\\\
);
}
#else
printf(FUTEX_WAKE和FUTEX_WAIT未定义。\);
#endif

#if defined(FUTEX_WAIT_PRIVATE)&&定义(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\\\
,errno,strerror(errno));
} else {
printf(FUTEX_WAKE_PRIVATE SUCCESS\\\
);
}

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\\\
,errno,strerror(errno));
} else {
printf(FUTEX_WAIT_PRIVATE SUCCESS\\\
);
}
#else
printf(FUTEX_WAKE_PRIVATE和FUTEX_WAIT_PRIVATE未定义。\);
#endif


返回0;
}

将其粘贴到 futextest.c ,然后 gcc futextest.c ./ a.out



如果您的内核实施私人未来,您将看到

  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:功能未实现
FUTEX_WAIT_PRIVATE HAD ERR 38:功能未实现

这个修复程序应该允许Erlang进行编译,并且将产生一个环境,您可以安装rabbitmq来对抗使用这里讨论的--nodeps方法


I've been trying to get rabbitmq-server-2.4.0 up and running on Centos 5.5 on an Amazon AWS instance.

My instance uses the following kernel: 2.6.18-xenU-ec2-v1.2

I've tried installation of erlang and rabbitmq-server using: 1) yum repos 2) direct rpm installation 3) compiling from source.

In every case, I get the following message when attempting to start the RabbitMQ-Server process:

pthread/ethr_event.c:98: Fatal error in wait__(): Function not implemented (38)

Any help would be appreciated.

解决方案

The problem

When starting erlang, the message pthread/ethr_event.c:98: Fatal error in wait__(): Function not implemented (38) is, on modern distros, most likely the result of a precompiled Erlang binary interacting with a kernel that doesn't implement FUTEX_WAIT_PRIVATE and FUTEX_WAKE_PRIVATE. The kernels Amazon provides for EC2 do not implement these FUTEX_PRIVATE_ macros.

Attempting to build Erlang from source on an ec2 box may fail in the same way if the distro installs kernel headers into /usr/include/linux as a requirement of other packages. (E.g., Centos requires the kernel-headers package as a prerequisite for gcc, gcc-c++, glibc-devel and glibc-headers, among others). Since the headers installed by the package do not match the kernel installed by the EC2 image creation scripts, Erlang incorrectly assumes FUTEX_WAIT_PRIVATE and FUTEX_WAKE_PRIVATE are available.

The fix

To fix it, the fastest is to manually patch erts/include/internal/pthread/ethr_event.h to use the non-_PRIVATE futex implementation:

#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

should become

//#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

Quick test

If you suspect the private futex issue is your problem, but want to verify it before you recompile all of Erlang, the following program can pin it down:

#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;
}

Paste it into futextest.c, then gcc futextest.c and ./a.out.

If your kernel implements private futexes, you'll see

FUTEX_WAKE SUCCESS
FUTEX_WAIT SUCCESS
FUTEX_WAKE_PRIVATE SUCCESS
FUTEX_WAIT_PRIVATE SUCCESS

If you have a kernel without the _PRIVATE futex functions, you'll see

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

This fix should allow Erlang to compile, and will yield an environment you can install rabbitmq against using the --nodeps method discussed here.

这篇关于CentOS 5.5上的RabbitMQ安装问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆