你正在使用哪个版本的Go( go version
)?
$ go version
go version go1.18.2 linux/amd64
这个问题在最新版本中是否重现?
是的
你正在使用什么操作系统和处理器架构( go env
)?
go env
输出
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/daenney/.cache/go-build"
GOENV="/home/daenney/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/daenney/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/daenney/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/lib/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.18.2"
GCCGO="gccgo"
GOAMD64="v1"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
GOWORK=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2560607780=/tmp/go-build -gno-record-gcc-switches"
你做了什么?
在 go test
系统上运行 /tmp
作为 noexec
挂载。
你期望看到什么?
测试运行,或者关于如何修复问题的有用建议。
你看到了什么?
fork/exec /tmp/go-build/...: .permission denied
在 #8451 中添加了新的 GOTMPDIR
,允许用户配置他们的系统来解决这种情况。不幸的是,如果 Go 命令遇到这种情况,它不会向我这样的用户提供那种上下文或建议。
对于使用 systemd 的系统,一个合理的选择可能是默认为 XDG_RUNTIME_DIR
(回退到 ( GO
) TMPDIR
),这还有一个额外的好处,就是与用户会话绑定(而不是系统范围内的事情),并且定期清理。检查该环境变量是否定义应该就足够了,因为它是由 pam-systemd (或用户明确设置的)设置的。
无论潜在的默认行为更改如何,我认为如果 go 命令能够输出建议以配置 GOTPMDIR
,在启动测试二进制文件时遇到权限被拒绝的情况时,这对用户会很有帮助。
4条答案
按热度按时间gzjq41n41#
CC @bcmills?听起来至少我们可以改进输出。
pdtvr36n2#
可能
go test
和go run
都可以检查EPERM
或类似的情况,并通过错误消息给出提示。ljsrvy3e3#
https://go.dev/cl/406848提到了这个问题:
cmd/go: improve handling of tmpdir being noexec
mrphzbgm4#
在CL 406848合并后,输出将是: