UTS Namespace
- UTS Namespace主要用来隔离nodename和domainname两个系统标识。在UTS Namespace里面,每个Namespace允许有自己的hostname。
package main
import(
"os/exec"
"syscall"
"os"
"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)
}
}
- cmd:=exec.Command("sh")用来指定被fork出来的新进程内的初始命令,默认使用sh来执行,使用CLONE_NEWUTS这个标识符去创建一个UTS Namespace,Go封装了对clone函数的调用,这段代码执行后就会进入到一个sh运行环境中。
- 使用如下命令输出pid,验证父进程和子进程是否不在同一个UTS Namespace中
echo $$
- 如上图所示确实不在同一个UTS Namespace中,由于UTS Namespace对hostname做了隔离,所以在这个环境内修改hostname应该不影响外部主机。