查sonar.log和es.log确认失败阶段:sonar.log是第一入口,明确卡在JVM启动、ES进程拉起或Web层启动;若出现fail to launch process [es]或bootstrap checks failed,说明ES未启动;Java heap space或OutOfMemoryError表明内存不足;es.log则细粒度暴露vm.max_map_count过低、permission denied、node.lock锁定等问题。

查sonar.log和es.log确认失败阶段
启动失败时,sonar.log是第一入口,它会明确告诉你卡在哪一步:是 JVM 启动失败、ES 进程拉不起来,还是 Web 层根本没起来。如果日志里出现 fail to launch process [es] 或 bootstrap checks failed,说明 ES 没跑起来;如果看到 Java heap space 或 OutOfMemoryError,基本就是内存问题。
接着必须看 es.log(路径通常为 logs/es.log),它比 sonar.log 更细粒度地暴露 ES 自身的初始化问题——比如 max virtual memory areas vm.max_map_count is too low、permission denied、node.lock is locked,这些都直接决定后续动作。
验证系统级内存与虚拟内存配置
SonarQube 10.x 内置 ES 8,对 Linux 系统参数极其敏感,不是 Java 堆内存设高就万事大吉。
-
vm.max_map_count必须 ≥262144:临时生效用sysctl -w vm.max_map_count=262144,永久写入/etc/sysctl.conf -
fs.file-max和用户级nofile也要调高:比如echo "* soft nofile 65535" >> /etc/security/limits.conf - Java 堆内存不能只改
SONAR_OPTS:还要检查conf/wrapper.conf中wrapper.java.maxmemory是否匹配,且总值别超过物理内存 75%
特别注意:Docker 部署时,这些参数需在宿主机设置,容器内 sysctl 默认被禁用,--sysctl 参数要显式传入。
检查 ES 目录权限和锁文件冲突
ES 拒绝以 root 运行,也拒绝访问无权目录,常见报错如 java.nio.file.AccessDeniedException: /data/sonarqube/temp/conf/es 或 /data/sonarqube/data/es8/node.lock。
- 确保整个
sonarqube目录归属非 root 用户(如sonar):chown -R sonar:sonar /opt/sonarqube -
temp和data/es8目录必须可读写:chmod 755 /opt/sonarqube/temp /opt/sonarqube/data/es8 - 若
node.lock存在且无其他进程占用,直接删掉:rm -f /opt/sonarqube/data/es8/node.lock - ES 启动时依赖
/tmp或自定义ES_TMPDIR,若提示does not exist or is not accessible,优先在elasticsearch/config/jvm.options中硬编码-Djava.io.tmpdir=/opt/sonarqube/temp
确认 JDK 版本与 ES 兼容性
SonarQube 10.x 强制要求 JDK 17,但 ES 8.10+ 实际运行时对 JDK 的具体实现有隐含偏好——Oracle JDK 或 Temurin 17 是最稳的,OpenJDK 17(尤其某些旧 patch)可能触发 can not run elasticsearch as root 之外的类加载异常。
- 执行
java -version确认输出含17.且非17.0.0这类极早期版本 - 检查
conf/wrapper.conf中wrapper.java.command是否指向正确 JDK 路径,避免复用系统默认但版本不符的java - ES 日志中若出现
ClassNotFoundException或UnsupportedClassVersionError,基本可锁定 JDK 不兼容,换用 Temurin 17.0.2+ 或 Oracle JDK 17.0.9+
真正卡住的地方往往不是“哪里错了”,而是多个条件叠加:比如 vm.max_map_count 不够 + node.lock 残留 + JDK 版本偏差,三者缺一都会让 ES 启动失败,但日志只报最后一环。排查时得按顺序过,别跳步。

















