VPS 的歷史:從大型主機到虛擬伺服器
你租用的 VPS 源自 1960 年代分時系統。本文追溯 CTSS、Multics、Unix、IBM VM/370、Xen 到 KVM,解析使用者隔離、CPU 排程與按量計費始終未變的核心。
VPS 的來源
從大型主機到雲端,計算技術的發展歷程就是讓同一項概念逐漸降低成本。這項概念就是分時:讓許多人同時使用一台昂貴的機器,並為每個人提供獨立的使用視圖。分時技術約於 1960 年發明,因為當時電腦的成本高於使用它的人力成本。如今租用的 VPS,其每個組成部分都是為了解決這個問題而建立:使用者之間的隔離機制、分配 CPU 使用時間的排程器、hypervisor,以及依使用時數計費的帳單。這個問題從未消失。硬體變得便宜,因此過去需要研究經費才能取得的運算切片,如今每月只需幾美元。
1959 至 1961 年:為何會發明分時系統
1950 年代的電腦以批次模式執行。使用者先將程式打孔到卡片上,再把整疊卡片交給操作員,稍後回來取得列印結果。只要打錯 1 個字元,就可能浪費 1 天。電腦持續保持忙碌,這正是設計批次處理的目的,因為像 IBM 7090 這類電腦要價數百萬美元,而等待者耗費的時間並不會出現在任何發票上。
1959 年 1 月,John McCarthy 在 MIT 的備忘錄中提出了相反的觀點:電腦應該等待使用者。同年,Christopher Strachey 在 UNESCO 會議上描述了一種分時系統形式,但他的意思是一名程式設計師進行除錯時,其他工作同時執行,而不是讓許多人同時輸入。在 1961 年 MIT 百年校慶演講中,McCarthy 進一步提出:運算能力可以像公共事業一樣銷售,並像電力一樣按使用量計費。
當時的反對理由是,分時系統會浪費電腦資源。在使用者之間切換需要消耗處理週期,而處理週期正是昂貴的資源。這項反對理由本身是正確的,但後來不再重要,因為處理週期的價格在 60 年間持續下降,而人類注意力 1 小時的價格並未下降。
CTSS 必須發明的功能
Fernando Corbató 的團隊在 MIT Computation Center 建置了 Compatible Time-Sharing System (CTSS),以解決這場爭論。系統最初於 1961 年 11 月在 IBM 709 上展示,可服務 4 位使用者,並將每位使用者的工作交換到各自的磁帶機上。「Compatible」表示這台機器仍可在底層執行舊的批次系統,因為沒有人會購買只能執行新功能的電腦。
4 位使用者是很小的數量。但要達到這個目標,必須解決的問題並不少,而且這正是你的 kernel 現在仍在處理的問題清單。CTSS 需要排程器,才能避免一個長時間執行的工作凍結所有其他終端機。它需要記憶體保護,讓當機的程式只影響一位使用者,而不是整個系統。它需要在登出後仍能保留資料的儲存設備,因此 CTSS 擁有現代使用者可以辨識的早期檔案系統之一。它也需要密碼,避免一位使用者讀取另一位使用者的檔案。
將這些元件重新命名後,就是一台 Linux 主機。排程器是 EEVDF,它在 Linux 6.6 中取代了 CFS。記憶體保護由 MMU (memory management unit) 提供,為每個 process 建立自己的虛擬位址空間。登出後仍能保留資料的儲存空間,就是你的 home directory。密碼檔案至今仍稱為 /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 需要專為 Multics 打造的硬體。Unix 則能在任何便宜且可取得的硬體上執行,而這最終成為決定性的特點。
Ritchie 與 Thompson 撰寫的〈The UNIX Time-Sharing System〉於 1974 年 7 月刊登在 Communications of the ACM。該論文描述了你的 VPS:程序、單一階層式檔案系統、以純位元組串流表示的檔案、fork、具備權限位元的使用者與群組,以及作為一般程式而非核心一部分的 shell。五十二年後,這個介面持續擴充,但從未被取代。
1972 年大型主機真的已經能執行虛擬機器了嗎?
是的,而這正是大多數人忽略的故事部分。MIT 建置 Multics 的同時,IBM Cambridge Scientific Center 從另一端著手實現相同目標。他們不是讓一個作業系統服務多位使用者,而是由 Robert Creasy 和 Les Comeau 建置控制程式,為每位使用者提供一台完整的模擬電腦。CP-40 於 1967 年 1 月投入正式運作。每位使用者都會取得一台虛擬 System/360,並在其中執行小型單一使用者作業系統 CMS。
CP-40 於 1968 年在 System/360-67 上演進為 CP-67,IBM 並於 1972 年 8 月 2 日宣布 VM/370。這是商用 hypervisor,於 54 年前就已銷售給付費客戶。控制程式會多工處理實體硬體,而 guest 作業系統則可在虛擬機器中不經修改地執行,並認為自己擁有整台機器。
相關理論在兩年後才出現,刊載 Unix 論文的同一期 1974 年 7 月《Communications of the ACM》中也收錄了這篇論文。Gerald Popek 和 Robert Goldberg 的〈Formal Requirements for Virtualizable Third Generation Architectures〉說明處理器必須具備哪些條件,才能支援虛擬化。核心規則很簡單:guest 在 kernel mode 之外執行時,任何能讀取或變更機器狀態的指令都必須觸發 trap,讓 hypervisor 取得控制權,並以該 guest 自己的私有狀態版本回應。這稱為 trap and emulate。IBM 的硬體符合這項規則。
微型電腦如何打破原有模式
DEC 在 1965 年 3 月 22 日推出 PDP-8,當時價格約為 18,000 美元(以 1965 年幣值計算)。這是第一款價格低於 20,000 美元的微型電腦,後來銷量超過 50,000 台。接著,微處理器再次壓低了價格。當部門可以購買自己的電腦,之後個人也能購買時,共用一台中央電腦看似已經解決,不再需要處理。到了 1980 年代和 1990 年代,運算資源逐漸移到桌面電腦,以及機架中的小型 x86 伺服器。
浪費以另一種形式重新出現。每台伺服器只執行一個應用程式,容易理解和管理,但大部分硬體會閒置,而電力與機架空間仍須全額支付。這再次形成 CTSS 所面臨的問題,只是規模不同;此時昂貴的資源不再是處理器,而是機房空間與電力。解法仍是過去的解法:共用這台機器。
為什麼 x86 如此難以虛擬化?
因為 x86 違反了 Popek and Goldberg 的規則。在 2000 年 8 月舉行的第 9 屆 USENIX Security Symposium 中,John Scott Robin 與 Cynthia Irvine 逐一檢視 Pentium 指令集,發現有 17 個指令會讀取或變更特權狀態,但在 user mode 程式執行這些指令時不會觸發例外。popf 是標準範例。在 user mode 執行此指令時,處理器會靜默忽略程式無權設定的位元,而不是觸發例外。因此,建立在 trap and emulate 上的 hypervisor 不會得知 guest 曾嘗試執行該操作。
硬體修正前,出現了兩種解法。VMware 於 1998 年由 Stanford 的 Disco 研究計畫成立。它會檢查 guest kernel 程式碼,並在不相容的指令執行前改寫這些指令。這項技術稱為 binary translation。Xen 則來自 University of Cambridge Computer Laboratory,採取相反做法,直接修改 guest。論文 "Xen and the Art of Virtualization" 於 2003 年 10 月在 SOSP 發表,介紹了 paravirtualisation:修改後的 guest kernel 會主動呼叫 hypervisor,而不是執行 hypervisor 無法攔截的指令。
後來硬體完成修正,方式與 IBM 在 1960 年代採用的做法相同。Intel 於 2005 年 11 月 14 日在兩款 Pentium 4 型號上推出 VT-x,AMD 則於 2006 年 5 月推出 AMD-V。兩者都新增一種位於 guest kernel 下方的處理器模式,讓 guest 能以完整速度執行自己的 kernel,同時讓 hypervisor 控制 guest 所要求的事件。這使 hypervisor 足夠精簡,可以放在一般作業系統內執行。Avi Kivity 在 Qumranet 開發的 KVM 正是如此:它將 Linux kernel 本身轉變為 hypervisor。KVM 已合併至 Linux 2.6.20,該版本於 2007 年 2 月發布;如今大量 VPS 主機都執行 KVM。
VPS 名稱的由來
兩條技術路線在 2000 年代初期交會。其中一條是 x86 上的完整虛擬機器,由 guest 啟動自己的 kernel。另一條是作業系統層級虛擬化:由多個環境共用單一 Linux kernel,每個環境都有自己的 root 使用者與 process table。Linux-VServer 與 SWsoft 的 Virtuozzo 都在 2001 年出現,SWsoft 也在 2005 年將 Virtuozzo 的部分元件以開放原始碼 OpenVZ 形式釋出。「virtual private server」一詞源自這條技術路線,其命名方式仿照 virtual private network。
Amazon 將租用運算資源轉為 API 呼叫。S3 於 14 March 2006 啟用,EC2 則在 25 August 2006 以有限公開 beta 形式開放,當時只有一種 instance type,執行於 Xen。購買運算資源不再是與服務商簽訂合約,而是送出請求後,在一分鐘內取得結果。
兩條路線至今仍然存在,而這項差異仍會決定你能對租用的伺服器做什麼。KVM VPS 會啟動自己的 kernel,因此可以載入 kernel modules,甚至在 VPS 內執行 hypervisor。容器型方案會共用 host kernel,因此無法這樣做。這一行定價頁面上的簡短說明,背後承載了 60 年的歷史。因此,在選擇之前,先了解 VPS、VM 與 VPC 的差異會更有幫助。
從大型主機到 VPS,哪些改變了,哪些沒有
有四件事改變了。機器不在你的大樓裡。終端機變成了程式,而不是一件家具。你租用的是一部具有自己 kernel 的完整電腦,而不是他人作業系統上的帳號。價格也降到只需刷卡付款,不再需要採購流程。
運作機制完全沒有改變。
- 你的 ssh 工作階段就是分時終端機。你取得登入環境和 shell,排程器決定下一次何時執行你的程序。
- 隔離仍由硬體強制執行。MMU 和處理器的權限層級負責這項工作,與 CP-40 在 1967 年所需的機制完全相同。
- 你仍按經過的時間支付機器使用額度,就像服務局過去按連線時數計費。
- 你仍會感受到其他租戶的影響。當主機超額配置時,你的 guest 會等待實體 CPU,而 Linux 會將這段等待回報為 來自吵鬧鄰居的 CPU steal time。
最後一點是整段歷史的直接總結。共用機器是一種取捨。1961 年之所以接受這種方式,是因為電腦的成本高於人的成本;2026 年仍接受這種方式,則是因為讓伺服器以百分之十的容量運作等同於浪費金錢。如果你更想站在營運商的一方,在自有硬體上執行 Proxmox會同時交給你 hypervisor 和營運商必須處理的問題。
請記住這個比例。CTSS 在一部耗資數百萬 1961 年美元、佔滿整個房間的機器上服務四名使用者。你的 VPS 在 2026 年每月只需幾美元,卻是遠勝 Corbató 團隊當年必須分配使用時間的電腦,而且完全由你使用。你之所以能租用它,是因為一個存在六十五年的概念終於遇上了低價硬體。如果你正在規劃要在上面部署什麼,請先了解VPS 實際提供給你的內容,再查看人們會在 VPS 上執行什麼。
FAQ
第一個分時電腦系統是什麼?
CTSS(Compatible Time-Sharing System)是由 MIT Computation Center 的 Fernando Corbató 團隊建置。它於 1961 年 11 月首次在 IBM 709 上展示,服務 4 位使用者,每位使用者都會被交換到獨立的磁帶機。第一個服務整個社群的分時服務是 Dartmouth Time-Sharing System:1964 年 5 月 1 日,John Kemeny 與一名學生程式設計師在 2 個終端機上同時執行 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 作業系統,並在商業市場銷售;這比 x86 硬體能執行相同功能早了數十年。
為什麼 x86 難以虛擬化,而大型主機卻不難?
Popek 與 Goldberg 在 1974 年提出的規則指出,凡是能讀取或變更機器狀態的指令,guest 在 kernel mode 以外執行時都必須觸發 trap。x86 違反了這項規則。Robin 與 Irvine 統計出 17 個 Pentium 指令在 user mode 中會無聲失敗,而不是觸發 trap。因此,傳統的 trap-and-emulate hypervisor 根本看不到這些指令,popf 是最常見的例子。VMware 以 binary translation 解決這個問題,Xen 則採用 paravirtualisation;直到 Intel VT-x 於 2005 年 11 月推出,以及 AMD-V 於 2006 年 5 月推出,才加入供 hypervisor 使用的硬體模式。
租用 VPS 等同於擁有分時帳號嗎?
計費模式與隔離問題相同,但單位不同。分時使用者取得的是與其他人共用的作業系統帳號,因此管理員是電腦中心的人員。KVM VPS 提供的是一台具備自有 kernel 與自有 root 帳號的虛擬機器,因此管理員是你自己。以容器為基礎的 VPS 介於兩者之間,因為它與主機共用 kernel,但仍在自己的環境中提供 root 權限。