Lịch sử VPS: từ mainframe đến cloud
VPS của bạn kế thừa time-sharing từ thập niên 1960. Tìm hiểu mạch phát triển qua CTSS, Multics, Unix, IBM VM/370, Xen và KVM, cùng những gì không đổi.
VPS của bạn xuất phát từ đâu
Lịch sử máy tính từ mainframe đến cloud là lịch sử của một ý tưởng ngày càng rẻ hơn. Ý tưởng đó là time-sharing: cho nhiều người cùng sử dụng một máy đắt tiền, đồng thời cung cấp cho mỗi người một góc nhìn riêng trên máy đó. Time-sharing được phát minh khoảng năm 1960 vì một máy tính có giá cao hơn khả năng chi trả của những người sử dụng nó. Mọi thành phần của VPS bạn thuê ngày nay đều được xây dựng để giải quyết vấn đề đó: cơ chế cô lập giữa các user, scheduler phân bổ thời gian CPU, hypervisor và hóa đơn tính theo số giờ. Vấn đề này chưa bao giờ biến mất. Phần cứng trở nên rẻ hơn, nên một phần tài nguyên trước đây cần đến khoản tài trợ nghiên cứu giờ chỉ còn có giá vài dollar mỗi tháng.
1959 đến 1961: vì sao time-sharing được phát minh
Một máy tính trong thập niên 1950 chạy theo chế độ batch. Bạn đục chương trình lên các thẻ đục lỗ, giao cả bộ thẻ cho operator rồi quay lại sau để lấy bản in. Chỉ một ký tự gõ sai cũng khiến bạn mất cả ngày. Máy luôn bận, và đó mới là mục tiêu, vì một máy như IBM 7090 có giá hàng triệu đô la còn thời gian của những người chờ máy không xuất hiện trên bất kỳ hóa đơn nào.
Tháng 1 năm 1959, John McCarthy trình bày quan điểm ngược lại trong một bản ghi nhớ tại MIT. Máy phải chờ người dùng. Christopher Strachey mô tả một dạng time-sharing tại một hội nghị UNESCO trong cùng năm, dù ông muốn nói đến việc một programmer debug trong khi các job khác vẫn chạy, chứ không phải nhiều người cùng lúc gõ lệnh. Phát biểu tại lễ kỷ niệm 100 năm của MIT năm 1961, McCarthy tiến thêm một bước: computing có thể được cung cấp như một public utility và tính phí theo mức sử dụng như điện.
Khi đó, ý kiến phản đối là time-sharing làm lãng phí máy. Việc chuyển đổi giữa người dùng tốn các cycle, mà cycle là thứ đắt tiền. Ý kiến phản đối này là đúng, nhưng rồi không còn quan trọng, vì giá của một cycle giảm trong suốt 60 năm còn giá của một giờ tập trung của con người thì không.
CTSS đã phải phát minh những gì
Nhóm của Fernando Corbató tại Trung tâm Tính toán MIT đã xây dựng Compatible Time-Sharing System (CTSS) để giải quyết tranh luận này. Hệ thống được trình diễn lần đầu vào tháng 11 năm 1961 trên một máy IBM 709, phục vụ 4 người dùng và chuyển công việc của từng người dùng ra một ổ băng từ riêng. “Compatible” có nghĩa là máy vẫn có thể chạy hệ thống batch cũ bên dưới, vì không ai mua một máy tính chỉ làm được chức năng mới.
4 người dùng là một con số nhỏ. Nhưng danh sách các vấn đề phải giải quyết để đạt được con số đó thì không nhỏ, và cũng chính là danh sách mà kernel của bạn đang xử lý ngay lúc này. CTSS cần một scheduler để một job chạy lâu không thể làm treo mọi terminal khác. Hệ thống cần memory protection để một chương trình bị crash chỉ làm gián đoạn một người dùng thay vì toàn bộ hệ thống. Hệ thống cần storage vẫn tồn tại sau khi logout, đó là lý do CTSS có một trong những file system đầu tiên mà người dùng hiện đại có thể nhận ra. Hệ thống cũng cần password để một người dùng không thể đọc file của người dùng khác.
Đổi tên các thành phần đó, bạn sẽ có một máy Linux. Scheduler là EEVDF, đã thay thế CFS trong Linux 6.6. Memory protection là MMU (memory management unit), cấp cho mỗi process một virtual address space riêng. Storage vẫn tồn tại sau khi logout chính là home directory của bạn. File password vẫn được gọi là /etc/passwd.
Multics và tiện ích máy tính
Hệ thống tiếp theo của MIT được xây dựng để trở thành tiện ích mà McCarthy đã mô tả. Project MAC bắt đầu vào năm 1963, ký hợp đồng mua một máy General Electric GE-645 vào tháng 8 năm 1964 và công bố các tài liệu đầu tiên về Multics vào năm 1965. Tên gọi này thể hiện rõ ý tưởng đó: Multiplexed Information and Computing Service. “Service” ở đây có nghĩa là một dịch vụ mà bạn mua theo giờ.
Multics mất nhiều thời gian hơn dự kiến. Các máy GE-645 nguyên mẫu được đưa đến MIT và Bell Labs vào tháng 1 năm 1967. Bell Labs rút khỏi dự án vào tháng 4 năm 1969. Multics bắt đầu phục vụ khách hàng của MIT Information Processing Center vào ngày 1 tháng 10 năm 1969, rồi tiếp tục chạy trong môi trường production ở đâu đó trong 31 năm. Hệ thống Multics cuối cùng còn hoạt động, tại Department of National Defence của Canada ở Halifax, Nova Scotia, đã bị tắt vào ngày 30 tháng 10 năm 2000.
Multics thường bị xem là một thất bại vì ra mắt muộn và chạy chậm. Nhưng thuật ngữ của nó cho thấy điều ngược lại. Multics mang đến file system phân cấp với các directory lồng trong directory, access control list trên từng file, virtual memory phân đoạn cho phép chương trình truy cập một file như thể đó là memory, và các protection ring dùng để phân cấp code theo mức độ được tin cậy. Các ring vẫn nằm trong silicon trước mặt bạn. Ring 0 dành cho kernel và ring 3 dành cho user code là thuật ngữ của Multics. Sau này, hardware virtualisation bổ sung một mode bên dưới ring 0 dành cho hypervisor, thường được gọi không chính thức là ring -1.
Unix: chia sẻ thời gian trên một máy tính mà bạn có thể mua được
Việc rời Multics khiến Ken Thompson ở Bell Labs không còn một hệ thống phù hợp để sử dụng. Năm 1969, ông bắt đầu xây dựng một hệ thống nhỏ hơn nhiều trên một chiếc PDP-7 bị loại bỏ. Tài liệu Unix Programmer's Manual đầu tiên có ngày tháng 11 năm 1971. Khi đó, công việc đã chuyển sang PDP-11. Năm 1973, Thompson và Dennis Ritchie viết lại kernel bằng C, để hệ thống có thể chuyển sang phần cứng mới mà không phải viết lại thủ công.
Đó là lý do bạn gõ lệnh vào một hậu duệ của Unix, không phải một hậu duệ của Multics. Multics cần phần cứng được xây dựng riêng cho Multics. Unix chạy trên bất kỳ phần cứng nào rẻ và sẵn có. Cuối cùng, đó mới là đặc điểm quyết định.
Bài viết "The UNIX Time-Sharing System" của Ritchie và Thompson được đăng trên Communications of the ACM vào tháng 7 năm 1974. Bài viết mô tả VPS của bạn: các process, một file system phân cấp, file dưới dạng các luồng byte thuần, fork, user và group với các permission bit, cùng một shell là một chương trình thông thường thay vì một phần của kernel. Năm mươi hai năm sau, interface đó đã được mở rộng nhưng chưa bao giờ bị thay thế.
Mainframe thực sự đã chạy máy ảo vào năm 1972?
Có. Đây là phần mà hầu hết mọi người bỏ sót. Trong khi MIT xây dựng Multics, IBM Cambridge Scientific Center tiếp cận cùng mục tiêu từ hướng ngược lại. Thay vì để một hệ điều hành phục vụ nhiều người dùng, Robert Creasy và Les Comeau xây dựng một control program cung cấp cho mỗi người dùng một máy tính mô phỏng hoàn chỉnh. CP-40 được đưa vào vận hành tháng 1 năm 1967. Mỗi người dùng có một System/360 ảo và chạy một hệ điều hành single-user nhỏ, CMS, bên trong đó.
CP-40 trở thành CP-67 trên System/360-67 vào năm 1968, và IBM công bố VM/370 vào ngày 2 tháng 8 năm 1972. Đó là một hypervisor thương mại được bán cho khách hàng trả phí, cách đây năm mươi tư năm. Một control program multiplex phần cứng thực, còn các hệ điều hành guest chạy không sửa đổi bên trong những máy ảo và tin rằng chúng sở hữu máy tính.
Lý thuyết xuất hiện hai năm sau, trong cùng số tháng 7 năm 1974 của Communications of the ACM đăng bài viết về Unix. Bài viết “Formal Requirements for Virtualizable Third Generation Architectures” của Gerald Popek và Robert Goldberg nêu rõ một processor phải làm gì để có thể virtualize. Quy tắc cốt lõi rất ngắn gọn. Mọi instruction có thể đọc hoặc thay đổi trạng thái của máy phải trap khi guest thực thi instruction đó bên ngoài kernel mode, để hypervisor giành quyền kiểm soát và trả về phiên bản riêng của trạng thái dành cho guest đó. Cơ chế này được gọi là trap and emulate. Phần cứng của IBM tuân thủ quy tắc này.
Vì sao minicomputer phá vỡ mô hình
DEC giới thiệu PDP-8 vào ngày 22 tháng 3 năm 1965 với giá khoảng $18,000 theo giá trị đồng dollar năm 1965. Đây là minicomputer đầu tiên có giá dưới $20,000 và sau đó đã bán được hơn 50,000 máy. Microprocessor tiếp tục đẩy giá xuống. Khi một phòng ban có thể mua máy riêng, rồi sau đó mỗi cá nhân cũng có thể mua, việc dùng chung một máy tính trung tâm dường như đã trở thành một vấn đề được giải quyết và không còn cần giải quyết nữa. Trong suốt thập niên 1980 và 1990, hệ thống máy tính chuyển ra bàn làm việc và vào các rack chứa những server x86 nhỏ.
Sự lãng phí quay lại dưới một dạng khác. Mỗi server chạy một ứng dụng thì dễ hiểu và dễ quản lý, nhưng phần lớn hardware sẽ ở trạng thái idle trong khi vẫn phải trả đủ chi phí điện và chỗ trong rack. Đó lại là vấn đề CTSS, nhưng ở quy mô mới; tài nguyên đắt đỏ lúc này là không gian phòng và điện năng, thay vì processor. Câu trả lời vẫn là câu trả lời cũ: dùng chung máy.
Vì sao x86 khó ảo hóa đến vậy?
Vì x86 vi phạm quy tắc của Popek và Goldberg. Tại Hội nghị USENIX Security Symposium lần thứ 9 vào tháng 8 năm 2000, John Scott Robin và Cynthia Irvine đã phân tích tập lệnh Pentium và phát hiện 17 lệnh đọc hoặc thay đổi trạng thái đặc quyền nhưng không gây fault khi code chạy ở user mode. popf là ví dụ điển hình. Khi chạy lệnh này ở user mode, bộ xử lý âm thầm bỏ qua các bit mà chương trình không được phép đặt, thay vì trap. Vì vậy, hypervisor dùng cơ chế trap và emulate không biết guest đã thử thực hiện lệnh đó.
Có 2 cách xử lý trước khi phần cứng được sửa. VMware, được thành lập năm 1998 từ dự án nghiên cứu Disco của Stanford, kiểm tra code kernel của guest và viết lại các lệnh khó xử lý trước khi chúng chạy. Kỹ thuật này được gọi là binary translation. Xen, do Computer Laboratory thuộc University of Cambridge phát triển, thay đổi guest thay vì thay đổi cách xử lý lệnh. Bài báo "Xen and the Art of Virtualization", được trình bày tại SOSP vào tháng 10 năm 2003, mô tả paravirtualisation: kernel guest đã được sửa sẽ chủ động gọi hypervisor, thay vì chạy các lệnh mà hypervisor không thể intercept.
Sau đó phần cứng được sửa, tương tự cách IBM đã sửa vấn đề này vào thập niên 1960. Intel phát hành VT-x trên 2 mẫu Pentium 4 vào ngày 14 tháng 11 năm 2005, còn AMD phát hành AMD-V vào tháng 5 năm 2006. Cả 2 đều thêm một processor mode nằm bên dưới kernel của guest. Nhờ đó, guest chạy kernel riêng ở full speed, còn hypervisor vẫn kiểm soát các sự kiện mà nó cần kiểm soát. Điều này giúp hypervisor đủ nhỏ để chạy bên trong một operating system thông thường. KVM của Avi Kivity tại Qumranet đã làm đúng như vậy: biến chính Linux kernel thành hypervisor. KVM được tích hợp vào Linux 2.6.20, phát hành vào tháng 2 năm 2007, và hiện được nhiều VPS host sử dụng.
Cái tên VPS bắt nguồn từ đâu
Hai dòng công nghệ hội tụ vào đầu những năm 2000. Một dòng là máy ảo đầy đủ trên x86, với guest tự boot kernel riêng. Dòng còn lại là ảo hóa ở cấp hệ điều hành: một Linux kernel dùng chung được tách thành các environment riêng biệt, mỗi environment có root user và process table riêng. Linux-VServer và Virtuozzo của SWsoft cùng xuất hiện vào năm 2001, sau đó SWsoft phát hành một phần Virtuozzo dưới dạng OpenVZ mã nguồn mở vào năm 2005. Cụm từ "virtual private server" xuất phát từ nhánh công nghệ này, được đặt tương tự như "virtual private network".
Amazon biến việc thuê tài nguyên thành một API call. S3 ra mắt vào ngày 14 March 2006, còn EC2 mở beta công khai có giới hạn vào ngày 25 August 2006 với một instance type duy nhất, chạy trên Xen. Việc mua compute không còn là hợp đồng với một đơn vị cung cấp dịch vụ, mà trở thành một request trả về kết quả trong một phút.
Cả hai dòng công nghệ vẫn tồn tại, và sự khác biệt này vẫn quyết định bạn có thể làm gì với server mình thuê. KVM VPS boot kernel riêng, nên bạn có thể load kernel module, thậm chí chạy một hypervisor bên trong VPS. Gói dựa trên container dùng chung kernel của host nên không làm được điều đó. Sáu mươi năm lịch sử nằm phía sau một dòng trên trang pricing. Vì vậy, bạn nên hiểu VPS, VM và VPC khác nhau thế nào trước khi chọn.
Từ mainframe đến VPS: điều gì đã thay đổi và điều gì không
Bốn điều đã thay đổi. Máy tính không còn nằm trong tòa nhà của bạn. Terminal là một chương trình thay vì một món đồ nội thất. Đơn vị bạn thuê là một máy tính hoàn chỉnh có kernel riêng, thay vì một account trên hệ điều hành của người khác. Và mức giá đã giảm đủ thấp để việc mua chỉ còn là thanh toán bằng thẻ, thay vì một quy trình mua sắm.
Cơ chế không thay đổi.
- Phiên SSH của bạn là một terminal time-sharing. Bạn có login và shell, còn scheduler quyết định khi nào process của bạn được chạy tiếp.
- Isolation vẫn được thực thi bằng phần cứng. MMU và các mức đặc quyền của processor đảm nhiệm việc đó, giống hệt như cách CP-40 cần chúng vào năm 1967.
- Bạn vẫn trả tiền cho một phần tài nguyên của máy theo thời gian đã trôi qua, giống như cách các service bureau từng tính phí theo số giờ kết nối.
- Bạn vẫn chịu ảnh hưởng của các tenant khác. Khi một host bị oversubscribe, guest của bạn phải chờ CPU vật lý, và Linux báo thời gian chờ đó là CPU steal time do một tenant khác sử dụng quá mức.
Điểm cuối cùng này là tóm tắt chính xác nhất của toàn bộ lịch sử. Chia sẻ một máy là một sự đánh đổi. Mô hình này được chấp nhận vào năm 1961 vì máy tính đắt hơn con người, và được chấp nhận vào năm 2026 vì một server chỉ chạy ở mười phần trăm công suất là tiền bị lãng phí. Nếu bạn muốn đứng ở phía operator trong sự đánh đổi đó, chạy Proxmox trên phần cứng do bạn sở hữu sẽ giao cho bạn cả hypervisor lẫn các vấn đề của operator.
Hãy ghi nhớ tỷ lệ này. CTSS phục vụ bốn người dùng trên một máy có giá hàng triệu dollar theo thời giá năm 1961 và chiếm cả một căn phòng. VPS của bạn, với giá vài dollar mỗi tháng trong năm 2026, là một máy tính tốt hơn nhiều so với chiếc máy mà nhóm của Corbató phải phân bổ tài nguyên, và bạn có thể sử dụng riêng nó. Bạn có thể thuê được máy này nhờ một ý tưởng đã 65 năm tuổi cuối cùng gặp được phần cứng giá rẻ. Nếu đang xác định nên cài gì trên đó, hãy bắt đầu với VPS thực sự cung cấp cho bạn những gì rồi xem tiếp mọi người thường chạy gì trên VPS.
FAQ
Hệ thống time-sharing đầu tiên là gì?
CTSS, Compatible Time-Sharing System, do nhóm của Fernando Corbató tại MIT Computation Center xây dựng. Hệ thống được trình diễn lần đầu vào tháng 11 năm 1961 trên một máy IBM 709 và phục vụ 4 người dùng; mỗi người được swap ra một tape drive riêng. Dịch vụ time-sharing đầu tiên phục vụ cả một cộng đồng là Dartmouth Time-Sharing System: vào ngày 1 tháng 5 năm 1964, John Kemeny và một sinh viên lập trình chạy các chương trình BASIC cùng lúc trên 2 terminal và cả hai đều nhận được đáp án chính xác.
Máy ảo có thực sự được phát minh vào những năm 1960 không?
Có. Cambridge Scientific Center của IBM đưa CP-40 vào production vào tháng 1 năm 1967, cung cấp cho mỗi người dùng một System/360 ảo hoàn chỉnh với hệ điều hành CMS chạy bên trong. CP-67 ra mắt sau đó vào năm 1968 trên System/360-67, và IBM công bố VM/370 vào ngày 2 tháng 8 năm 1972. Đây là các hypervisor thực sự chạy các guest operating system không cần sửa đổi, được bán thương mại từ nhiều thập kỷ trước khi phần cứng x86 có thể làm điều tương tự.
Vì sao x86 khó virtualise trong khi mainframe thì không?
Quy tắc Popek và Goldberg năm 1974 nói rằng mọi instruction có thể đọc hoặc thay đổi trạng thái máy phải trap khi guest chạy instruction đó bên ngoài kernel mode. x86 vi phạm quy tắc này. Robin và Irvine đếm được 17 instruction trên Pentium sẽ âm thầm fail trong user mode thay vì trap, nên hypervisor kiểu trap-and-emulate không bao giờ nhìn thấy chúng; popf là ví dụ điển hình. VMware khắc phục bằng binary translation, còn Xen dùng paravirtualisation, cho đến khi Intel VT-x vào tháng 11 năm 2005 và AMD-V vào tháng 5 năm 2006 bổ sung hardware mode cho hypervisor.
Thuê VPS có giống với việc có một tài khoản time-sharing không?
Mô hình tính phí và bài toán isolation là giống nhau. Đơn vị sử dụng thì khác. Người dùng time-sharing có một account trên hệ điều hành được chia sẻ với tất cả người khác, nên administrator là người tại computer centre. KVM VPS cung cấp cho bạn một virtual machine với kernel riêng và root account riêng, nên administrator là bạn. VPS dựa trên container nằm ở giữa hai mô hình này vì nó dùng chung kernel của host, nhưng vẫn cung cấp cho bạn root bên trong environment riêng của mình.