Historia VPS: od mainframe do współczesnej chmury
Poznaj ewolucję technologii time-sharing od systemów CTSS i IBM VM/370 po współczesne rozwiązania Xen oraz KVM. Dowiedz się, jak architektura mainframe wpłynęła na VPS.
Pochodzenie Twojego VPS
Historia informatyki, od komputerów typu mainframe po chmurę, to proces obniżania kosztów jednej idei. Tą ideą jest współdzielenie czasu procesora (time-sharing): umożliwienie wielu użytkownikom jednoczesnego korzystania z jednej kosztownej maszyny przy zapewnieniu każdemu z nich odizolowanego środowiska pracy. Rozwiązanie to opracowano około 1960 roku, ponieważ koszt komputera przewyższał koszty pracy osób z niego korzystających. Każdy element wynajmowanego dzisiaj VPS został stworzony w odpowiedzi na ten problem: izolacja między użytkownikami, harmonogram przydzielający czas procesora, hypervisor oraz system rozliczeń godzinowych. Problem ten nigdy nie zniknął. Sprzęt stał się tani, dzięki czemu zasoby, które kiedyś wymagały grantu badawczego, obecnie kosztują kilka dolarów miesięcznie.
Lata 1959–1961: dlaczego wynaleziono współdzielenie czasu (time-sharing)
W latach 50. XX wieku komputery pracowały w trybie wsadowym. Program dziurkowano na kartach, przekazywano stos operatorowi i wracano później po wydruk. Jeden błędny znak oznaczał stratę dnia pracy. Maszyna pozostawała stale zajęta, co było głównym celem, ponieważ komputer klasy IBM 7090 kosztował miliony dolarów, a czas oczekujących ludzi nie figurował na żadnej fakturze.
W styczniu 1959 roku John McCarthy przedstawił w notatce dla MIT przeciwne podejście. To maszyna powinna czekać na człowieka. Christopher Strachey opisał formę współdzielenia czasu na konferencji UNESCO w tym samym roku, choć miał na myśli programistę debugującego kod w trakcie działania innych zadań, a nie wielu użytkowników piszących jednocześnie. Przemawiając na stuleciu MIT w 1961 roku, McCarthy poszedł dalej: obliczenia można sprzedawać jako usługę publiczną, rozliczaną jak energię elektryczną.
Ówczesny sprzeciw opierał się na twierdzeniu, że współdzielenie czasu marnuje zasoby maszyny. Przełączanie między użytkownikami kosztuje cykle procesora, a cykle były najdroższym elementem. Sprzeciw był słuszny, lecz przestał mieć znaczenie, ponieważ cena cyklu spadała przez sześćdziesiąt lat, podczas gdy cena godziny ludzkiej uwagi nie.
Co musiał wymyślić CTSS
Grupa Fernando Corbató w MIT Computation Center zbudowała Compatible Time-Sharing System (CTSS), aby rozstrzygnąć spór. System zaprezentowano po raz pierwszy w listopadzie 1961 roku na komputerze IBM 709, obsługującym czterech użytkowników, z których każdy miał pracę przenoszoną na własny napęd taśmy magnetycznej. „Compatible” oznaczało, że maszyna mogła nadal uruchamiać stary system przetwarzania wsadowego, ponieważ nikt nie kupuje komputera, który realizuje tylko nowe funkcje.
Czterech użytkowników to niewielka liczba. Lista problemów, które należało rozwiązać, aby to osiągnąć, nie jest krótka i jest to ta sama lista, którą obecnie przetwarza jądro systemu. CTSS wymagał planisty, aby jedno długotrwałe zadanie nie blokowało wszystkich pozostałych terminali. Wymagał ochrony pamięci, aby awaria programu powodowała błąd tylko u jednego użytkownika, a nie całego systemu. Wymagał pamięci masowej, która przetrwałaby wylogowanie, dlatego CTSS posiadał jeden z pierwszych systemów plików, który współczesny użytkownik byłby w stanie rozpoznać. Wymagał również haseł, aby jeden użytkownik nie mógł odczytać plików innego użytkownika.
Zmień nazwy tych komponentów, a otrzymasz system Linux. Planistą jest EEVDF, który zastąpił CFS w Linux 6.6. Ochrona pamięci to MMU (memory management unit), zapewniający każdemu procesowi własną wirtualną przestrzeń adresową. Pamięć masowa, która przetrwa wylogowanie, to katalog domowy. Plik z hasłami nadal nazywa się /etc/passwd.
Multics i użyteczność komputerowa
Kolejny system MIT miał być użytecznością, którą opisał McCarthy. Projekt MAC rozpoczął się w 1963 roku, umowę na General Electric GE-645 podpisano w sierpniu 1964 roku, a pierwsze publikacje dotyczące Multics ukazały się w 1965 roku. Nazwa zawiera argumentację: Multiplexed Information and Computing Service. Usługa, rozumiana jako coś, co kupuje się na godziny.
Prace nad Multics trwały znacznie dłużej niż planowano. Prototypowe maszyny GE-645 dotarły do MIT oraz Bell Labs w styczniu 1967 roku. Bell Labs wycofało się z projektu w kwietniu 1969 roku. Multics udostępniono klientom MIT Information Processing Center 1 października 1969 roku i od tego momentu system działał produkcyjnie przez trzydzieści jeden lat. Ostatni aktywny system Multics, znajdujący się w Canadian Department of National Defence w Halifax w Nowej Szkocji, został wyłączony 30 października 2000 roku.
Multics jest często klasyfikowany jako porażka, ponieważ powstał z opóźnieniem i działał wolno. Słownictwo wskazuje jednak na coś innego. System ten wprowadził hierarchiczny system plików z katalogami wewnątrz katalogów, listy kontroli dostępu dla każdego pliku, segmentowaną pamięć wirtualną pozwalającą programowi adresować plik tak, jakby był pamięcią, oraz pierścienie ochrony, które klasyfikowały kod według poziomu zaufania. Pierścienie te nadal znajdują się w krzemie przed Tobą. Ring 0 dla jądra systemu i ring 3 dla kodu użytkownika to słownictwo wywodzące się z Multics, a późniejsza wirtualizacja sprzętowa dodała tryb poniżej ring 0 dla hypervisora, który nieformalnie nazywa się ring -1.
Unix: współdzielenie czasu na maszynie, na którą było Cię stać
Odejście od projektu Multics pozostawiło Kena Thompsona w Bell Labs bez systemu, z którego chciał korzystać. W 1969 roku rozpoczął prace nad znacznie mniejszym systemem na porzuconej maszynie PDP-7. Pierwszy podręcznik programisty Unix (Unix Programmer's Manual) datowany jest na listopad 1971 roku; do tego czasu prace przeniesiono na PDP-11. W 1973 roku Thompson i Dennis Ritchie przepisali jądro w języku C, dzięki czemu system mógł być przenoszony na nowy sprzęt bez konieczności ręcznego przepisywania kodu.
To właśnie dlatego korzystasz z systemu wywodzącego się z Unix, a nie z Multics. Multics wymagał sprzętu zaprojektowanego specjalnie dla niego. Unix działał na wszystkim, co było tanie i dostępne, co okazało się decydującą cechą.
Artykuł "The UNIX Time-Sharing System" autorstwa Ritchiego i Thompsona ukazał się w Communications of the ACM w lipcu 1974 roku. Publikacja ta opisuje Twój VPS: procesy, jeden hierarchiczny system plików, pliki jako zwykłe strumienie bajtów, fork, użytkowników i grupy z bitami uprawnień oraz powłokę, która jest zwykłym programem, a nie częścią jądra. Pięćdziesiąt dwa lata później ten interfejs został rozszerzony, ale nigdy nie został zastąpiony.
Czy mainframy rzeczywiście uruchamiały maszyny wirtualne w 1972 roku?
Tak, i jest to część historii, którą większość ludzi pomija. Podczas gdy MIT budowało Multics, Cambridge Scientific Center firmy IBM dążyło do tego samego celu z innej strony. Zamiast jednego systemu operacyjnego obsługującego wielu użytkowników, Robert Creasy i Les Comeau stworzyli program sterujący, który zapewniał każdemu użytkownikowi kompletny symulowany komputer. CP-40 wszedł do produkcji w styczniu 1967 roku. Każdy użytkownik otrzymywał wirtualny System/360 i uruchamiał wewnątrz niego niewielki, jednozadaniowy system operacyjny CMS.
CP-40 stał się CP-67 na platformie System/360-67 w 1968 roku, a IBM ogłosił VM/370 w dniu 2 sierpnia 1972 roku. Jest to komercyjny hypervisor, sprzedawany płacącym klientom pięćdziesiąt cztery lata temu. Program sterujący multipleksował rzeczywisty sprzęt, a gościnne systemy operacyjne działały bez modyfikacji wewnątrz maszyn wirtualnych, które "wierzyły", że posiadają cały komputer na własność.
Teoria pojawiła się dwa lata później, w tym samym wydaniu Communications of the ACM z lipca 1974 roku, w którym opublikowano artykuł o Unix. Praca Geralda Popka i Roberta Goldberga pt. "Formal Requirements for Virtualizable Third Generation Architectures" określiła, co procesor musi robić, aby być wirtualizowalnym. Podstawowa zasada jest krótka. Każda instrukcja, która może odczytać lub zmienić stan maszyny, musi wywołać pułapkę (trap), gdy gość wykonuje ją poza trybem jądra, dzięki czemu hypervisor przejmuje kontrolę i odpowiada, korzystając z prywatnej wersji stanu tego gościa. Proces ten nazywa się trap and emulate. Sprzęt IBM spełniał ten wymóg.
Dlaczego minikomputer zburzył dotychczasowy model
Firma DEC wprowadziła model PDP-8 w dniu 22 marca 1965 roku w cenie około 18 000 dolarów z 1965 roku. Był to pierwszy minikomputer kosztujący poniżej 20 000 dolarów, a jego łączna sprzedaż przekroczyła 50 000 sztuk. Następnie mikroprocesory spowodowały dalszy spadek cen. Gdy działy firm, a później pojedyncze osoby, zyskały możliwość zakupu własnych maszyn, współdzielenie jednego centralnego komputera przestało być postrzegane jako problem wymagający rozwiązania. W latach 80. i 90. obliczenia przeniosły się na biurka oraz do szaf typu rack wypełnionych małymi serwerami x86.
Marnotrawstwo powróciło w innej formie. Uruchamianie jednej aplikacji na serwerze ułatwia analizę systemu, lecz sprawia, że większość zasobów sprzętowych pozostaje bezczynna, mimo opłacania pełnych kosztów energii i miejsca w szafie rack. Jest to powrót do problemu CTSS w nowej skali, gdzie kosztownym zasobem nie jest już sam procesor, lecz przestrzeń w serwerowni i zużycie energii elektrycznej. Odpowiedź pozostała taka sama jak dawniej: współdzielenie maszyny.
Dlaczego wirtualizacja architektury x86 była tak trudna?
Architektura x86 naruszała zasadę Popeka i Goldberga. Podczas 9. sympozjum USENIX Security Symposium w sierpniu 2000 roku, John Scott Robin oraz Cynthia Irvine przeanalizowali zestaw instrukcji procesora Pentium i zidentyfikowali siedemnaście instrukcji, które odczytują lub zmieniają stan uprzywilejowany bez wywoływania wyjątku w trybie użytkownika. popf stanowi standardowy przykład. Uruchomienie tej instrukcji w trybie użytkownika powoduje, że procesor po cichu ignoruje bity, których program nie ma uprawnień zmieniać, zamiast generować pułapkę (trap). W rezultacie hiperwizor oparty na mechanizmie trap-and-emulate nie otrzymuje informacji o próbie wykonania operacji przez system gościa.
Zanim wprowadzono poprawki sprzętowe, pojawiły się dwa rozwiązania. Firma VMware, założona w 1998 roku na bazie badań Disco z Uniwersytetu Stanforda, analizowała kod jądra gościa i nadpisywała problematyczne instrukcje przed ich wykonaniem; technikę tę nazwano translacją binarną. Projekt Xen z Computer Laboratory Uniwersytetu w Cambridge przyjął inne podejście i zmodyfikował samego gościa. Artykuł "Xen and the Art of Virtualization", zaprezentowany na konferencji SOSP w październiku 2003 roku, opisał parawirtualizację: zmodyfikowane jądro gościa celowo wywołuje hiperwizor, zamiast wykonywać instrukcje, których hiperwizor nie jest w stanie przechwycić.
Następnie wprowadzono poprawki sprzętowe, analogiczne do tych, które IBM zastosował w latach 60. XX wieku. Intel wprowadził technologię VT-x w dwóch modelach procesorów Pentium 4 w dniu 14 listopada 2005 roku, a AMD udostępniło AMD-V w maju 2006 roku. Obie technologie dodają tryb procesora znajdujący się poniżej jądra gościa. Dzięki temu gość uruchamia własne jądro z pełną prędkością, podczas gdy hiperwizor zachowuje kontrolę nad wybranymi zdarzeniami. Pozwoliło to na stworzenie hiperwizora na tyle lekkiego, by mógł działać wewnątrz zwykłego systemu operacyjnego. Avi Kivity z firmy Qumranet zrealizował to rozwiązanie w projekcie KVM, przekształcając jądro Linux w hiperwizor. KVM został włączony do głównej gałęzi jądra Linux w wersji 2.6.20, wydanej w lutym 2007 roku, i obecnie stanowi fundament większości usług VPS.
Geneza nazwy VPS
Na początku lat 2000. zbiegły się dwie ścieżki rozwoju. Pierwszą była pełna maszyna wirtualna na architekturze x86, czyli system gość uruchamiający własne jądro. Drugą była wirtualizacja na poziomie systemu operacyjnego: pojedyncze, współdzielone jądro Linux podzielone na odrębne środowiska, z których każde posiadało własnego użytkownika root oraz własną tablicę procesów. Linux-VServer oraz Virtuozzo firmy SWsoft pojawiły się w 2001 roku, a w 2005 roku SWsoft udostępnił część kodu Virtuozzo jako projekt open-source OpenVZ. Termin "virtual private server" wywodzi się z tej gałęzi rozwoju i powstał przez analogię do virtual private network.
Firma Amazon przekształciła wynajem zasobów w wywołanie API. Usługa S3 wystartowała 14 marca 2006 roku, a 25 sierpnia 2006 roku uruchomiono EC2 w formie ograniczonej publicznej bety, oferującej jeden typ instancji działający w oparciu o Xen. Zakup mocy obliczeniowej przestał być umową z biurem usługowym, a stał się żądaniem realizowanym w ciągu minuty.
Obie ścieżki przetrwały do dziś, a podział ten nadal determinuje możliwości wynajmowanego serwera. VPS typu KVM uruchamia własne jądro, co pozwala na ładowanie modułów jądra, a nawet uruchomienie hypervisora wewnątrz VPS. Plan oparty na kontenerach współdzieli jądro hosta i nie oferuje takich możliwości. Za jedną linią w cenniku kryje się sześćdziesiąt lat historii, dlatego warto zrozumieć, czym różnią się VPS, VM oraz VPC, zanim dokona się wyboru.
Co zmieniło się od czasów mainframe do VPS, a co pozostało bez zmian
Zmieniły się cztery rzeczy. Maszyna nie znajduje się w Twoim budynku. Terminal jest programem, a nie meblem. Wynajmowana jednostka to cały komputer z własnym kernelem, a nie konto w systemie operacyjnym należącym do kogoś innego. Cena spadła na tyle, że zakup jest płatnością kartą, a nie procesem zamówień publicznych.
Mechanizm nie zmienił się wcale.
- Sesja ssh to terminal z podziałem czasu. Otrzymujesz login i shell, a scheduler decyduje, kiedy Twój proces zostanie uruchomiony.
- Izolacja nadal jest wymuszana przez sprzęt. MMU oraz poziomy uprawnień procesora wykonują tę pracę dokładnie tak, jak wymagał tego CP-40 w 1967 roku.
- Nadal płacisz za udział w maszynie według czasu pracy, tak jak biura usługowe rozliczały godziny połączeń.
- Nadal odczuwasz obecność innych najemców. Gdy host jest przeciążony, Twój gość czeka na fizyczny CPU, a Linux raportuje to oczekiwanie jako CPU steal time od hałaśliwego sąsiada.
Ten ostatni punkt to uczciwe podsumowanie całej historii. Współdzielenie maszyny to transakcja. Została zaakceptowana w 1961 roku, ponieważ komputer kosztował więcej niż ludzie, i jest akceptowana w 2026 roku, ponieważ serwer działający na dziesięć procent swoich możliwości to marnowanie pieniędzy. Jeśli wolisz stanąć po stronie operatora w tej transakcji, uruchomienie Proxmox na własnym sprzęcie przekazuje Ci zarówno hypervisor, jak i problemy operatora.
Pamiętaj o proporcjach. CTSS obsługiwał czterech użytkowników na maszynie, która kosztowała miliony dolarów z 1961 roku i zajmowała całe pomieszczenie. Twój VPS, za kilka dolarów miesięcznie w 2026 roku, jest znacznie lepszym komputerem niż ten, który racjonował zespół Corbató, a masz go na własność. Powodem, dla którego w ogóle możesz go wynająć, jest sześćdziesięciopięcioletnia idea, która w końcu spotkała się z tanim sprzętem. Jeśli zastanawiasz się, co na nim umieścić, zacznij od tego, co faktycznie daje Ci VPS, a następnie sprawdź co ludzie na nim uruchamiają.
FAQ
Jaki był pierwszy system komputerowy z podziałem czasu?
CTSS, czyli Compatible Time-Sharing System, zbudowany przez grupę Fernando Corbató w MIT Computation Center. Po raz pierwszy zaprezentowano go w listopadzie 1961 roku na maszynie IBM 709; obsługiwał czterech użytkowników, z których każdy był przełączany na osobny napęd taśmowy. Pierwszą usługą z podziałem czasu dla całej społeczności był Dartmouth Time-Sharing System: 1 maja 1964 roku John Kemeny wraz ze studentem uruchomili programy w języku BASIC jednocześnie na dwóch terminalach i obaj otrzymali poprawne odpowiedzi.
Czy maszyny wirtualne naprawdę wymyślono w latach 60.?
Tak. IBM Cambridge Scientific Center wdrożyło system CP-40 do produkcji w styczniu 1967 roku, zapewniając każdemu użytkownikowi pełną wirtualną maszynę System/360 z działającym wewnątrz systemem operacyjnym CMS. W 1968 roku na platformie System/360-67 pojawił się CP-67, a 2 sierpnia 1972 roku IBM ogłosił system VM/370. Były to rzeczywiste hiperwizory uruchamiające niezmodyfikowane systemy operacyjne gości, sprzedawane komercyjnie na dekady przed tym, zanim architektura x86 umożliwiła to samo.
Dlaczego wirtualizacja x86 była trudna, podczas gdy w przypadku komputerów mainframe nie stanowiła problemu?
Zasada Popka i Goldberga z 1974 roku stanowi, że każda instrukcja mogąca odczytać lub zmienić stan maszyny musi wywoływać pułapkę (trap), gdy gość uruchamia ją poza trybem jądra. Architektura x86 łamała tę zasadę. Robin i Irvine doliczyli się siedemnastu instrukcji procesora Pentium, które w trybie użytkownika kończą się cichym błędem zamiast pułapką, przez co klasyczny hiperwizor typu trap-and-emulate ich nie wykrywa; popf jest typowym przykładem. VMware obeszło ten problem za pomocą translacji binarnej, a Xen poprzez parawirtualizację, aż do momentu wprowadzenia przez Intel VT-x w listopadzie 2005 roku oraz AMD-V w maju 2006 roku sprzętowego trybu dla hiperwizora.
Czy wynajęcie VPS jest tym samym, co posiadanie konta w systemie z podziałem czasu?
Model rozliczeniowy oraz problem izolacji są identyczne. Różni się natomiast jednostka. Użytkownik systemu z podziałem czasu otrzymywał konto w systemie operacyjnym współdzielonym z innymi, więc administratorem był pracownik centrum obliczeniowego. VPS oparty na KVM zapewnia maszynę wirtualną z własnym jądrem i własnym kontem root, więc administratorem jest użytkownik. VPS oparty na kontenerach znajduje się pomiędzy tymi rozwiązaniami, ponieważ współdzieli jądro hosta, jednocześnie zapewniając uprawnienia root wewnątrz własnego środowiska.