golang.org/x/build@v0.0.0-20240506185731-218518f32b70/cmd/buildlet/buildlet_unix.go (about) 1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build linux 6 7 // (We only care about Linux on GKE for now) 8 9 package main 10 11 import ( 12 "log" 13 "os" 14 "os/exec" 15 "os/signal" 16 "syscall" 17 ) 18 19 func init() { 20 registerSignal = registerSignalUnix 21 setWorkdirToTmpfs = setWorkdirToTmpfsLinux 22 } 23 24 func registerSignalUnix(c chan<- os.Signal) { 25 signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) 26 } 27 28 func setWorkdirToTmpfsLinux() { 29 const dir = "/workdir" 30 31 var st syscall.Statfs_t 32 const TMPFS_MAGIC = 0x01021994 // from statfs(2) 33 if syscall.Statfs(dir, &st) != nil || st.Type != TMPFS_MAGIC { 34 return 35 } 36 log.Printf("detected tmpfs %s", dir) 37 38 const ST_NOEXEC = syscall.MS_NOEXEC // golang.org/issue/25341 39 if st.Flags&ST_NOEXEC != 0 { 40 log.Printf("tmpfs %s is noexec; remounting", dir) 41 out, err := exec.Command("mount", "-o", "remount,exec", dir).CombinedOutput() 42 if err != nil { 43 log.Printf("error remounting tmpfs %s as exec: %v, %s", dir, err, out) 44 return 45 } 46 // Check that it worked: 47 st = syscall.Statfs_t{} 48 if err := syscall.Statfs(dir, &st); err != nil { 49 log.Printf("second stat of %s failed after remount: %v", dir, err) 50 return 51 } 52 if st.Flags&ST_NOEXEC != 0 { 53 log.Printf("remount of %s failed; still marked noexec", dir) 54 return 55 } 56 log.Printf("remounted tmpfs %s to remove noexec", dir) 57 } 58 *workDir = dir 59 log.Printf("using tmpfs %s as workdir.", dir) 60 }