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  }