起因:
在linux下编译k8s,由于编译的中间文件太多而系统的/tmp分区设置太小,导致编译失败,但自己不想或不能更改/tmp分区大小,所以只能通过其他方式解决。
现象:
tmp分区大小:
解决方法:
1、为进程设置一个临时的环境变量TMPDIR指定/tmp的真实路径:
TMPDIR=/new_tmp/to/mypath ./myproc
2、或者设置导出的环境变量TMPDIR,使用之后再删除。
export TMPDIR=/new_tmp/to/mypath
使用过后删除:
unset TMPDIR
举例:
原理分析:
1、golang编译链接工具链临时工作目录分析(以 go1.23.3 linux/amd64 为例):
测试用例:eg.go
package mainimport ("fmt"
)func main() {fmt.Println("eg")
}
不带TMPDIR环境变量的编译链接测试:
带TMPDIR环境变量的编译链接测试:
原理是golang编译链接工具链创建work目录的时候最终调用的golang的tempDir函数:
func tempDir() string {dir := Getenv("TMPDIR")if dir == "" {if runtime.GOOS == "android" {dir = "/data/local/tmp"} else {dir = "/tmp"}}return dir
}
2、shell使用临时目录的原理分析:
shell如果想让TMPDIR环境变量生效,需要使用系统命令mktemp,如果直接操作的/tmp目录是不会生效的。
直接操作/tmp目录举例:
使用系统命令mktemp举例:
借助trap信号处理命令完整的使用mktemp的例子:
shell文件tmpfile.sh:
#!/bin/bashtrap 'rm -f "$TMPFILE"' EXIT
TMPFILE=$(mktemp) || exit 1
date > $TMPFILE
sleep 10
ls -lh $TMPFILE
cat $TMPFILE
date
这样进程退出时可以自动删除$TMPFILE,注意别误删。
--end--