SSD Nodes Learn 🎉 VPS $5.50/月起
指南 Matt Connor作者: Matt Connor

VPS 的计算机史:从大型机到虚拟专用服务器

您租用的 VPS 直接继承自 1960 年代分时系统。本文追溯 CTSS、Multics、Unix、IBM VM/370、Xen 与 KVM,解释隔离、调度和按小时计费为何延续至今。

VPS 的来源

从大型机到云计算,计算机的发展史本质上是同一个理念不断降本的过程。这个理念就是分时:让许多人同时使用一台昂贵的计算机,并为每个人提供独立的视图。分时技术诞生于 1960 年前后,因为当时一台计算机的成本高于使用它的人力成本。如今您租用的 VPS,其各个组成部分都是为解决这个问题而构建的:用户之间的隔离、分配 CPU 时间的调度器、虚拟机监控程序,以及按使用小时计费的账单。这个问题从未消失。只是硬件变得便宜了,因此过去需要研究经费才能获得的一小部分计算资源,如今每月只需几美元。

1959 至 1961 年:为何发明分时系统

1950 年代的计算机以批处理方式运行。您需要将程序打孔到卡片上,把整叠卡片交给操作员,之后再回来领取打印输出。一个字符输入错误,就可能浪费一天时间。计算机始终保持忙碌,这正是批处理的目标,因为像 IBM 7090 这样的计算机售价高达数百万美元,而等待计算机的人员时间并不会出现在任何发票上。

1959 年 1 月,John McCarthy 在 MIT 的一份备忘录中提出了相反的观点。计算机应该等待用户。Christopher Strachey 在同年的一次 UNESCO 会议上描述了分时的一种形式,但他的设想是让一名程序员调试程序,同时运行其他作业,而不是让许多人同时输入。1961 年,McCarthy 在 MIT 百年校庆上进一步提出:计算能力可以像公共事业一样出售,像电力一样按用量计费。

当时的反对意见是,分时会浪费计算机资源。在用户之间切换需要占用处理器周期,而处理器周期十分昂贵。这个反对意见本身是正确的,但后来不再重要,因为 60 年间,一个处理器周期的价格不断下降,而人们一小时注意力的价格并没有下降。

CTSS 必须发明的机制

Fernando Corbató 的团队在 MIT 计算中心构建了兼容分时系统(CTSS),以解决这一争论。该系统于 1961 年 11 月首次在 IBM 709 上演示,为 4 名用户提供服务,并将每名用户的工作换出到各自的磁带驱动器上。“兼容”意味着该机器仍可在底层运行旧的批处理系统,因为没有人会购买一台只能执行新功能的计算机。

4 名用户并不多。要实现这一点,必须解决的问题却不少,而且这正是内核现在仍在处理的问题列表。CTSS 需要调度器,以免一个长时间运行的作业冻结其他所有终端。它需要内存保护,以便崩溃的程序只影响一名用户,而不会导致整个系统崩溃。它需要在用户注销后仍能保留数据的存储,因此 CTSS 拥有现代用户能够识别的早期文件系统之一。它还需要密码,以防一名用户读取另一名用户的文件。

换一种名称描述这些部分,你得到的就是一台 Linux 主机。调度器是 EEVDF,它在 Linux 6.6 中取代了 CFS。内存保护由 MMU(内存管理单元)提供,为每个进程分配独立的虚拟地址空间。用户注销后仍能保留数据的存储,就是你的主目录。密码文件仍称为 /etc/passwd

Multics 与计算机公用服务

MIT 的下一个系统旨在实现 McCarthy 所描述的公用服务。Project MAC 始于 1963 年,已于 1964 年 8 月签约采购 General Electric GE-645,并于 1965 年发表了第一批 Multics 论文。这个名称本身就说明了其理念:Multiplexed Information and Computing Service,即多路复用信息与计算服务。这里的 Service 指的是一种按小时付费的服务。

