namespaces overview
https://lwn.net/Articles/531114/#series_index
Linux实现了多种namespaces,namespace目标是让进程以为自己独占全局资源
namespace支持了container的实现。container让进程以为自己是系统上仅有
的进程。
相关api
clone(), unshare(), and setns()
Mount namesapces
CLONE_NEWNS:子进程在一个新挂载的namespace,从父进程继承namesapces。
在不同的挂载namespace有不同的文件系统层次。mount()和unmount()仅仅影
响与本进程的namespace。
相较于chroot(),挂载namespace是更安全和稳定。namespace可以设置主从
关系,从而实现mount事件的传播。比如安装在一个namespace中的光盘设备,会
自动出现在其他namespace中
UTS namespace
相关API:uname()
CLONE_NEWUTS:分隔两种系统标识符,nodename和domainname。通过sethostname()
和setdomainname()系统调用来设置名称。在容器的上下文中,UTS的命名空间功
能允许每个容器拥有自己的主机名和NIS域名。这可以用俩初始化和设置脚本根据名称制定他
们的操作。
UTS来自传递给uname()和系统调用的结构名称:struct utsname
。该结构的名称来自
“unix时间共享系统”
IPC namespace
CLONE_NEWIPC:用来隔绝某些进程间通信资源。系统V IPC对象和POSIX消息队列。这些
IPC机制的共同特点是IPC对象有文件系统路径名以外机制来标识。每个IPC名称有他们自己的Sysem V IPC标识符和他们自己的POSIX消息队列文件系统
PID namespace
分隔进程id。不同namespace中的进程可以有相同的pid。PID namespaces可以嵌套。
类似于树结构
Network namespace
CLONE_NEWNET:每个网络名称空间都有自己的网络设备,IP地址和IP路由表,/proc/net directory,port numbers等。主机中的路由规则可以将流量包
发送一个特定容器的网络设备
user namespaces
进程的用户和组ID可以在用户名称空间内部和外部不同,这里最有趣的例子是,
一个进程可以在用户名空间之外拥有普通的非特权用户ID,同时在名称空间内
具有0的用户ID。
这意味着该进程对用户命名空间内的操作拥有完全的root权限,但对命名空间
外的操作没有特权。这项工作带来的变化是微妙而广泛的。用户命名空间可能会
出现一些未知的安全问题,这些安全问题在未来还有待发现和解决。
———译注 cve 2018 1000001