go模块下载报permission denied的根本原因是$gocache等路径被设为nfs共享或系统只读目录,导致并发锁失败或写入拒绝;应为每个用户显式设置本地$gocache、$gobin、$gopath并确保属主明确、可写,且全部避开$goroot。

Go模块依赖下载卡在permission denied,基本不是你代码或网络的问题,而是工具链试图往你没权限写的目录里写东西——比如/usr/local/go、/opt/gopath,或者NFS挂载的$HOME/.cache/go-build。
go mod download 报 permission denied:多半是 $GOCACHE 被多个用户共享
多人共用服务器(尤其 NFS 挂载 home 目录)时,go mod download 会并发尝试锁 $GOCACHE 下的 cache.lock,而 NFS 对 flock 支持弱,直接报错“cannot lock cache directory”或“permission denied”。
-
$GOCACHE默认是$HOME/.cache/go-build,但 NFS 上不同用户可能指向同一物理路径,锁冲突不可避免 - 别用
go env -w GOCACHE=...—— 它写进全局 env 文件,容易被 su 切换用户继承污染 - 正确做法是在
~/.bashrc或~/.zshrc中显式声明:
export GOCACHE=/tmp/$USER/go-cache mkdir -p /tmp/$USER/go-cache && chmod 700 /tmp/$USER/go-cache
确保路径本地磁盘、属主明确、无共享。验证:go env GOCACHE 输出必须是你刚设的路径,且 ls -ld /tmp/$USER/go-cache 显示 owner 是当前用户。
go install 写入 $GOBIN 失败:GOBIN 没设或指向了只读目录
go install 默认写入 $GOBIN;若未设,则 fallback 到 $GOPATH/bin;若 $GOPATH 也未设,再 fallback 到 $HOME/go/bin —— 这些路径若落在 NFS 或系统只读分区上,就必然失败。
- 不要依赖“默认就行”,尤其 Docker 容器或新装系统里
GOPATH常为空 - 必须显式创建并导出:
export GOPATH=$HOME/go、export GOBIN=$HOME/bin、export PATH=$GOBIN:$PATH - 确认
$HOME/bin存在且可写:mkdir -p $HOME/bin && chmod 755 $HOME/bin - 避免
go env -w GOBIN=...—— 它优先级高于 shell export,调试时反而掩盖真实路径
GOROOT 下写缓存失败:/usr/local/go 被当成可写区
用 sudo tar -C /usr/local -xzf go*.tar.gz 安装后,go version 正常,但 go install 报 permission denied,实际是 Go 尝试往 $GOROOT/pkg(如 /usr/local/go/pkg)写 build 缓存或模块数据,而该目录属主为 root。
- 普通用户不该、也不能往
$GOROOT写任何东西 - 解决方案只有两个:要么重装 Go 到用户目录(如
$HOME/go),要么确保所有写操作都走$GOBIN和$GOCACHE—— 它们必须避开$GOROOT - 验证:
go env GOROOT输出应是只读安装路径,go env GOPATH GOBIN GOCACHE全部指向用户可写路径
真正麻烦的不是配置本身,而是这些路径变量之间存在 fallback 链:一个没设,就会顺藤摸瓜掉进下一个坑。每次改完务必用 go env 逐个确认输出,再手动 ls -ld 看对应目录是否存在、属主是否正确、权限是否可写 —— 光靠命令执行成功不等于路径真生效。











