Tag: resin

resin 在debian testing下的ipv6 问题

最近装的resin 3.0.x 都很不顺利,经常起不来,jvm.log 爆出这样的错:

Can’t connect to parent process through socket 48403
Resin needs to connect to its parent.

resin 3.0.x 大概是这样的工作机制的,起一个perl 作为一个master process ,这个master process 再负责起一个jvm 负责处理java 请求。而log 中的意思,就是 jvm 无法与这个master process 连接通讯,结果就起不来了。

国外也有朋友与我同样的问题呢:http://bugs.caucho.com/view.php?id=350

后来我看到这篇文章 http://people.debian.org.tw/~chihchun/2010/02/03/connectivity-issue-of-java-with-ipv6/,觉得终于找到正解了!

大概的意思就是,jvm 是支持ipv6的,可惜一般情况下,debian 会启动 ipv6 的 network interface ,但是,并没有其相应的路由,这样,java 就找不到路去连接 parent process 了。

既然是ipv6 的问题,剩下的问题就是如何关闭ipv6 了。

以下这个帖子比较全,linux 下n种禁用ipv6 的方法:http://hi.baidu.com/ramboo0913/blog/item/71efa09959ddcb0b6f068cc8.html

但是,这些方法,只是关闭以模块的形式载入内核的ipv6,如果已经把ipv6 编译进内核,那以上的方法都是不奏效的。我的debian 通常会升级到 testing ,很不幸,ipv6 已经在内核中了。可以这样查看,uname -a 看一下我使用了哪个内核,结果是“2.6.30-2-amd64” ,然后去 /boot/ 中,查看config-2.6.30-2-amd64 这个文件,这个文件记录了编译内核的参数,会见到 “CONFIG_IPV6=y” ,证明ipv6 已经编译进内核了,如果是模块的话,应该是“CONFIG_IPV6=m” 的。

其实判断ipv6 是否以模块的形式载入,很简单。

命令 ip addr | grep inet6 有输出,但是 lsmod | grep ipv6 却没输出,证明了ipv6 已经编译进内核了。

那这种编译进内核的情况,如何解决呢??google 告诉我,修改 /boot/grub/menu.lst ,把

kernel          /boot/vmlinuz-2.6.30-2-amd64 root=/dev/cciss/c0d0p1 ro

改为

kernel          /boot/vmlinuz-2.6.30-2-amd64 root=/dev/cciss/c0d0p1 ro ipv6.disable=1

reboot 即可。

其实还可以在线地关闭ipv6 ,运行命令

$sudo /sbin/ip addr del <ipv6address>/<prefixlength> dev ethX

文中还提到一个方法,就是在resin/bin 下,修改wrapper.pl,在

#
# Additional args to pass to java after command-line args.
#

后,加一句

$EXTRA_JAVA_ARGS="-Djava.net.preferIPv4Stack=true";

这样也就默认使用ipv4了。

其实文章已经说得很明白的了,我只是稍微简化一下,觉得不能理解的,还是参看一下原文吧。

祭出google 大神无数,终于解决问题。我这个SA 啊,就是一个靠google 混饭吃的。。。

———————————————–

updated :

新装的 debian 的内核参数,都是

net.ipv6.bindv6only = 1

的,而旧的都是

net.ipv6.bindv6only = 0

这样就解释了为什么resin 一启动就要 ipv6 了,但可以找不到 ipv6 的路由。。。sign….