在Redhat-8.6上启动Apache Cassandra 4.1.3时遭遇UnsatisfiedLinkError错误的求助
Hey there, sorry to hear you're stuck with this epoll-related error when firing up Cassandra 4.1.3 on RHEL 8.6! Let's break down what's going on and walk through fixes step by step.
问题根源分析
你遇到的错误:
java.lang.UnsatisfiedLinkError: /tmp/libnetty_transport_native_epoll_x86_64xxxx.so: failed to map segment from shared object
本质是Cassandra依赖Netty的原生epoll传输提升性能,但它在/tmp目录生成的临时共享库文件无法被加载。这几乎都是因为/tmp目录的挂载参数过于严格——比如挂载时加了noexec或nodev标志,这会阻止共享库的执行。
可行解决方法
1. 检查并修复/tmp挂载权限
首先,先确认/tmp当前的挂载设置:
mount | grep /tmp
查看输出里是否有noexec或nodev这类限制标志,它们就是问题所在。
临时修复(重启后失效)
- 先卸载
/tmp(确保没有进程在使用它):umount /tmp - 重新挂载
/tmp并赋予正确权限:mount -o rw,exec,dev,suid /tmp - 现在尝试启动Cassandra:
systemctl start cassandra # 如果不用systemd,就用Cassandra自带启动脚本 # ./bin/cassandra
永久修复(重启后依然生效)
- 用编辑器打开
/etc/fstab文件(比如vi或nano):vi /etc/fstab - 找到
/tmp对应的行(可能类似tmpfs /tmp tmpfs defaults,noexec,nodev 0 0),删除noexec和nodev标志,修改后看起来像这样(其他标志可根据系统需求调整):tmpfs /tmp tmpfs rw,exec,dev,suid,nosuid,noatime 0 0 - 保存文件后,应用修改:
mount -a - 再次用
mount | grep /tmp验证,确认输出里有exec和dev标志。
2. 给Netty指定替代临时目录
如果因为安全或政策原因无法修改/tmp的挂载设置,你可以让Netty使用另一个允许执行共享库的目录(比如/var/tmp,默认就有合适的权限):
- 打开Cassandra的启动脚本(位于安装目录的
bin/cassandra),找到JVM参数配置部分,添加以下参数:-Dio.netty.native.workdir=/var/tmp/cassandra-netty-tmp - 创建这个目录,并将所有权设置为运行Cassandra的用户(通常是
cassandra):mkdir -p /var/tmp/cassandra-netty-tmp chown cassandra:cassandra /var/tmp/cassandra-netty-tmp - 重新启动Cassandra,查看日志确认错误是否消失。
验证修复效果
应用任一修复后,查看Cassandra系统日志(通常在/var/log/cassandra/system.log或安装目录的logs文件夹),确认epoll not available和UnsatisfiedLinkError的提示不再出现。也可以运行以下命令检查节点状态:
nodetool status
如果节点显示为UN(Up/Normal),就说明修复成功啦!
备注:内容来源于stack exchange,提问作者Mahesh

