隔離機(jī)制是實(shí)現(xiàn)Docker容器的重要技術(shù)襟锐,其中UTS Namespace隔離的是主機(jī)與域名迹蛤,
在Linux
內(nèi)核中的調(diào)用參數(shù)為CLONE_NEWUTS
迈喉。我們都知道Docker
是用Golang
實(shí)現(xiàn)了
那么自然我們可以用Golang
來實(shí)現(xiàn)UTS Namespace
隔離
主機(jī)環(huán)境如下
? ~ uname -a
Linux ubuntu 4.4.0-131-generic #157-Ubuntu SMP Thu Jul 12 15:51:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
? ~ go version
go version go1.6.2 linux/amd64
Golang
源碼
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)
}
}
編譯運(yùn)行產(chǎn)生進(jìn)入到fork出來新的進(jìn)程里面的shell交互環(huán)境
查看當(dāng)前進(jìn)程的PID
及系統(tǒng)中進(jìn)程之間的關(guān)系
# echo $$
1805
# pstree -pl
systemd(1)-+-accounts-daemon(868)-+-{gdbus}(889)
| `-{gmain}(881)
|-acpid(865)
|-atd(836)
|-cron(842)
|-dbus-daemon(848)
|-dhclient(962)
|-iscsid(1061)
|-iscsid(1062)
|-login(1138)---zsh(1228)
|-lvmetad(422)
|-lxcfs(845)-+-{lxcfs}(856)
| `-{lxcfs}(857)
|-mdadm(897)
|-nginx(1082)---nginx(1084)
|-polkitd(907)-+-{gdbus}(912)
| `-{gmain}(910)
|-rsyslogd(831)-+-{in:imklog}(861)
| |-{in:imuxsock}(860)
| `-{rs:main Q:Reg}(862)
|-snapd(873)-+-{snapd}(913)
| |-{snapd}(914)
| |-{snapd}(915)
| |-{snapd}(921)
| |-{snapd}(930)
| `-{snapd}(931)
|-sshd(1077)---sshd(1260)---sshd(1291)---zsh(1292)---sudo(1790)---go(1791)-+-ns(1802)-+-sh(1805)---pstree(1806)
| | |-{ns}(1803)
| | `-{ns}(1804)
| |-{go}(1792)
| |-{go}(1793)
| |-{go}(1794)
| `-{go}(1798)
|-systemd(1219)---(sd-pam)(1225)
|-systemd-journal(361)
|-systemd-logind(826)
|-systemd-timesyn(679)---{sd-resolve) S 1 (689)
`-systemd-udevd(436)
fork進(jìn)程的shell環(huán)境查看
(/proc/$PID/ns/下每個(gè)文件對(duì)應(yīng)一個(gè)namespace, 它是一個(gè)符號(hào)鏈接, 會(huì)指向一個(gè)僅kernel可見的被稱為nsfs(namespace filesystem)的文件系統(tǒng)中的一個(gè)inode)
# readlink /proc/1805/ns/uts
uts:[4026532192]
# readlink /proc/1802/ns/uts
uts:[4026531838]
在主機(jī)上查看
? ~ sudo readlink /proc/1802/ns/uts
uts:[4026531838]
? ~ sudo readlink /proc/1805/ns/uts
uts:[4026532192]
在fork進(jìn)程shell環(huán)境中查看并修改hostname
# hostname
ubuntu
# hostname -b bird
# hostname
bird
在主機(jī)上
? ~ hostname
ubuntu
可以看到觅捆,fork進(jìn)程的hostname產(chǎn)生了變更叮雳,主機(jī)不受影響想暗,同樣,主機(jī)hostname也不會(huì)對(duì)fork進(jìn)程產(chǎn)生影響帘不,由此fork進(jìn)程的hostname
與主機(jī)父進(jìn)程的hostname成功實(shí)現(xiàn)了隔離说莫。
參考