ejabberd 14.07在ubuntu14.04上面的编译
ejaberd社区版本的源码分为两个发行版本:一个是在ejabberd官方站点:http://www.process-one.net/en/ejabberd/downloads下载的源码。大概有60多兆,该版本已经配置好了configure脚本,只需要简单的执行
./configure make make install 就会按照默认的配置进行安装。
configure的可以用到的选项有很多,我们关心的选项主要有两个:
--prefix=installlocation
该选项配置安装的目录。
--enable-user=username
该选项配置可以执行ejabberdctl配置脚本的用户,该用户必须在执行配置脚本之前就已经存在与系统中。否则无效。
之后执行make就会进行编译。
编译的过程中可能会遇到各种错误,根据提示信息我们一般都可以很轻松的解决错误。我遇到了两个依赖项不存在的错误。根据提示执行命令:
apt-get installlibyaml-0-2 libyaml-dev libexpat1 libexpat1-dev安装依赖项
依赖项安装好之后重新make通过。
然后执行make install会安装ejabberd到目录installlocation下的各个子目录中
安装完成之后将管理脚本ejabberdctl所在的路径加入你的PATH变量中就可以执行命令
ejabberdctlstart来启动ejabberd
我的配置过程使用了选项—enable-user。
在启动之后执行ejabberdctl命令时ejabberd直接崩溃提示:{error_logger,{{2014,9,25},{10,40,24}},"Errorwhen reading /root/.erlang.cookie: eacces",[]} 。
也就是说在读取cookie文件的时候,文件不存在,或者没有权限读取,可是我是root用户执行的,怎么能够没有权限,而且确实也存在cookie文件。只能分析一下启动脚本了。启动脚本的一部分如下:
# define defaultenvironment variables
13 SCRIPT_DIR=`cd${0%/*} && pwd`
14 ERL=/usr/bin/erl
15INSTALLUSER=quanzhuo
16
17 # Compatibilityin ZSH
18 #setoptshwordsplit 2>/dev/null
19
20 # check theproper system user is used if defined
21 if ["$INSTALLUSER" != "" ] ; then
22 EXEC_CMD="false"
23 for GID in`id -G`; do
24 if [$GID -eq 0 ] ; then
25 EXEC_CMD="su $INSTALLUSER -p -c"
26 fi
27 done
28 if [ `id -g`-eq `id -g $INSTALLUSER` ] ; then
29 EXEC_CMD="sh -c"
30 fi
31 if ["$EXEC_CMD" = "false" ] ; then
32 echo"This command can only be run by root or the user $INSTALLUSER">&2
33 exit 4
34 fi
35 else
36 EXEC_CMD="sh-c"
37 fi
可以看出脚本先设置INSTALLUSER变量为quanzhuo,也即我在配置的时候指定的用户,然后它会判断如果执行启动脚本的用户属于root用户组的话就切换到quanzhuo用户后执行以后的命令。如果当前用户和quanzhuo用户同属于一个用户组的话就以当前用户执行……
那么这样就很清楚了:当以root执行启动脚本的时候,默认会切换到安装用户然后执行。我们的普通用户当然没有读取root目录下的.erlang.cookie文件的权限了……
将上面第25行注释掉,更改为EXEC_CMD=”sh-c”再次用root执行ejabberdctl命令的时候,没有出现任何问题。
思考:
大概定位了一下崩溃的地方:在auth:read_cookie()中会调用函数init:get_argument(home).可能就是在此处得出了错误的用户主目录。于是我以root用户在终端中执行命令:su quanzhuo -c -p erl进入erl之后。执行init:get_argument(home)得到的用户主目录是/root。这算不算是erlang/otp发行包的一个bug?