什么是Namespace?
一般来讲,Namespace是个通用概念,我初次认识这个概念是在学习C++的时候,面向对象语言用它来命名冲突问题。这里, Namespace是指Linux用来控制一个进程对系统的可见性。最早的应用是chroot, 这里有介绍浅析chroot。chroot就是通过改变进程的fs_struct
,来限制进程可见的文件系统视图,默认情况下每个进程可以看到整个文件系统,即根系统/
。最早Namespace应用于文件系统,以至于CLONE_NEWNS指的就是文件系统隔离,参见man namespaces
:
Mount namespaces (CLONE_NEWNS)
Mount namespaces isolate the set of filesystem mount points, meaning that processes in different mount namespaces can have different views
of the filesystem hierarchy.
后来,随着操作系统级别的虚拟化, 即容器技术,越来越多的子系统都支持了Namspace特性,参考man namespaces
:
Linux provides the following namespaces:
Namespace Constant Isolates
IPC CLONE_NEWIPC System V IPC, POSIX message queues
Network CLONE_NEWNET Network devices, stacks, ports, etc.
Mount CLONE_NEWNS Mount points
PID CLONE_NEWPID Process IDs
User CLONE_NEWUSER User and group IDs
UTS CLONE_NEWUTS Hostname and NIS domain name
如何应用Namespace?
在没有了解Namespace以前,我有这些错误的看法:1. Namespace应该就像C++语言里的命名空间一样简单吧; 2. 听人说,容器/Namespace的隔离效果或安全性并不好,比如top命令仍能看到系统中的其它进程...
我真的错了,在玩了一下Namespace之后,我为它的强大感到震惊! 这里强烈推荐一个Namespace系列博客,很容易上手写点demo代码,快速体验一下, Introduce to Linux Namespaces
Namesapce如何实现的?
我也不知道,但是分析这块代码应该分两步走:1. 分析clone()系统调用代码; 2. 分析某个子系统的Namespace, 如CLONE_NEWPID
进程pid的隔离。第一步,可以参考这系列博客fork,clone系统调用分析。 第二步,留待以后了解吧。