UTS 简介
UTS是Linux命名空间的一种,可以用作主机名的隔离
代码实现
- command()函数返回*Cmd结构体,参数sh表示被 fork 出来的新进程内的初始命令为sh
type Cmd struct {
Path string
Args []string
Env []string
Dir string
Stdin io.Reader
Stdout io.Writer
Stderr io.Writer
ExtraFiles []*os.File
SysProcAttr *syscall.SysProcAttr
Process *os.Process
ProcessState *os.ProcessState
}
- cmd的SysProcAttr字段保存可选的、操作系统特定的属性
- syscall.CLONE_NEWUTS表示创建一个UTS namespace
- Run 启动指定的命令并等待它完成
package main
import "os"
import "os/exec"
import "syscall"
import "log"
func main(){
cmd := exec.Command("sh")
cmd.SysProcAttr = &syscall.SysProcAttr{
Cloneflags:syscall.CLONE_NEWUTS,
}
cmd.Stdin=os.Stdin
cmd.Stdout=os.Stdout
cmd.Stderr=os.Stderr
if err:=cmd.Run(); err!=nil{
log.Fatal(err)
}
}
运行
运行uts.go更改主机名为nmsl
$ sudo go run uts.go
# hostname -b nmsl
# hostname
nmsl
#
另开一个shell,发现没有输出nmsl,因此uts是隔离的
$ hostname
Nietzsche