【问题标题】:RabbitMQ install issue on Centos 5.5Centos 5.5 上的 RabbitMQ 安装问题
【发布时间】:2011-07-24 17:24:33
【问题描述】:

我一直在尝试让 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 rabbitmq centos5


    【解决方案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_ 宏。

    如果发行版将内核头文件安装到 /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
    

    应该变成

    //#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,你会看到

    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 编译,并且会产生一个环境,您可以针对 using the --nodeps method discussed here 安装 rabbitmq。

    【讨论】:

      【解决方案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

      安装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
      

      【讨论】:

        【解决方案3】:

        如果 erlang 是从源代码安装的,rabbitmq 的 rpm install 无法识别 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编译它。 --nodeps 不检查依赖关系,只安装rabbitmq。这是错误的。
        • 我在谷歌研究了几个小时后尝试了这个解决方案,它确实有效。因为在使用 rpm 时,它会查找从源代码编译 erlang 时找不到的 erlang rpm
        【解决方案4】:

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

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

        【讨论】:

        • Erlang R14B03 (erts-5.8.4) 的编译适用于 CentOS 5.6 (Final) VirtualBox VM
        【解决方案5】:

        对于未来寻找这个答案的人,RabbitMQ 网站本身为您提供了一个潜在的答案:

        Installing on RPM-based 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。

        【讨论】:

          【解决方案6】:

          如果您在最小的操作系统安装上手动构建 Erlang,您可能还会发现您需要安装 wxGTK 和 wxGTK-devel 才能正确构建和运行所有测试。

          【讨论】:

            猜你喜欢
            • 2011-05-18
            • 2011-03-25
            • 2015-04-13
            • 2011-05-25
            • 2012-03-18
            • 1970-01-01
            • 2011-03-27
            • 2011-07-22
            • 1970-01-01
            相关资源
            最近更新 更多