赞
踩
linux Namespace用于隔离一系列的系统资源,例如pid,userid,netword等,借助于Linux Namespace,可以实现容器的基本隔离。
Namespace类型 | 系统调用参数 | 作用 |
---|---|---|
Mount Namespace | CLONE_NEWNS | 隔离挂载点视图,简单来说隔离了mount命令 |
UTS Namespace | CLONE_NEWUTS | 隔离hostname |
IPC Namespace | CLONE_NEWIPC | 隔离ipc与message queue |
PID Namespace | CLONE_NEWPID | 隔离进程PID |
Network Namespace | CLONE_NEWNET | 隔离network |
User Namespace | CLONE_NEWUSER | 隔离userid和groupid |
下面我们用Go程序创建一个隔离的进程
package main import ( "os" "os/exec" "syscall" ) func main() { cmd := exec.Command("bash") cmd.SysProcAttr = &syscall.SysProcAttr{ Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS | syscall.CLONE_NEWUSER | syscall.CLONE_NEWNET, } cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr if err := cmd.Run(); err != nil { panic(err) } }
我们可以通过一些命令来查看我们确实处于在了新的Namespace中,当然,因为我们使用了CLONE_NEWUSER
参数,这让我们在Namespace中失去了用户身份,我们不能以root用户进行操作,如果要以root身份验证其他Namespace,需要删除CLONE_NEWUSER
,然后以root身份运行程序。
这里我们可以简单验证PID Namespace,可以看到PID为1,隔离了PID
echo $$ 1
验证User Namespace
id uid=65534(nobody) gid=65534(nogroup) 组=65534(nogroup)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。