Multics 的开发耗时远超计划。GE-645 原型机于 1967 年 1 月抵达 MIT 和 Bell Labs。Bell Labs 于 1969 年 4 月退出该项目。Multics 于 1969 年 10 月 1 日向 MIT Information Processing Center 的客户开放,之后在某处持续运行了三十一年。最后一套仍在运行的 Multics 系统位于新斯科舍省 Halifax 的 Canadian Department of National Defence,于 2000 年 10 月 30 日关闭。

Multics 常被归为失败项目,因为它交付延迟且运行缓慢。但它创造的术语说明了另一面。它带来了目录嵌套的层次化文件系统、每个文件上的访问控制列表、分段虚拟内存(允许程序像访问内存一样访问文件),以及按代码可信程度分级的保护环。保护环至今仍存在于你面前的芯片中。Ring 0 表示内核,ring 3 表示用户代码,这套术语来自 Multics。后来,硬件虚拟化又在 ring 0 下方增加了供 hypervisor 使用的模式,人们通常将其非正式地称为 ring -1。

Unix:在买得起的机器上实现分时

离开 Multics 后,Ken Thompson 在 Bell Labs 没有了想要使用的系统。1969 年,他在一台淘汰的 PDP-7 上启动了一个小得多的系统。第一版《Unix Programmer's Manual》的日期是 1971 年 11 月;到那时,开发工作已经转移到 PDP-11。1973 年,Thompson 和 Dennis Ritchie 用 C 重写了内核,因此系统可以迁移到新硬件,而无需再次手工重写。

这就是为什么您现在输入命令时使用的是 Unix 的后继系统,而不是 Multics 的后继系统。Multics 需要为其专门构建的硬件。Unix 则可以运行在任何便宜且可用的硬件上,而事实证明,这正是决定性特性。

Ritchie 和 Thompson 撰写的《The UNIX Time-Sharing System》于 1974 年 7 月发表在 Communications of the ACM 上。论文描述的正是您的 VPS:进程、一个分层文件系统、作为普通字节流的文件、fork、带权限位的用户和组,以及一个普通程序形式的 shell,而不是内核的一部分。52 年后,这个接口仍在扩展,从未被替换。

1972 年大型机真的运行过虚拟机吗?

是的。这也是大多数人忽略的部分。MIT 构建 Multics 的同时,IBM Cambridge Scientific Center 从另一个方向实现了相同目标。他们没有让一个操作系统服务多个用户,而是由 Robert Creasy 和 Les Comeau 构建了一个控制程序,为每个用户提供一台完整的模拟计算机。CP-40 于 1967 年 1 月投入生产。每个用户都获得一台虚拟 System/360,并在其中运行一个小型单用户操作系统 CMS。

1968 年,CP-40 在 System/360-67 上演变为 CP-67。IBM 于 1972 年 8 月 2 日宣布推出 VM/370。这是一款面向商业客户销售的商业级 hypervisor,距今已有五十四年。控制程序对真实硬件进行复用,客户操作系统则未经修改地运行在虚拟机中,并认为自己独占整台计算机。

相关理论在两年后提出。1974 年 7 月的《Communications of the ACM》同一期刊登了 Unix 论文,也刊登了 Gerald Popek 和 Robert Goldberg 的《可虚拟化第三代体系结构的形式化要求》。该论文规定了处理器实现可虚拟化所必须满足的条件。核心规则很简短:客户机执行任何能够读取或修改计算机状态的指令时,如果不在内核模式下,该指令都必须触发陷阱。这样 hypervisor 就能接管控制,并使用该客户机自己的私有状态副本作出响应。这称为 trap and emulate。IBM 的硬件遵守了这一规则。

小型机如何打破了原有模式

DEC 于 1965 年 3 月 22 日推出 PDP-8,按 1965 年的美元计算,售价约为 $18,000。它是第一款售价低于 $20,000 的小型机,最终销量超过 50,000 台。随后,微处理器再次压低了价格。当一个部门可以购买自己的计算机,后来个人也可以购买时,共享一台中央计算机看起来已经是一个无需继续解决的问题。整个 1980 年代和 1990 年代,计算逐渐从中央计算机转移到桌面和由小型 x86 服务器组成的机架中。

