Centos 5.5上的RabbitMQ安装问题

| 我一直在尝试启动Rabbitmq-server-2.4.0并在Centos上运行 5.5在Amazon AWS实例上。 我的实例使用以下内核:2.6.18-xenU-ec2-v1.2 我尝试使用以下方法安装erlang和Rabbitmq-server: 1)百胜回购 2)直接rpm安装 3)从源代码编译。 在任何情况下,尝试启动 RabbitMQ-Server进程: pthread / ethr_event.c:98:wait __()中发生致命错误:函数不存在 已实施(38) 任何帮助,将不胜感激。     
已邀请:
问题 在现代发行版中,启动erlang时,消息“ 0”很可能是预编译的Erlang二进制文件与未实现FUTEX_WAIT_PRIVATE和FUTEX_WAKE_PRIVATE的内核交互的结果。 Amazon为EC2提供的内核未实现这些FUTEX_PRIVATE_宏。 如果发行版根据其他软件包的要求将内核头文件安装到/ usr / include / linux中,则尝试从ec2盒上的源代码构建Erlang可能会以相同的方式失败。 (例如,Centos需要将内核头文件包作为gcc,gcc-c ++,glibc-devel和glibc-header等的先决条件)。由于软件包安装的标头与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
应该成为
//#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
。 如果您的内核实现了私有功能,您将看到
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进行编译,并将产生一个环境,您可以使用在此讨论的--nodeps方法安装Rabbitmq。     
我首先通过按源安装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
安装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
    
如果从源安装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     
似乎该内核与Erlang 14B,14B01或14B02不兼容 编译Erlang 13B04导致成功安装Rabbitmq-server     
对于将来会找到此答案的人们,RabbitMQ网站本身可能为您提供潜在的答案: 在基于RPM的Linux(CentOS,Fedora,OpenSuse,RedHat)上安装   RHEL 5(和CentOS 5)上的Erlang      根据EPEL软件包更新政策,EPEL 5包含Erlang版本   R12B-5,相对较旧。 rabbitmq-server支持R12B-5,但是   性能可能会低于最新的Erlang版本,并且   某些非核心功能不受支持(SSL支持,基于HTTP   插件,包括管理插件)。因此,我们建议   您安装了最新的稳定版本的Erlang。最简单的方法   为此,请使用为此目的提供的软件包存储库   EPEL Erlang软件包的所有者。通过调用(以root用户身份)启用它:      wget -O /etc/yum.repos.d/epel-erlang.repo   http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo      然后使用yum install erlang安装或更新erlang。     
如果您在最小限度的OS安装过程中走了手动构建Erlang的路线,则可能还会发现需要安装wxGTK和wxGTK-devel才能正确构建和运行所有测试。     

要回复问题请先登录注册