Knoppix|镜像格式二十年:系统镜像的螺旋进化

_原题为 镜像格式二十年:系统镜像的螺旋进化

众所周知 , Docker 始于2013年的 dotCloud , 迄今刚刚七年 , 如果你刚好在圈中经历了2013-2015年这段早期岁月的话 , 自然应该知道 , 最初的 Docker = LXC + aufs , 前者就是所谓的 Linux 容器了 , 而后者则是我今天要聊的镜像 。
千禧年:惊艳的 Live CD
说到 Linux distro , 除了做差异化的界面主题之外 , 核心差异一般都在于:
  • 如何更方便地安装;
  • 如何更方便地升级;
而在 distro 界却有一股清流 , 超脱于这两件事情之外 , 它们就是 Live CD , 它们装在一张光盘里 , 或者是一个 U盘上 , 不需要安装、也不会改变 。 之前创业的时候 , 我司的运维大佬——彤哥曾经说过:
第一次见到 liveCD 时我内心是震惊的……
这我当然是赞同的 , 那时我也是震惊的同学之一 , 要知道 Knoppix 在 2000 千禧年就来到了世界 , 而它所基于的著名的 Debian , 直到2005年6月 , Sarge (3.1) 发布的时候才正式在 stable release 里带上了图形界面的安装程序 debian-installer (简称 d-i) , 此前版本的安装还在用文本菜单 。 就在这个年代 , 这样一个开光盘即用、启动起来就是图形界面的系统 , 给我们这些玩家带来的震撼 , 当然是可想而知的 。 那时候的 Live CD 就是十三年后的 Docker , 绝对配得上“惊艳”两个字 。
Knoppix|镜像格式二十年:系统镜像的螺旋进化
文章图片

要知道 , 一张 700MB 左右的光盘里塞下个完整的操作系统并不容易(当然有人开头之后也不太难 , 后来我爱的 DSL 可以做到 50MB) 。 Knoppix 有个很棒的想法——把装好的操作系统给压缩一下 , 放在光盘里 ,随用随解压 , 这样 , 一张 700MB 光盘里可以放下大约 2GB 的根文件系统 , 这样就跑 KDE 桌面也就没啥问题了 , 当时 , distrowatch.com 上可以看到 , 一大片 distro 都是基于 Knoppix 魔改的 , 足见其影响力 。
进化:可读写层与 UnionFS Knoppix 在诞生之初的一个执念是“绝不碰本地存储一根指头” , 而光盘 , CD-ROM , 所使用的 ISO9600 文件系统也是只读的 , 这无疑暗合了当今流行的“不可变基础设施”的潮流 , 但是 , 即使在今天 , 没有可写文件系统对于很多 Linux 软件仍然是非常困难的 , 毕竟随随便便一个程序也要写一点配置文件、状态信息、锁、日志之类的嘛 。 而诞生之初的 Knoppix 是不可写的 , 那么 , 要有什么东西要罗盘 , 就得手工挖掘出本地硬盘来挂上 , 或者是挂个 NAS 到 /home 或其他挂载点上来 , 当你不想只是做个紧急启动盘的时候 , 这就有点麻烦了 。
如果我们从今天穿越回去 , 毫不费力就可以指出 , 用 overlayfs 加上一个 tmpfs 做可写层嘛 。 但是 , overlayfs 要到2010年才首次提交 patchset , 2014年才被合并到 3.18内核(这中间 , 当时的淘宝内核组也有不少贡献和踩坑呢) 。 当然 , 比 overlay 早的类似的 unionfs 还是有的 , Docker 最早采用的 Aufs 就是其中之一 , 它是2006年出现的 , 这里 AUFS 的 A , 可以理解成 Advanced , 但它最早的意思实际是 Another——是的 , “另一个 UFS” , 而它的前身就是 UnionFS 。
在2005年5月 , 也就是十五年前 , Knoppix 创造性地引入了 UnionFS , 而在一年半以后的 5.1 版本中 , Knoppix 引入了当年诞生的更稳定的 aufs , 此后 , 包括大家熟悉的 Ubuntu LiveCD、Gentoo LiveCD 全都使用了 aufs 。 可以说 , 正是 Live CD 们 , 提前了8年 , 为 Docker 和 Docker Image 的诞生 , 做好了存储上的准备 。
这里简单说一句给不了解的人听 , 所谓 union fs , 是指多个不同文件系统联合(堆叠)在一起 , 呈现为一个文件系统 , 它和一般的 FHS 规定的那种树装组织方式是不同的 , 如下图 , 对于左边的标准的目录树结构 , 任何一个文件系统 , 挂载在树上的一个挂载点 , 根据路径 , 就可以指到一个确定的文件系统 , 比如 , 下图中 , 所有的 /usr/local/ 下面的路径都在一个文件系统上 , 而其他 /usr 就会在另一个文件系统上;而 UnionFS 是多层堆叠的 , 你写的文件会停留在最上层 , 比如图中 , 你修改过的 /etc/passwd 就会在最上的可写层 , 其他的文件就要去下面的层中去找 , 也就是说 , 它允许同一个目录中的不同文件在不同层中 , 这样 , Live CD 操作系统跑起来就像真正的本地操作系统一样可以读写所有路径了 。
Knoppix|镜像格式二十年:系统镜像的螺旋进化
文章图片

块或文件:Cloop 与 SquashFS 让我们把目光放在只读层上 , 这一层是 Live CD 的基础 , 在 Live CD 还没有 union FS 来做分层的时候就已经存在这个只读 rootfs 了 。 对 Knoppix 来说 , 这一层是不能直接放完整、无压缩的操作系统的 , 因为在21世纪初 , 大家都还在用 24x 到 40x 速光驱的时代 , Knoppix Live CD 面临的一个大问题是 700MB 的光盘和庞大的桌面操作系统之间的矛盾 。


推荐阅读