深入理解Linux内核NameSpace与Docker虚拟化

5星 · 超过95%的资源 需积分: 3 52 下载量 90 浏览量 更新于2024-09-09 1 收藏 912KB PDF 举报
"这篇文章主要介绍了Linux内核中的名称空间(NameSpace)概念,它是Docker等容器技术的基础。文章由文平波在2015年泰晓沙龙第二期活动中分享,涵盖了NameSpace的基本概念、概述、实现细节以及示例。" 在Linux系统中,名称空间(NameSpace)是一种轻量级的进程虚拟化技术,它使得每个进程可以拥有自己独立的视图,如文件系统挂载点、进程ID、网络接口、用户ID和安全设置等。这种技术为容器提供了隔离的环境,就像大脑在虚拟体中一样(Hilary Putnam的哲学观点“大脑在vat”)。 NameSpace的实现始于Linux内核的2.4.19版本,随着时间的推移,逐渐增加了更多的名称空间类型: 1. **挂载名称空间(Mount Namespace)** - 从2.4.19开始,允许每个进程有自己的挂载点视图。通过`CLONE_NEWNS`标志,可以创建新的挂载名称空间。例如,`unshare -m bash -i`可以在一个新的挂载名称空间中启动bash,然后在此环境中挂载文件系统,而在其他shell中查看`/proc/mounts`时,这些挂载点是不可见的。 2. **IPC(Inter-Process Communication)名称空间** - 自2.6.19起,进程间的通信如信号量、消息队列和共享内存也被隔离。`CLONE_NEWIPC`标志用于创建新的IPC名称空间。 3. **UTS(Unix Time-sharing System)名称空间** - 自2.6.19起,包括系统名、节点名、版本等标识符的隔离。`CLONE_NEWUTS`标志用于创建新的UTS名称空间。 4. **PID(Process ID)名称空间** - 自2.6.24开始,每个名称空间可以有独立的进程ID号。`CLONE_NEWPID`标志用于创建新的PID名称空间。 5. **网络名称空间** - 自2.6.29起,网络设备、套接字、路由表等网络资源被隔离。`CLONE_NEWNET`标志用于创建新的网络名称空间。 6. **用户名称空间** - 自3.8版本开始,用户和组ID可以独立,增强了安全性和权限控制。`CLONE_NEWUSER`标志用于创建新的用户名称空间。 7. **更进一步** - 除了上述名称空间外,还有如安全、安全密钥、设备和时间等其他资源的名称空间隔离。 在用户空间,可以通过以下系统调用来操作名称空间: - `clone()` - 创建具有限制的新线程,并可以选择进入新的名称空间。 - `unshare()` - 让当前进程进入新的名称空间,比如`unshare(CLONE_NEWNET);`将进程放入新的网络名称空间。 - `setns()` - 加入已存在的名称空间,例如通过打开目标进程的`/proc/$PID/ns/$TYPE`文件并调用`setns()`,可以将当前进程置于另一个进程的指定名称空间中。 通过这些API,开发者可以构建出高度隔离的容器环境,如Docker,从而实现资源的有效管理和隔离,为云计算和分布式系统提供强有力的支持。