@bazel_tools与@remote_java_tools_linux权限问题求助
Bazel增量构建权限问题排查与解决
问题现象
增量构建时出现临时目录删除失败错误:
Analyzing: target <target I'm building> INFO: Repository remote_java_tools_linux instantiated at: /DEFAULT.WORKSPACE.SUFFIX:374:6: in <toplevel> <project_root_dir>/external/bazel_tools/tools/build_defs/repo/utils.bzl:233:18: in maybe Repository rule http_archive defined at: <project_root_dir>/external/bazel_tools/tools/build_defs/repo/http.bzl:372:31: in <toplevel> ERROR: An error occurred during the fetch of repository 'remote_java_tools_linux': Traceback (most recent call last): File "<project_root_dir>/bazel_tools/tools/build_defs/repo/http.bzl", line 132, column 45, in _http_archive_impl download_info = ctx.download_and_extract( Error in download_and_extract: java.io.IOException: Couldn't delete temporary directory (<project_root_dir>/remote_java_tools_linux/temp6718266017446538312)
同时删除项目目录时遇到权限拒绝:
rm: cannot remove <project_root_dir>/bazel-out/k8-opt-exec-2B5CBBC6/bin/external/bazel_tools/tools/jdk/platformclasspath_classes/DumpPlatformClassPath.class: Permission denied
可能原因
- 残留Bazel进程占用文件:之前的Bazel构建进程未正常退出,导致相关文件被锁定,无法删除或修改。
- 文件所有权不匹配:曾使用
sudo或其他用户身份运行过Bazel,生成的文件归其他用户(如root)所有,当前用户无操作权限。 - 系统安全机制限制:SELinux、AppArmor等安全模块阻止Bazel操作文件,或项目所在分区挂载时带有
noexec、ro等限制。
解决步骤
清理残留Bazel进程
先查找并终止所有Bazel相关进程:ps aux | grep bazel kill -9 <进程PID>修复文件所有权
检查问题文件的所有权:ls -l <project_root_dir>/bazel-out/k8-opt-exec-2B5CBBC6/bin/external/bazel_tools/tools/jdk/platformclasspath_classes/DumpPlatformClassPath.class如果文件归root或其他用户所有,递归修改项目目录所有权为当前用户:
sudo chown -R $USER:$USER <project_root_dir>彻底清理Bazel缓存
使用--expunge参数彻底清除所有Bazel生成的缓存和临时文件:bazel clean --expunge该命令会删除
bazel-out、bazel-cache等所有构建产物,比普通bazel clean更彻底。检查文件系统挂载限制
查看项目所在分区的挂载属性:mount | grep $(df -P <project_root_dir> | tail -1 | awk '{print $1}')确保没有
ro(只读)、noexec(禁止执行)等限制,若有则调整挂载参数。临时关闭安全模块(可选)
如果是Linux系统,可临时关闭SELinux测试:sudo setenforce 0若问题解决,需配置SELinux规则允许Bazel操作相关文件,而非长期关闭。
内容的提问来源于stack exchange,提问作者rmac
相关产品推荐
相关产品推荐

