Virtual Machine

“Any problem in computer science can be solved with another layer of indirection.” – David Wheeler

5 min
Nội dung bài viết
Bài viết này cũng có bản English.
banner

Hi các bạn 👋. Mình là Hùng Anh.

Đây là bài thứ ba trong series Kubernetes Fundamentals. Ở bài trước, mình và bạn đã tìm hiểu xong cấu trúc của 1 server vật lý và những giới hạn của nó. Ở cuối bài mình có đặt một câu hỏi "Liệu có cách nào để 1 phần cứng vật lý duy nhất chạy được nhiều OS khác nhau cùng lúc và tận dụng được phần tài nguyên đang rảnh không?"

Trong bài này hãy cùng mình xem Virtual Machine đã giải quyết bài toán đó như nào, và những nhược điểm của cách triển khai này nhé.

Bắt đầu thôi.

1. Virtual Machine là gì

vm-overview

Virtual Machine (VM) là 1 máy tính được giả lập hoàn toàn bằng phần mềm — có OS và kernel riêng, hoạt động độc lập, không biết gì về các VM khác đang chạy chung trên cùng 1 máy vật lý.

Virtual Machine đã giả lập nguyên cả 1 bộ phần cứng ảo để 1 hệ điều hành hoàn chỉnh chạy lên trên đó — y như đang chạy trên máy thật.

2. Virtual Machine hoạt động như thế nào?

Một máy thật có thể có nhiều VM, mỗi VM có 1 OS riêng và các VM phải chia nhau đúng 1 phần cứng vật lý bên dưới. Phần mềm đứng giữa phần cứng và các VM để chia tài nguyên vật lý cho từng VM, sau đó cách ly chúng với nhau gọi là hypervisor.

Hypervisor có 2 loại, tuỳ vào việc bên dưới nó có sẵn 1 hệ điều hành nền hay không — và đường đi của 1 request từ ứng dụng xuống phần cứng thật cũng khác nhau giữa 2 loại này.

2.1. Bare-metal hypervisor

vm-hypervisor-baremetal

Bare-metal hypervisor là loại hypervisor cài thẳng lên phần cứng, không cần thông qua 1 OS host nào, bản thân nó cũng gần như đóng luôn vai trò kernel của chính máy vật lý đó (ví dụ: VMware ESXi, Xen) và thường được sử dụng trong datacenter.

Ứng dụng cài trong VM gọi syscall tới kernel của chính VM đó, kernel VM gọi xuống hypervisor, và hypervisor sẽ trực tiếp "dịch" yêu cầu đó xuống để thao tác với phần cứng thật.

2.2. Hosted hypervisor

vm-hypervisor-hosted

Hosted hypervisor là loại hypervisor cài như 1 phần mềm bình thường, chạy trên 1 OS có sẵn (host OS) thay vì đụng trực tiếp vào phần cứng. Ví dụ: VirtualBox, VMware Workstation, và thường dùng cho dev/test hoặc làm lab thử nghiệm.

Ở đây hypervisor thực chất chỉ là 1 application bình thường, tự nó không có quyền thao tác với các thành phần phần cứng thật mà sẽ phải đi qua kernel của máy host như bao ứng dụng khác.

Dù đi theo đường nào, VM cũng chỉ dùng chung đúng phần cứng vật lý với máy thật (thông qua hypervisor) — còn OS và kernel thì mỗi VM sẽ có một bản riêng hoàn toàn.

WSL2 thực chất cũng chạy trên một VM

WSL2 (Windows Subsystem for Linux) chạy 1 Linux kernel thật bên trong 1 VM nhẹ ẩn phía sau, giúp bạn chạy được Linux ngay trên hệ điều hành Windows.

3. VM đã giải quyết bài toán ở bài trước như nào

Bài toán: 1 server vật lý chỉ chạy được đúng 1 kernel, 1 bộ phần cứng, 1 môi trường duy nhất tại 1 thời điểm. Liệu có cách nào để 1 phần cứng vật lý duy nhất chạy được nhiều OS khác nhau cùng lúc và tận dụng được phần tài nguyên đang rảnh không?

Trả lời: Nhờ hypervisor, giờ 1 máy vật lý duy nhất có thể chạy được nhiều hệ điều hành hoàn toàn độc lập cùng lúc — VM này cần Ubuntu, VM kia cần CentOS, đều chạy chung được trên đúng 1 phần cứng, không cần mua thêm máy mới. Phần tài nguyên vốn rảnh rỗi trước đây giờ được chia sẻ cho nhiều VM khác nhau thay vì lãng phí.

4. Nhược điểm của Virtual Machine

  • Nặng. Mỗi VM cõng theo cả 1 OS + kernel đầy đủ, thường tốn vài GB cho mỗi VM — dù ứng dụng bên trong có nhỏ tới đâu.
  • Khởi động chậm. Mỗi lần bật 1 VM là phải boot nguyên 1 hệ điều hành mới, y như bật 1 máy tính thật — mất từ vài chục giây tới vài phút.
  • Tốn tài nguyên chỉ để tồn tại. Trước khi ứng dụng của bạn chạy được dòng code đầu tiên, VM đã tiêu tốn 1 phần tài nguyên CPU/RAM chỉ để chạy OS của nó.

5. Tổng kết

Virtual Machine giải quyết đúng bài toán "1 máy, 1 môi trường" bằng cách giả lập nguyên cả 1 bộ phần cứng cho từng OS riêng và được quản lý bởi hypervisor. Nhưng cái giá phải trả là mỗi VM đều nặng, khởi động chậm, và tốn tài nguyên chỉ để duy trì chính OS của nó.

Trong thực tế, phần lớn các server đều dùng Linux kernel. Vậy nên việc mỗi VM đều phải chứa riêng hẳn 1 bản kernel đầy đủ có phần hơi thừa. Container đã ra đời và giải quyết đúng bài toán này. Đó cũng sẽ là chủ đề mình và bạn sẽ cùng thảo luận ở bài tiếp theo.

Giờ thì tạm biệt và hẹn gặp lại nhé.

Happy reading! 🍵

Tài liệu tham khảo

  1. What's the difference between Type 1 vs. Type 2 hypervisor? - TechTarget
  2. What is Windows Subsystem for Linux - Microsoft Learn

Bài viết liên quan

Đừng bỏ lỡ bài mới nhé!