Qemu, KQemu và KVM là những cái tên thường được nhắc đến trong lĩnh vực ảo hóa. Tuy nhiên, sự khác biệt giữa chúng và vai trò của từng công nghệ có thể gây nhầm lẫn. Bài viết này sẽ giúp bạn hiểu rõ hơn về từng công nghệ và cách chúng phối hợp với nhau.
Qemu:
Qemu là một trình giả lập máy tính mạnh mẽ và độc lập. Nó cho phép bạn mô phỏng một hệ thống máy tính hoàn chỉnh, bao gồm cả phần cứng và phần mềm. Tính linh hoạt và khả năng di động cao là những ưu điểm nổi bật của Qemu.
Cơ chế hoạt động chính của Qemu là “biên dịch lại động” (dynamic recompilation). Qemu chuyển đổi mã nhị phân được viết cho một kiến trúc bộ xử lý (ví dụ: MIPS, ARM) sang một kiến trúc khác (ví dụ: x86). Nhờ đó, bạn có thể chạy các chương trình được thiết kế cho một hệ thống trên một hệ thống hoàn toàn khác.
Ngoài việc mô phỏng bộ xử lý, Qemu còn bao gồm một loạt các trình giả lập thiết bị ngoại vi như ổ đĩa, card mạng, VGA, PCI, USB và các cổng nối tiếp/song song. Điều này tạo ra một môi trường ảo hoàn chỉnh, cho phép bạn chạy các hệ điều hành khách và ứng dụng của chúng một cách độc lập.
Qemu hoạt động bằng cách mô phỏng toàn bộ hệ thống, bao gồm cả phần cứng. Điều này cho phép nó chạy các hệ điều hành và ứng dụng khác nhau trên một máy chủ duy nhất.
KQemu:
KQemu là một module hạt nhân Linux được thiết kế để tăng tốc độ mô phỏng trên kiến trúc x86. Khi cả hệ điều hành gốc và hệ điều hành khách đều chạy trên kiến trúc x86, Qemu vẫn cần phân tích mã để loại bỏ các “hướng dẫn đặc quyền” (privileged instructions) và thay thế chúng bằng các chuyển đổi ngữ cảnh. KQemu giúp tối ưu hóa quá trình này.
Là một module hạt nhân, KQemu có thể thực thi trực tiếp phần lớn mã của hệ điều hành khách mà không cần sửa đổi, chỉ can thiệp vào các lệnh ring0 (lệnh cấp thấp nhất, thường được sử dụng bởi kernel). Qemu trong không gian người dùng (userspace) vẫn chịu trách nhiệm phân bổ bộ nhớ RAM cho máy ảo và tải mã. Tuy nhiên, thay vì biên dịch lại mã, nó gọi KQemu để quét, vá và thực thi. Toàn bộ quá trình mô phỏng phần cứng ngoại vi vẫn do Qemu đảm nhiệm.
KQemu giúp tăng tốc độ mô phỏng bằng cách thực thi trực tiếp phần lớn mã của hệ điều hành khách.
Mặc dù nhanh hơn Qemu thông thường, KQemu vẫn phải xử lý các lệnh ring0 (phần lớn mã trong kernel của máy ảo), do đó hiệu năng vẫn có thể bị ảnh hưởng. Tuy nhiên, KQemu đã từng là một giải pháp tăng tốc hiệu quả trước khi KVM ra đời.
KVM (Kernel-based Virtual Machine):
KVM là một giải pháp ảo hóa dựa trên kernel của Linux, tích hợp trực tiếp vào nhân hệ điều hành. KVM cho phép bộ xử lý chuyển sang trạng thái “khách” (guest mode), một chế độ thực thi mới. Trong trạng thái này, các lệnh ring0 đặc quyền sẽ được chuyển đến hypervisor (lớp phần mềm ảo hóa).
KVM không chỉ chuyển đổi trạng thái bộ xử lý mà còn xử lý một số phần mô phỏng cấp thấp, chẳng hạn như các thanh ghi MMU (Memory Management Unit) và một phần của phần cứng PCI được ảo hóa.
KVM hoạt động bằng cách tận dụng các tính năng ảo hóa phần cứng của bộ xử lý hiện đại. Điều này cho phép nó đạt được hiệu suất gần như gốc.
Về mặt phần mềm, KVM thường được sử dụng kết hợp với Qemu. KVM cung cấp khả năng ảo hóa bộ xử lý và bộ nhớ, trong khi Qemu đảm nhiệm việc mô phỏng các thiết bị ngoại vi. Sự kết hợp này tạo ra một giải pháp ảo hóa hoàn chỉnh và hiệu quả.
Thực thi kvm-qemu hoạt động tương tự như Qemu thông thường: phân bổ RAM, tải mã. Thay vì biên dịch lại hoặc gọi KQemu, nó tạo ra một luồng (thread). Luồng này gọi module hạt nhân KVM để chuyển sang chế độ khách và tiến hành thực thi mã của máy ảo (VM). Khi gặp một lệnh đặc quyền, luồng sẽ chuyển lại cho module hạt nhân KVM, module này sẽ báo hiệu cho luồng Qemu để xử lý việc mô phỏng phần cứng.
Một ưu điểm quan trọng của kiến trúc này là mã khách được mô phỏng trong một chuỗi POSIX (Portable Operating System Interface), cho phép bạn quản lý nó bằng các công cụ Linux tiêu chuẩn. Nếu bạn muốn một máy ảo có 2 hoặc 4 lõi, kvm-qemu sẽ tạo ra 2 hoặc 4 luồng, mỗi luồng gọi module hạt nhân KVM để bắt đầu thực thi. Bộ xử lý sẽ thực hiện đồng thời nếu bạn có đủ số lõi thực tế hoặc lên lịch nếu không, nhờ cơ chế lập lịch của Linux, giúp mã nhỏ gọn và giảm thiểu các vấn đề phát sinh.
Tóm lại:
- Qemu: Trình giả lập máy tính hoàn chỉnh, có khả năng mô phỏng nhiều kiến trúc phần cứng khác nhau.
- KQemu: Module hạt nhân Linux (đã lỗi thời), giúp tăng tốc độ mô phỏng trên kiến trúc x86 bằng cách thực thi trực tiếp phần lớn mã của hệ điều hành khách.
- KVM: Giải pháp ảo hóa dựa trên kernel của Linux, cho phép bộ xử lý chuyển sang trạng thái “khách” và tận dụng các tính năng ảo hóa phần cứng.
KVM thường được sử dụng kết hợp với Qemu để tạo ra một giải pháp ảo hóa hoàn chỉnh và hiệu quả. KVM cung cấp khả năng ảo hóa bộ xử lý và bộ nhớ, trong khi Qemu đảm nhiệm việc mô phỏng các thiết bị ngoại vi.
