分享
  1. 首页
  2. 文章

Golang实现UTS隔离

wu_sphinx · · 1443 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

隔离机制是实现Docker容器的重要技术,其中UTS Namespace隔离的是主机与域名,
Linux内核中的调用参数为CLONE_NEWUTS。我们都知道Docker是用Golang实现了
那么自然我们可以用Golang来实现UTS Namespace隔离
主机环境如下

➜ ~ 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)
 }
}

编译运行产生进入到fork出来新的进程里面的shell交互环境
查看当前进程的PID及系统中进程之间的关系

# 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进程的shell环境查看
(/proc/$PID/ns/下每个文件对应一个namespace, 它是一个符号链接, 会指向一个仅kernel可见的被称为nsfs(namespace filesystem)的文件系统中的一个inode)

# readlink /proc/1805/ns/uts
uts:[4026532192]
# readlink /proc/1802/ns/uts
uts:[4026531838]

在主机上查看

➜ ~ sudo readlink /proc/1802/ns/uts
uts:[4026531838]
➜ ~ sudo readlink /proc/1805/ns/uts
uts:[4026532192]

在fork进程shell环境中查看并修改hostname

# hostname
ubuntu
# hostname -b bird
# hostname
bird

在主机上

➜ ~ hostname
ubuntu

可以看到,fork进程的hostname产生了变更,主机不受影响,同样,主机hostname也不会对fork进程产生影响,由此fork进程的hostname
与主机父进程的hostname成功实现了隔离。

参考


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:wu_sphinx

查看原文:Golang实现UTS隔离

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1443 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