浪费以另一种形式重新出现。每台服务器运行一个应用虽然易于理解和管理,但大部分硬件处于空闲状态,而电力和机架空间仍需全额支付。这又是 CTSS 面临的问题,只是规模发生了变化:昂贵的资源从处理器变成了机房空间和电力。解决方案仍然是原来的方案:共享计算机。

x86 为什么难以实现虚拟化?

因为 x86 违反了 Popek 和 Goldberg 提出的规则。2000 年 8 月,在第 9 届 USENIX Security Symposium 上,John Scott Robin 和 Cynthia Irvine 逐条分析了 Pentium 指令集,发现有 17 条指令会读取或修改特权状态,而用户态代码执行这些指令时不会触发异常。popf 是其中的典型示例。在用户态执行该指令时,处理器会静默忽略程序无权设置的位,而不是触发陷阱。因此,基于陷阱和模拟机制构建的虚拟机监控程序无法得知客户机尝试过该操作。

在硬件得到修复之前,出现了两种解决方案。VMware 于 1998 年由 Stanford 的 Disco 研究项目发展而来。它检查客户机内核代码,并在其中那些不便处理的指令执行前重写它们。这种技术称为二进制翻译。来自 University of Cambridge Computer Laboratory 的 Xen 则采用了另一种方式:修改客户机本身。2003 年 10 月在 SOSP 上发表的论文《Xen and the Art of Virtualization》介绍了半虚拟化:经过修改的客户机内核主动调用虚拟机监控程序,而不是执行虚拟机监控程序无法拦截的指令。

随后,硬件得到了修复,方式与 IBM 在 1960 年代采用的方式相同。Intel 于 14 November 2005 在两款 Pentium 4 型号中发布 VT-x,AMD 于 May 2006 发布 AMD-V。两者都增加了一种位于客户机内核之下的处理器模式,使客户机能够全速运行自己的内核,同时让虚拟机监控程序继续控制其请求处理的事件。这样,虚拟机监控程序就可以足够小,从而运行在普通操作系统内部。Avi Kivity 在 Qumranet 开发的 KVM 正是如此:它将 Linux 内核本身转换为虚拟机监控程序。KVM 合并到 Linux 2.6.20 中,该版本于 February 2007 发布;如今,大量 VPS 主机仍在运行 KVM。

VPS 名称的由来

两条技术路线在 2000 年代初汇合。第一条是在 x86 上运行完整虚拟机,让客户机启动自己的内核。第二条是操作系统级虚拟化:多个隔离环境共享一个 Linux 内核,每个环境都有自己的 root 用户和进程表。Linux-VServer 和 SWsoft 的 Virtuozzo 都在 2001 年出现,SWsoft 又在 2005 年将 Virtuozzo 的一部分发布为开源项目 OpenVZ。“虚拟专用服务器”这一说法就来自这条技术路线,其命名类比于虚拟专用网络。

Amazon 将租用计算资源变成了 API 调用。S3 于 14 March 2006 发布,EC2 于 25 August 2006 以有限公测形式开放,当时只有一种实例类型,运行在 Xen 上。购买计算资源不再是与服务机构签订合同,而变成了一个可在一分钟内返回结果的请求。

这两条路线都延续至今,这种差异仍然决定了您可以对所租用服务器执行哪些操作。基于 KVM 的 VPS 会启动自己的内核,因此您可以加载内核模块,甚至可以在 您的 VPS 中运行虚拟机管理程序。基于容器的方案共享宿主机内核,无法执行这些操作。一个价格页面上的这行说明背后承载了 60 年的历史,因此在选择之前,了解 VPS、VM 和 VPC 的区别很有必要。

从大型机到 VPS,哪些改变了,哪些没有

