概述
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)
}
}
测试结果:
go run uts.go
sh-4.2#pltree -pl
|-sshd(2213)-+-sshd(3437)---bash(3440)
| |-sshd(8375)
| `-sshd(9424)---bash(9427)---go(10621)-+-uts(10640)-+-sh(10644)---pstree(10651)
| | |-{uts}(10641)
| | `-{uts}(10642)
| |-{go}(10622)
| |-{go}(10623)
| |-{go}(10624)
| |-{go}(10625)
| |-{go}(10632)
| `-{go}(10643)
//输出一下当前的 PID
sh-4.2# echo $$
10644
//父进程和子进程是否在同一个UTS namespace
sh-4.2# readlink /proc/10644/ns/uts
uts:[4026532154]
sh-4.2# readlink /proc/10640/ns/uts
uts:[4026531838]
//修改hostname,是否会影响宿主机的hostname
sh-4.2# hostname -b bird
sh-4.2# hostname
bird
//退出来查看宿主机的hostname
sh-4.2# exit
exit
[root@VM_0_10_centos ux-dev]# hostname
VM_0_10_centos