知识卡片
chroot到namespace到cgroups的三级隔离递进
内容
容器不是一次性设计出来的,而是三种内核能力依次叠加才凑齐的。第一步是 文件隔离:1979年UNIX的chroot能把某进程的根目录锁定在指定位置,这个 “Chroot监狱”后来被黑客用”越狱”突破(iOS沙箱越狱一词也源于此),2000年 Linux用pivot_root改良了它的安全漏洞,但UNIX”一切皆文件”的哲学在现实里 不成立——磁盘、网络、内存、处理器等低层资源,以及UTS、PID、UID、IPC 等高层资源,都存在大量非文件形式的操作入口,光隔离文件系统远远不够。 第二步是访问隔离:2002年引入的Linux名称空间(Namespace)让进程在自己 的空间里”觉得自己是这方天地的主人”——有独立的PID编号(自己的0号进程)、 独立的UID/GID(自己的root)、独立的网络栈——最初只为隔离文件系统而设计 (第一个只有Mount名称空间),后来才逐步扩展到今天的八种资源隔离。第三步 是资源隔离:光隔离访问还不够,如果一个进程内存溢出或占满处理器,其他 进程会被莫名牵连,2006年Google工程师发起的cgroups(控制群组)补上了 这一环,直接由内核限制某进程组能用的处理器时间、内存大小、磁盘I/O速度 等配额。三步叠加起来,才第一次让”一台物理机上的多个进程各自感觉独享 整台虚拟机”成为可能——这正是容器真正诞生前的全部前置条件。
结构图:
flowchart LR
A["1979 chroot: 文件隔离<br/>根目录锁定, 但只覆盖文件形式的资源"] --> B["2002 namespace: 访问隔离<br/>PID/UID/网络等8种资源独立视图"]
B --> C["2006 cgroups: 资源隔离<br/>处理器/内存/磁盘I/O配额限制"]
C --> D[三者叠加=容器诞生的全部前置条件]
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第11章"虚拟化容器"11.1.1-
11.1.3节(源文件:_epub-src对应OEBPS/Text/chapter129.xhtml、
chapter130.xhtml、chapter131.xhtml)
- 结论依据:原文依次说明chroot只能隔离文件形式暴露的资源、2002年
namespace引入访问隔离并逐步扩展到八种资源、2006年cgroups补上资源
配额限制,三者共同构成容器诞生的前置条件,直接支撑本卡片的递进结构。
- 原始内容:以chroot为代表的文件隔离,仅仅是容器崛起之路的起点而已……
现在距离完美的隔离性就只差最后一步了:资源的隔离……当文件系统、
访问、资源都可以被隔离后,容器已经有了降生所需的全部前置条件。