有四件事发生了变化。机器不在您的建筑物内。终端从一件家具变成了一个程序。您租用的单元是一台拥有自身内核的完整计算机,而不是别人操作系统上的一个账户。价格也降到了足够低的程度,因此购买只需刷卡支付,不再需要采购流程。

运行机制完全没有改变。

  • 您的 ssh 会话就是一个分时终端。您获得登录权限和 shell,调度器决定下一个运行您进程的时机。
  • 隔离仍由硬件强制执行。MMU 和处理器的特权级别负责完成这项工作,原理与 1967 年 CP-40 所需的完全相同。
  • 您仍按经过的时间,为使用机器的一部分资源付费,就像服务局曾按连接时长计费一样。
  • 您仍会受到其他租户的影响。当主机超额分配资源时,您的虚拟机会等待物理 CPU,Linux 会将这段等待报告为 来自繁忙邻居的 CPU steal time

最后一点是对整个历史的准确总结。共享一台机器需要权衡。1961 年人力成本低于计算机成本,因此人们接受了这种方式;2026 年人们仍然接受,是因为让服务器以百分之十的容量运行就等于白白浪费资金。如果您更愿意站在运营方一侧进行这种权衡,那么 在您拥有的硬件上运行 Proxmox 会同时把 hypervisor 和运营方的问题交给您。

请记住这个比例。CTSS 在一台价值数百万 1961 年美元、占满整个房间的机器上为四名用户提供服务。您的 VPS 在 2026 年每月只需几美元,却比 Corbató 团队当年需要分配使用的机器强大得多,而且完全由您使用。您之所以能够租用它,源于一个存在了六十五年的理念,而这个理念最终遇上了廉价硬件。如果您正在考虑在 VPS 上部署什么,请先了解 VPS 实际提供什么,然后再了解 人们会在 VPS 上运行什么

FAQ

第一个分时计算机系统是什么?

CTSS,即兼容分时系统,由 MIT 计算中心 Fernando Corbató 的团队构建。它于 1961 年 11 月首次在 IBM 709 上演示,可服务 4 名用户,每名用户分别换入一台磁带驱动器。第一个面向整个社区的分时服务是 Dartmouth 分时系统:1964 年 5 月 1 日,John Kemeny 和一名学生程序员让两个终端同时运行 BASIC 程序,并且都收到了正确结果。

虚拟机确实是在 1960 年代发明的吗?

是。IBM Cambridge Scientific Center 于 1967 年 1 月将 CP-40 投入生产,为每名用户提供一个完整的虚拟 System/360,并在其中运行 CMS 操作系统。CP-67 于 1968 年在 System/360-67 上推出,IBM 又于 1972 年 8 月 2 日宣布 VM/370。这些都是真正的 hypervisor,可运行未经修改的 guest operating system,并且在商业上销售,比 x86 硬件能够实现同类功能早了几十年。

当大型机能够实现虚拟化时,x86 为什么很难实现虚拟化?

Popek 和 Goldberg 在 1974 年提出的规则是:任何能够读取或更改机器状态的指令,在 guest 于内核模式之外运行时都必须触发陷阱。x86 违反了这一规则。Robin 和 Irvine 统计出 Pentium 上有 17 条指令在用户模式下会静默失败,而不是触发陷阱,因此经典的陷阱与模拟 hypervisor 无法捕获这些指令,popf 是通常的示例。VMware 通过二进制翻译解决了这个问题,Xen 则使用半虚拟化;直到 Intel 在 2005 年 11 月推出 VT-x、AMD 在 2006 年 5 月推出 AMD-V,才增加了供 hypervisor 使用的硬件模式。

租用 VPS 和拥有一个分时账户是一回事吗?

计费模式和隔离问题相同,但使用单位不同。分时用户获得的是共享操作系统上的一个账户,管理员是计算中心的工作人员。KVM VPS 为您提供一台拥有独立内核和独立 root 账户的虚拟机,因此管理员是您自己。基于容器的 VPS 介于两者之间,因为它共享主机内核,但仍在自己的环境中为您提供 root。

#history#computing#virtualization#mainframe#vps