起因:
在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--