メインフレームからVPSまでのコンピューティング史
月数ドルで借りられるVPSは、1960年代のタイムシェアリングの直系です。CTSS、Multics、Unix、IBM VM/370、Xen、KVMをたどり、変わらない仕組みを解説します。
VPS の提供元
メインフレームからクラウドに至るコンピューティングの歴史は、1 つの考え方が低コスト化してきた歴史でもあります。その考え方がタイムシェアリングです。高価な 1 台のマシンを多くの利用者が同時に使い、それぞれに専用の環境を提供します。これは、コンピューターの価格が利用者の人件費を上回っていたため、1960 年頃に考案されました。現在レンタルしている VPS の各要素は、すべてこの問題に対応するために作られました。利用者間の分離、CPU 時間を割り当てるスケジューラー、ハイパーバイザー、利用時間を集計する請求システムなどです。この問題がなくなったわけではありません。ハードウェアが安価になったため、かつては研究助成金が必要だった計算資源の一部を、現在では月数ドルで利用できます。
1959 から 1961: タイムシェアリングが発明された理由
1950 年代のコンピューターはバッチ処理で動作していました。プログラムをパンチカードに打ち込み、そのカード束をオペレーターに渡して、後で印刷結果を受け取りに戻りました。1 文字の入力ミスで 1 日を失うこともありました。マシンは稼働し続けていました。それが導入の目的だったからです。IBM 7090 のようなマシンには数百万ドルの費用がかかり、結果を待つ人々の時間は請求書に計上されなかったためです。
1959 年 1 月、John McCarthy は MIT のメモでこれとは逆の考えを示しました。マシンが人を待つべきだという考えです。同じ年、Christopher Strachey は UNESCO の会議でタイムシェアリングの一形態を説明しました。ただし、複数の人が同時に入力する方式ではなく、他のジョブを実行しながら 1 人のプログラマーがデバッグする方式を意味していました。1961 年、MIT の創立 100 周年記念講演で、McCarthy はさらに踏み込みました。コンピューティングは電力のように使用量を計測し、公共サービスとして販売できるという考えです。
当時の反論は、タイムシェアリングはマシンを無駄にするというものでした。ユーザーを切り替えるにはサイクルが必要であり、サイクルこそ高価な資源だったからです。この反論は正しかったものの、やがて問題にならなくなりました。60 年にわたって 1 サイクルの価格は下がり続けましたが、人間の注意力 1 時間の価格は下がらなかったためです。
CTSS が発明する必要があったもの
Fernando Corbató のグループは、MIT Computation Center で議論に決着をつけるため、Compatible Time-Sharing System (CTSS) を構築しました。最初の実演は 1961 年 11 月、IBM 709 上で行われ、4 人のユーザーにサービスを提供しました。各ユーザーの作業は、それぞれ専用の磁気テープドライブへスワップされました。「Compatible」とは、旧来のバッチシステムも下層で実行できるという意味でした。新しい処理しかできないコンピューターを購入する人はいないからです。
4 人は少ない数です。しかし、そこに到達するまでに解決しなければならなかった問題の一覧は少なくありません。そして、それは現在もカーネルが処理しているものと同じ一覧です。CTSS にはスケジューラーが必要でした。1 つの長時間ジョブが、ほかのすべての端末を停止させないようにするためです。メモリ保護も必要でした。プログラムがクラッシュしても、システム全体ではなく 1 人のユーザーだけが影響を受けるようにするためです。ログアウト後も保持されるストレージも必要でした。そのため、CTSS には現代のユーザーにも認識できる最初期のファイルシステムの 1 つがありました。また、1 人のユーザーが別のユーザーのファイルを読めないように、パスワードも必要でした。
これらの部分の名前を置き換えれば、Linux ボックスになります。スケジューラーは EEVDF です。Linux 6.6 で CFS に置き換えられました。メモリ保護は、MMU (memory management unit) が各プロセスに独自の仮想アドレス空間を与えることで実現します。ログアウト後も保持されるストレージは、ユーザーのホームディレクトリです。パスワードファイルは現在も /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 の顧客向けに稼働を開始し、その後、どこかの環境で 31 年間にわたって本番運用されました。最後に稼働していた Multics システムは、Nova Scotia 州 Halifax の Canadian Department of National Defence にあり、2000 年 10 月 30 日に停止しました。
Multics は、登場が遅く、動作も遅かったため、失敗作として扱われることがよくあります。しかし、その用語体系を見ると評価は異なります。ディレクトリの中にディレクトリを置く階層型ファイルシステム、各ファイルに対するアクセス制御リスト、プログラムがファイルをメモリのようにアドレスできるセグメント方式の仮想メモリ、そしてコードの信頼度に応じて権限を順位付けする保護リングを Multics は実現しました。リングは現在も、目の前のプロセッサのシリコンに実装されています。カーネル用の ring 0 とユーザーコード用の ring 3 は Multics 由来の用語です。その後、ハードウェア仮想化によって ring 0 の下にハイパーバイザー用のモードが追加され、一般には ring -1 と呼ばれています。
手頃なマシンで実現したタイムシェアリング
Multics を離れた Ken Thompson は、Bell Labs で使いたいシステムを失いました。1969 年、廃棄された PDP-7 で、はるかに小規模なシステムの開発を始めました。最初の Unix Programmer's Manual の日付は 1971 年 11 月です。この頃には開発環境が PDP-11 に移っていました。1973 年、Thompson と Dennis Ritchie はカーネルを C で書き直しました。そのため、システムを新しいハードウェアへ移植する際に、すべてを手作業で書き直す必要がなくなりました。
これが、皆さんが Multics の子孫ではなく Unix の子孫へ入力する理由です。Multics には、Multics 用に構築されたハードウェアが必要でした。Unix は、安価で入手できるハードウェア上で動作しました。そして、それが決定的な特徴になりました。
Ritchie と Thompson による「The UNIX Time-Sharing System」は、1974 年 7 月に Communications of the ACM に掲載されました。この論文では、皆さんの VPS にもある要素が説明されています。プロセス、階層型の単一ファイルシステム、通常のバイトストリームとして扱うファイル、fork、権限ビットによるユーザーとグループの管理、そしてカーネルの一部ではなく通常のプログラムとして実装されたシェルです。52 年後の現在も、このインターフェースは拡張され続けており、置き換えられてはいません。
メインフレームは本当に1972年に仮想マシンを実行していたのでしょうか?
はい。ここは多くの人が見落としている点です。MIT が Multics を開発していた一方で、IBM の Cambridge Scientific Center は同じ目標に反対側から取り組みました。1 つのオペレーティングシステムで多数のユーザーに対応する代わりに、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 を発表しました。これは料金を支払う顧客向けに販売された商用ハイパーバイザーであり、54年前に登場したものです。制御プログラムが実ハードウェアを多重化し、ゲストオペレーティングシステムは、マシンを自分が所有していると認識する仮想マシン内で、変更なしに実行されました。
理論が登場したのは、その2年後です。Unix の論文が掲載されたのと同じ1974年7月号の Communications of the ACM でした。Gerald Popek と Robert Goldberg の論文「Formal Requirements for Virtualizable Third Generation Architectures」は、プロセッサーが仮想化可能であるために必要な動作を示しました。中核となる規則は簡潔です。マシンの状態を読み取る、または変更できるすべての命令は、ゲストがカーネルモード以外で実行したときにトラップしなければなりません。これにより、ハイパーバイザーが制御を取得し、そのゲスト専用の状態を返します。これはトラップアンドエミュレートと呼ばれます。IBM のハードウェアはこの規則に従っていました。
ミニコンピューターが従来のモデルを変えた理由
DEC は 1965 年 3 月 22 日、1965 年当時の価値で約 $18,000 の PDP-8 を発表しました。これは $20,000 未満で販売された最初のミニコンピューターで、その後 50,000 台を超える販売台数を記録しました。続いてマイクロプロセッサーが価格をさらに押し下げました。部門単位で専用のマシンを購入できるようになり、やがて個人でも購入できるようになると、1 台の中央コンピューターを共有することは、すでに解決済みで、もう解決する必要のない問題に見えました。1980 年代から 1990 年代にかけて、コンピューティングはデスク上へ、そして小型の x86 サーバーを収めたラックへと移っていきました。
無駄は別の形で再び現れました。サーバー 1 台につきアプリケーション 1 つという構成は理解しやすい一方で、電力とラックスペースの費用を全額支払ったまま、ハードウェアの大部分をアイドル状態にします。これは、新しい規模で再び現れた CTSS の問題です。ただし、いま高価な資源なのはプロセッサーではなく、設置場所と電力です。解決策は以前と同じでした。マシンを共有することです。
x86 の仮想化はなぜ難しかったのでしょうか?
x86 が Popek と Goldberg の規則に違反していたためです。2000 年 8 月の第 9 回 USENIX Security Symposium で、John Scott Robin と Cynthia Irvine は Pentium の命令セットを調査し、ユーザーモードのコードが実行しても例外を発生させずに特権状態を読み取ったり変更したりする命令を 17 個見つけました。popf が代表例です。ユーザーモードで実行すると、プロセッサはプログラムに設定を許可していないビットをトラップせずに黙って無視します。そのため、トラップとエミュレーションに基づくハイパーバイザーは、ゲストがその操作を試みたことを認識できません。
ハードウェア側で修正される前に、2 つの解決策が登場しました。1998 年に Stanford の Disco 研究を基に設立された VMware は、ゲストカーネルのコードを検査し、問題のある命令を実行前に書き換えました。これはバイナリ変換と呼ばれる手法です。University of Cambridge Computer Laboratory から生まれた Xen は、代わりにゲストを変更しました。2003 年 10 月に SOSP で発表された論文「Xen and the Art of Virtualization」では、準仮想化について説明されています。変更されたゲストカーネルが、ハイパーバイザーからインターセプトできない命令を実行するのではなく、意図的にハイパーバイザーを呼び出す方式です。
その後、1960 年代に IBM が行ったのと同じように、ハードウェア側が修正されました。Intel は 2005 年 11 月 14 日に 2 つの Pentium 4 モデルで VT-x を出荷し、AMD は 2006 年 5 月に AMD-V を出荷しました。どちらもゲストカーネルより下位のプロセッサモードを追加します。これにより、ゲストは自身のカーネルをフルスピードで実行しながら、ハイパーバイザーは要求されたイベントを制御できます。これによって、通常のオペレーティングシステム内で動作できるほど小さなハイパーバイザーが実現しました。Avi Kivity が Qumranet で開発した KVM は、まさにこの方式を採用し、Linux カーネル自体をハイパーバイザーにしました。KVM は 2007 年 2 月にリリースされた Linux 2.6.20 に統合され、現在も多くの VPS ホストで使われています。
VPS の名称の由来
2000 年代初頭に、2 つの流れが合流しました。1 つは x86 上の完全仮想マシンで、ゲストが独自のカーネルを起動します。もう 1 つは OS レベルの仮想化で、1 つの共有 Linux カーネルを複数の環境に分割し、それぞれに独自の root ユーザーとプロセステーブルを持たせます。Linux-VServer と SWsoft の Virtuozzo はどちらも 2001 年に登場し、SWsoft は 2005 年に Virtuozzo の一部をオープンソースの OpenVZ として公開しました。「virtual private server」という名称はこの系譜に由来し、virtual private network になぞらえて作られました。
Amazon は、コンピュートリソースのレンタルを API 呼び出しに変えました。S3 は 2006 年 3 月 14 日に開始され、EC2 は 2006 年 8 月 25 日に限定公開ベータとして提供を開始しました。インスタンスタイプは 1 種類だけで、Xen 上で稼働していました。コンピュートリソースの購入は、サービス会社との契約ではなく、1 分以内に結果が返るリクエストになりました。
両方の系譜は現在も残っており、借りるサーバーで何ができるかは、この違いによって決まります。KVM VPS は独自のカーネルを起動するため、カーネルモジュールを読み込んだり、VPS 内でハイパーバイザーを実行したりできます。コンテナベースのプランはホストのカーネルを共有するため、実行できません。価格ページの 1 行の説明の背後には 60 年にわたる歴史があります。そのため、VPS、VM、VPC の違いが どのようなものかを理解してから選ぶことが重要です。
メインフレームからVPSへ変わったもの、変わらなかったもの
変わったのは4つです。マシンは自分の建物内にはありません。端末は家具ではなくプログラムです。借りる単位は、他人のオペレーティングシステム上のアカウントではなく、独自のカーネルを持つ1台のコンピューター全体です。そして価格が十分に下がったため、購入は調達プロセスではなくカード決済で済みます。
仕組みはまったく変わっていません。
- ssh セッションはタイムシェアリング端末です。ログインとシェルが割り当てられ、スケジューラーが次にプロセスを実行するタイミングを決めます。
- 隔離は現在もハードウェアによって強制されます。MMU とプロセッサの特権レベルが処理を担います。これは、1967年に CP-40 が必要とした仕組みとまったく同じです。
- 現在も、サービスビューローが接続時間に対して課金していた時代と同じように、経過時間に応じてマシンの一部を利用した分の料金を請求されます。
- 他のテナントの影響も受けます。ホストが過剰に割り当てられていると、ゲストは物理 CPU が空くまで待機します。Linux はこの待機を ノイジーネイバーによる CPU steal time として報告します。
この最後の点が、全体の歴史を正直に要約しています。マシンの共有は取引です。1961年に受け入れられたのは、コンピューターの費用が人件費を上回っていたためです。2026年に受け入れられているのは、容量の10%で稼働するサーバーが、使われない資金を生むためです。この取引で運用者側に立ちたい場合は、所有するハードウェアで Proxmox を実行することで、ハイパーバイザーと運用者の問題を同時に引き受けられます。
この比率を覚えておいてください。CTSS は、1961年の数百万ドルに相当する費用がかかり、1室を埋めるほどの大きさだったマシンで、4人のユーザーにサービスを提供していました。2026年に月数ドルで利用できる VPS は、Corbató のチームが割り当てを調整していたマシンよりはるかに高性能なコンピューターであり、それを自分専用に使えます。VPS をレンタルできるのは、65年前のアイデアが低価格なハードウェアとようやく結び付いたためです。VPS に何を配置するか考えているなら、まず VPS が実際に提供するものを確認し、次に VPS で実行されているものを確認してください。
FAQ
最初のタイムシェアリングコンピューターシステムは何ですか?
MIT Computation Center で Fernando Corbató のグループが構築した CTSS(Compatible Time-Sharing System)です。1961 年 11 月に IBM 709 上で初めて実演され、4 人のユーザーに対応しました。各ユーザーの処理は別々のテープドライブへスワップされました。コミュニティ全体を対象にした最初のタイムシェアリングサービスは Dartmouth Time-Sharing System です。1964 年 5 月 1 日、John Kemeny と学生プログラマーが 2 台の端末で同時に BASIC プログラムを実行し、両方の端末で正しい結果を受け取りました。
仮想マシンは本当に 1960 年代に発明されたのですか?
はい。IBM's Cambridge Scientific Center は 1967 年 1 月に CP-40 を本番運用へ移行しました。各ユーザーに、CMS operating system が内部で動作する完全な仮想 System/360 を提供しました。1968 年には System/360-67 向けの CP-67 が続き、IBM は 1972 年 8 月 2 日に VM/370 を発表しました。これらは、変更されていないゲスト operating system を実行する実際の hypervisor です。x86 hardware で同じことが可能になる数十年も前から、商用製品として提供されていました。
mainframe では問題なかったのに、x86 の仮想化が難しかったのはなぜですか?
Popek と Goldberg が 1974 年に示した規則では、machine state を読み取る、または変更できるすべての命令は、ゲストが kernel mode 外で実行したときに trap しなければなりません。x86 はこの規則を満たしていませんでした。Robin と Irvine は、Pentium に user mode で trap せずに動作を完了する命令が 17 個あることを数え上げました。そのため、従来の trap-and-emulate hypervisor ではそれらを検出できません。popf が通常の例です。VMware は binary translation で回避し、Xen は paravirtualisation を使用しました。その後、Intel VT-x が 2005 年 11 月に、AMD-V が 2006 年 5 月に、hypervisor 向けの hardware mode を追加しました。
VPS をレンタルすることは、タイムシェアリングのアカウントを持つことと同じですか?
課金モデルと隔離の問題は同じです。ただし、単位が異なります。タイムシェアリングのユーザーは、他の全員と共有する operating system 上のアカウントを使用していました。そのため、administrator はコンピューターセンターの担当者でした。KVM VPS では、独自の kernel と root account を持つ virtual machine が提供されるため、administrator はユーザー自身です。container-based VPS はその中間に位置します。host kernel を共有しながら、独自の環境内では root を使用できるためです。