去二手市场上淘一台退役的 IBM 大型机,你大概率会收到一堆被剪断的电缆,还得为它在地下室拉一条专用供电线。但现在,只要敲入一行 docker run -it --name vm370 -p 3270:3270 rbanffy/vm370ce 命令,任何人都能在笔记本电脑上拉起一台上世纪 70 年代的 IBM 大型机。科技作者 rbanffy 在 2026 年 4 月 6 日发布的这篇动手指南,表面看是极客复古玩具,往深处扒却扯出了一个反常识的架构现实:开源模拟器加容器,正在做成连价值数百万美元的现代 IBM 大型机都无法原生做到的事。
一行命令拉起的虚拟化鼻祖
这套名为 VM/370 Community Edition(社区版)的系统,底座是 IBM 最后一个无许可证限制、进入公有领域的版本 VM/370 R6。rbanffy 把它打包成了开箱即用的容器镜像(源码托管于 GitHub 仓库 rbanffy/vm370,提供 SixPack 和 Community Edition 两个版本),底层靠开源的 Hercules 大型机模拟器驱动,用 Podman 也能跑通。
启动容器后,你需要用 x3270 终端模拟器连接本地的 3270 端口(项目 README 文档里曾误写为 3278 端口,实际映射以 3270 为准)。输入默认账号密码 CMSUSER 登录的瞬间,半个世纪前的虚拟化鼻祖就开始运转了:
- 双层解耦架构.底层控制程序(CP)负责硬件虚拟化,为你单独切出一台虚拟机,并在里面启动单用户交互环境会话监控系统(CMS)。今天云厂商赖以生存的 Hypervisor 逻辑,早在 60 年代末就已经成型。
- 整屏块传输终端.3270 终端不滚屏,填满后得按 PA2 键(x3270 里是 Alt-2,c3270 是 Control-C)翻页。它把屏幕当成一张表单,用户在本地改完一整屏数据再一次性发回主机,大幅减少了主机的 I/O 中断。这套机制放在今天看,就是 90 年代万维网 HTML 表单请求响应模式的先祖。
- 反直觉的文件属性.在系统里敲
EDIT PROFILE EXEC修改启动脚本,或者敲EDIT HELLO BASIC写代码时,后面的EXEC和BASIC并非文件后缀,而是独立的文件类型属性。用FORTRAN HELLO编译一段 4 行源码,在模拟环境下会消耗 0.84 秒 CPU 时间(总耗时 2.59 秒),生成供 132 列宽行式打印机使用的LISTING文件和名為TEXT的目标代码。直接用LOAD HELLO ( START运行(耗时 1.23 秒 CPU 时间,总计 3.90 秒),输出会写进FT06F001文件;如果用FILEDEF 6 TERMINAL强行把输出重定向到终端,HELLO WORLD的首字母 H 会莫名消失——因为系统把第一列当成了老式打印机的走纸控制符。
16M 内存里的“现代发行版”
如果把当年 IBM 发布的原始 VM/370 R6 比作 Linus 在卧室里写出的 Linux 1.0,那么经过开源社区多年打补丁的 VM/370 CE,就已经被爆改成了功能齐全的现代 Fedora。
受限于当年 24 位寻址架构,这台机器的硬件天花板被锁死在单 CPU 和 16M 内存(IBM 官方术语叫 storage)。但 VM/370 CE 团队在迭代出 V1R1.0、V1R1.1 直至 V1R1.2 版本的过程中,硬是在螺蛳壳里做出了道场。
根据 V1R1.2 的发布说明,社区不仅专门配置了用于加载 GCC C 运行时的“16M 虚拟机”,还塞进了一大批在 70 年代堪称科幻的特性:支持 3270 终端全屏 HELP、跨 VM 系统通信的 XNET 网络连接、SENDFILE/RECEIVE/MAIL 邮件与文件传输命令、ASSIST 汇编器、KICKS 事务处理系统以及 Pascal 2021.03。整个镜像的编程环境一举囊括了 BREXX/REXX、GCC C、汇编语言、FORTRAN 和 PL/I,遇到不懂的直接敲 HELP CMSCMDS、HELP REXX 或 HELP GCC 就能调出内置文档。
打破 IBM“无限向后兼容”的神话
整件事里最值得玩味的,是原文作者留下的一个技术盲区。rbanffy 在文末调侃说,如果你供职的公司恰好有真正的现代 IBM 大型机,不妨找运维团队申请切一个小虚拟机来嵌套运行 VM/370 CE,并断言凭借 IBM 传奇的向后兼容性,“在技术上应该没有任何问题”,唯一的阻碍只是审批流程。
我不太买账的是这个“技术上毫无问题”的判断。向后兼容确实是 IBM 大型机的金字招牌,但招牌不等于没有物理边界。
硬件演进切掉的旧时代脐带,最后是开源社区用软件接上的。
翻开当前现代 IBM 大型机 z/VM 系统的官方架构文档就会发现,现代 z/VM 早已移除了对原生 370 模式虚拟机的支持,目前仅支持 ESA、XA、XC 和 Z 模式。原因并不复杂:经过半个世纪的演进,底层硬件的程序状态字(PSW)格式和 I/O 指令集已经发生了结构性改变,硬件虚拟化指令(SIE)不再直接模拟当年的 System/370 裸机环境。
现代 z/VM 虽然保留了 24 位寻址能力,并提供了一个名为 370 Accommodation Facility 的兼容层,但这只属于应用层面的妥协——它能让部分 System/370 时代的 CMS 老应用程序在现代 ESA/XA 环境里跑起来,却无法让你把一套完整的 VM/370 操作系统当成客户机原生启动。
古人讲“礼失求诸野”。当商业巨头被几十年间的算力膨胀推着往前走,不得不为了 64 位寻址和现代 I/O 架构切掉最古老的硬件包袱时,反倒是民间的 Hercules 模拟器和开源社区,在 x86 笔记本的 Docker 容器里,替 50 年前的操作系统保留了最原汁原味的硬件容身之所。对于今天研究系统底层的学生和云原生开发者来说,这台 16M 内存的容器不仅比真机更好拿,而且比现代真机更接近历史现场。
不过,真要把这台古董拉起来当玩具,还有两个现实的坑得避开:
- 风险.这套系统诞生于网络极其单纯的年代,默认账号密码完全一致(甚至允许在登录命令里明文连敲
LOGON CMSUSER CMSUSER),千万不要把 3270 端口直接暴露在公网上;另外容器默认无状态,如果不配置本地持久化挂载,你辛苦敲进去的 BASIC 和 FORTRAN 代码在移除容器后会瞬间清零。
回看那条短短的 docker run 命令,里面其实套着三层跨越半个世纪的虚拟化俄罗斯套娃:21 世纪的容器,装着开源社区写的硬件模拟器,模拟器里跑着 1970 年代的 Hypervisor 鼻祖。技术形态换了一茬又一茬,但人类切分算力、隔离环境的底层算计,五十年前就已经写进了那 16M 内存里。
