11

AmazonAWSインスタンスのCentos5.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:wait __()の致命的なエラー:関数が実装されていません(38)

どんな助けでもいただければ幸いです。

4

6 に答える 6

14

問題

erlang を起動するpthread/ethr_event.c:98: Fatal error in wait__(): Function not implemented (38)と、最近のディストリビューションでは、FUTEX_WAIT_PRIVATE および FUTEX_WAKE_PRIVATE を実装していないカーネルと対話するプリコンパイル済み Erlang バイナリの結果である可能性が最も高いメッセージです。Amazon が EC2 用に提供するカーネルは、これらの FUTEX_PRIVATE_ マクロを実装していません。

ディストリビューションが他のパッケージの要件としてカーネル ヘッダーを /usr/include/linux にインストールする場合、ec2 ボックスでソースから Erlang をビルドしようとすると、同じように失敗する可能性があります。(たとえば、Centos では、gcc、gcc-c++、glibc-devel、glibc-headers などの前提条件として kernel-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

クイックテスト

private 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 がコンパイルできるようになり、ここで説明されている --nodeps メソッドを使用して rabbitmq をインストールできる環境が生成されます。

于 2012-02-15T21:15:17.553 に答える
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

その後、シンボリックリンクを作成して、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
于 2011-04-17T18:01:55.053 に答える
6

erlang がソースからインストールされている場合、rabbitmq の rpm インストールは、erlang R12B-3 が必要であることを示す erlang を認識できません。
使用:
rpm --nodeps -Uvh rabbitmq-server-2.6.1-1.noarch.rpm

Erlang R14B04 を使用して、CentOS 5.6 に RabbitMQ 2.6.1 を正常にインストールして使用することができました。

于 2011-10-26T04:01:26.957 に答える
2

このカーネルは Erlang 14B、14B01、または 14B02 と互換性がないようです

Erlang 13B04 をコンパイルすると、rabbitmq-server のインストールが成功しました

于 2011-03-28T22:42:49.353 に答える
2

将来この答えを見つける人のために、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 をインストールまたは更新します。

于 2011-12-07T16:43:33.067 に答える