在Centos 5.5上安装RabbitMQ问题

Dre*_*rew 11 erlang centos5 rabbitmq

我一直在尝试在Amazon AWS实例上启动并运行Centam 5.5上的rabbitmq-server-2.4.0.

我的实例使用以下内核:2.6.18-xenU-ec2-v1.2

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

在每种情况下,我在尝试启动RabbitMQ-Server进程时都会收到以下消息:

pthread/ethr_event.c:98:等待中的致命错误__():函数未实现(38)

任何帮助,将不胜感激.

bre*_*ent 13

问题

在启动erlang时,消息pthread/ethr_event.c:98: Fatal error in wait__(): Function not implemented (38)是,在现代发行版中,很可能是预编译的Erlang二进制文件与未实现FUTEX_WAIT_PRIVATE和FUTEX_WAKE_PRIVATE的内核交互的结果.亚马逊为EC2提供的内核不实现这些FUTEX_PRIVATE_宏.

如果发行版将内核头文件作为其他软件包的要求安装到/ usr/include/linux中,尝试在ec2框上从源构建Erlang可能会以同样的方式失败.(例如,Centos需要kernel-headers包作为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) && 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
Run Code Online (Sandbox Code Playgroud)

应该成为

//#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
Run Code Online (Sandbox Code Playgroud)

快速测试

如果您怀疑私有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;
}
Run Code Online (Sandbox Code Playgroud)

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

如果你的内核实现了私有的futex,你会看到

FUTEX_WAKE SUCCESS
FUTEX_WAIT SUCCESS
FUTEX_WAKE_PRIVATE SUCCESS
FUTEX_WAIT_PRIVATE SUCCESS
Run Code Online (Sandbox Code Playgroud)

如果你的内核没有_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
Run Code Online (Sandbox Code Playgroud)

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


Sam*_*nga 11

我通过首先按来源安装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
Run Code Online (Sandbox Code Playgroud)

之后创建一个符号链接,以便为root用户提供erl:
sudo ln -s /usr/local/bin/erl /bin/erl

安装rabbitmq 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
Run Code Online (Sandbox Code Playgroud)


小智 6

如果从源代码安装了erlang,则rabbitmq的rpm安装无法识别erlang,表明需要使用erlang R12B-3.
使用:
rpm --nodeps -Uvh rabbitmq-server-2.6.1-1.noarch.rpm

我能够在使用Erlang R14B04的CentOS 5.6上成功安装和使用RabbitMQ 2.6.1

  • 我在谷歌研究了几个小时后尝试了这个解决方案,它的确有效.因为在使用rpm时,它会查找从源代码编译erlang时无法找到的erlang rpm (2认同)

Dre*_*rew 2

似乎该内核与 Erlang 14B、14B01 或 14B02 不兼容

编译Erlang 13B04导致rabbitmq-server安装成功