You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Cassandra更换非默认tmp目录后启动失败报SIGSEGV错误

解决RHEL8上Cassandra因/tmp noexec及Java版本冲突导致的启动失败问题

问题根源分析

  1. /tmp挂载noexec限制:Cassandra依赖JNA动态生成临时共享库,/tmp的noexec标志导致无法加载这些库,触发UnsatisfiedLinkError。
  2. Java版本冲突:错误日志显示JRE版本为11,但实际安装的是Java 8,说明Cassandra启动时调用了错误的JDK版本,导致NoSuchMethodError等链接异常(Java 8与11的MethodHandle API存在差异)。

解决方案步骤

1. 强制Cassandra使用Java 8

  • 检查当前Cassandra使用的Java版本:
    cassandra -v
    
  • 编辑/etc/cassandra/cassandra-env.sh,明确指定Java 8的安装路径(替换为实际路径):
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
    
  • 验证JAVA_HOME配置:
    source /etc/cassandra/cassandra-env.sh && echo $JAVA_HOME
    

2. 配置可执行的自定义临时目录

  • 创建Cassandra专属临时目录并设置权限:
    mkdir -p /var/lib/cassandra/tmp
    chown cassandra:cassandra /var/lib/cassandra/tmp
    chmod 700 /var/lib/cassandra/tmp
    
  • 确认该目录所在挂载点无noexec限制:
    mount | grep /var
    
    若输出包含noexec,需联系运维调整挂载参数,或更换到无该限制的目录(如/opt/cassandra/tmp)。
  • 在cassandra-env.sh中添加临时目录参数(删除之前的语法错误,如多余反引号):
    JVM_OPTS="$JVM_OPTS -Djna.tmpdir=/var/lib/cassandra/tmp"
    JVM_OPTS="$JVM_OPTS -Djava.io.tmpdir=/var/lib/cassandra/tmp"
    

3. 备选方案:使用预编译JNA本地库

若自定义临时目录仍有问题,可跳过动态生成步骤,直接使用预编译的JNA本地库:

  • 从Cassandra自带的jna-5.9.0.jar中提取libjnidispatch.so:
    unzip -j /usr/share/cassandra/lib/jna-5.9.0.jar com/sun/jna/linux-x86-64/libjnidispatch.so -d /usr/lib64/
    
  • 设置文件权限:
    chmod 644 /usr/lib64/libjnidispatch.so
    

4. 验证启动

  • 重启Cassandra服务:
    systemctl restart cassandra
    
  • 检查启动日志确认无错误:
    tail -f /var/log/cassandra/system.log
    

内容的提问来源于stack exchange,提问作者Andreas Larfors

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:44:50