Virtualization Overview¶
Trang tổng quan về các kỹ thuật ảo hóa: máy ảo (hypervisor), container và các mô hình lai giữa hai loại này, kèm góc nhìn cho hệ thống nhúng. Chi tiết từng công nghệ nằm ở các trang con, xem mục "Bản đồ tài liệu" ở cuối trang.
Virtualization là gì¶
Virtualization (ảo hóa) là kỹ thuật thêm một lớp trừu tượng giữa tài nguyên (CPU, RAM, thiết bị, hệ điều hành) và thứ sử dụng nó, để nhiều môi trường độc lập có thể chia sẻ cùng một tài nguyên thật. Lợi ích chính:
- Cô lập: lỗi hoặc sự cố ở một môi trường không lan sang môi trường khác.
- Tận dụng phần cứng: nhiều workload chạy trên một máy thay vì mỗi workload một máy.
- Tái lập môi trường: cùng một image/VM chạy giống nhau trên nhiều máy, phù hợp CI và môi trường build.
- Di chuyển và sao lưu: snapshot, clone, migrate workload dễ hơn so với máy thật.
Các mức ảo hóa¶
| Mức | Cái được ảo hóa | Công nghệ tiêu biểu |
|---|---|---|
| Phần cứng (máy ảo) | Cả máy: CPU, RAM, thiết bị. Mỗi VM chạy một OS đầy đủ | KVM, Xen, Hyper-V, ESXi, VirtualBox |
| Hệ điều hành (container) | Không gian tiến trình, mạng, filesystem trên cùng một kernel | Docker, Podman, LXC |
| Runtime / ngôn ngữ | Môi trường thực thi mã | JVM, WebAssembly |
Cần phân biệt ảo hóa với giả lập (emulation). Ảo hóa chạy mã guest trực tiếp trên CPU thật (có hỗ trợ phần cứng), còn giả lập dịch từng lệnh của một kiến trúc khác nên chậm hơn. Ví dụ QEMU ở chế độ TCG là giả lập (chạy ARM trên x86), còn QEMU kết hợp KVM là ảo hóa (chạy x86 trên x86, ARM trên ARM) với tốc độ gần native.
Hypervisor và máy ảo¶
Hypervisor (VMM) là phần mềm tạo và quản lý máy ảo, quyết định VM nhìn thấy CPU, RAM và thiết bị nào.
- Type 1 (bare-metal) chạy trực tiếp trên phần cứng; Type 2 (hosted) chạy như ứng dụng trên OS có sẵn. Ranh giới mờ với KVM và Hyper-V, xem Các loại hypervisor.
- Kỹ thuật ảo hóa CPU: full virtualization, para-virtualization (guest biết mình đang được ảo hóa và gọi hypercall hoặc dùng virtio), và hardware-assisted. Hardware-assisted là mặc định hiện nay, dựa trên Intel VT-x, AMD-V và trên ARM là exception level EL2.
- Thiết bị: giả lập thiết bị thật, dùng thiết bị para-virtual (virtio, VMBus), hoặc passthrough thiết bị vật lý vào VM (VFIO, SR-IOV).
Chi tiết xem nhóm Nền tảng (CPU, memory, I/O) và Hypervisor & Hyper-V, KVM & QEMU.
Containerization¶
Container là tiến trình (hoặc nhóm tiến trình) được cô lập, dùng chung kernel với host. Container không phải một loại máy ảo thu nhỏ mà là các tính năng cô lập của kernel Linux được đóng gói lại:
| Cơ chế | Vai trò |
|---|---|
| Namespace (pid, net, mnt, uts, ipc, user, cgroup) | Mỗi container có "view" riêng về process, mạng, mount, hostname, user |
| cgroups | Giới hạn và tính tài nguyên: CPU, RAM, I/O, số process |
| Capabilities | Chia nhỏ quyền root thành từng quyền riêng, cho phép bỏ bớt quyền không cần |
| seccomp, LSM (AppArmor, SELinux) | Lọc syscall và áp dụng chính sách truy cập |
| Union filesystem (overlayfs) | Xếp chồng các layer của image, thêm một lớp ghi cho mỗi container |
Hệ sinh thái được chuẩn hóa bởi OCI (Open Container Initiative) với image spec và runtime spec. Các thành phần thường gặp:
- Container runtime cấp thấp:
runc(tạo container theo OCI runtime spec). - Container runtime cấp cao:
containerd, CRI-O (quản lý image, vòng đời container). - Công cụ cho người dùng: Docker Engine, Podman.
- Orchestration: Kubernetes, Docker Compose cho các hệ thống nhiều container.
Chi tiết từng cơ chế xem Container Internals, công cụ xem Docker.
So sánh VM và container¶
| Tiêu chí | Máy ảo | Container |
|---|---|---|
| Kernel | Mỗi VM một kernel riêng | Dùng chung kernel host |
| Hệ điều hành guest | Bất kỳ OS nào hỗ trợ kiến trúc đó | Phải tương thích kernel host (container Linux cần kernel Linux) |
| Độ cô lập | Mạnh, ở mức phần cứng ảo | Yếu hơn, kernel là bề mặt tấn công chung |
| Khởi động | Giây đến phút | Mili giây đến giây |
| Kích thước | GB (cả OS) | MB đến vài trăm MB (chỉ ứng dụng và thư viện) |
| Overhead | Cao hơn (kernel guest, giả lập thiết bị) | Gần native |
| Dùng phù hợp | Cần OS/kernel khác, cô lập mạnh, multi-tenant | Đóng gói ứng dụng, môi trường build, CI, microservice |
Hai loại này thường được kết hợp: container chạy bên trong VM trên cloud, hoặc dùng VM để tăng cô lập cho container.
Mô hình lai: container trong micro-VM¶
Để kết hợp tốc độ của container với độ cô lập của VM, một số dự án chạy mỗi container (hoặc pod) trong một VM rất nhẹ:
- Kata Containers: tuân theo OCI, mỗi pod chạy trong một VM nhẹ với kernel riêng.
- Firecracker: VMM tối giản dựa trên KVM, khởi động micro-VM trong thời gian rất ngắn, dùng cho serverless.
- gVisor: không dùng VM mà chặn syscall của container bằng một kernel chạy ở user space.
Ảo hóa trong hệ thống nhúng¶
Với embedded Linux, ảo hóa xuất hiện ở hai hướng khác nhau:
Hypervisor trên SoC
- Mục tiêu thường là mixed-criticality: chạy Linux (giao diện, mạng, ứng dụng) cạnh RTOS hoặc firmware thời gian thực (điều khiển, an toàn) trên cùng SoC, với cô lập rõ giữa hai bên.
- Kiến trúc ARM có exception level EL2 dành cho hypervisor, bên dưới là EL3 (secure monitor) và TrustZone. Tham khảo thêm bài Secure boot & TrustZone ở mục Embedded Security.
- Một số giải pháp: Xen on ARM, KVM trên ARM, Jailhouse (partitioning hypervisor: chia cứng CPU, RAM, thiết bị cho từng "cell" thay vì lập lịch chia sẻ), ACRN, Hyper-V với Linux làm root partition (mshv).
Container cho phát triển và triển khai
- Đóng gói toolchain và môi trường build (Petalinux, Yocto) để mọi máy và CI dùng cùng một môi trường, xem Docker cho môi trường build.
- Triển khai ứng dụng lên thiết bị bằng container, kết hợp OTA update. Phù hợp thiết bị có đủ RAM, storage và kernel có hỗ trợ namespace, cgroups, overlayfs.
- Chạy image kiến trúc khác trên máy dev bằng QEMU user-mode (binfmt_misc, xem QEMU cross-arch) để build hoặc thử nghiệm cho ARM trên máy x86.
Chọn công nghệ nào¶
| Nhu cầu | Gợi ý |
|---|---|
| Cần kernel hoặc OS khác với host | Máy ảo |
| Cần cô lập mạnh giữa các bên không tin nhau | Máy ảo hoặc micro-VM (Kata, Firecracker) |
| Môi trường build lặp lại được, CI | Container |
| Đóng gói và triển khai ứng dụng nhanh, nhẹ | Container |
| VM có yêu cầu độ trễ thấp (real-time, vRAN trên server x86) | KVM tuning real-time và vRAN trên VM: pin vCPU, huge page 1G, SR-IOV VF, DPDK |
| Chia cứng tài nguyên SoC cho Linux và RTOS, có yêu cầu real-time | Partitioning hypervisor (Jailhouse, Xen, ...) |
| Thử nghiệm phần mềm cho kiến trúc khác trên máy dev | Giả lập (QEMU) |
Bản đồ tài liệu¶
Nền tảng
- CPU Virtualization: trap-and-emulate, VT-x/AMD-V/EL2, VM exit.
- Memory Virtualization: EPT/Stage-2, ballooning, IOMMU.
- I/O Virtualization: emulation, virtio, VFIO, SR-IOV, ngắt.
Hypervisor
- Hypervisor & Hyper-V: phân loại hypervisor, kiến trúc Hyper-V, Linux làm root partition (mshv).
- KVM & QEMU: vai trò KVM và QEMU,
/dev/kvm, ví dụ x86 và ARM64. - Partitioning hypervisor: Jailhouse, Xen, mixed-criticality trên SoC.
Container
- Container Internals: namespace, cgroups, capabilities, overlayfs, OCI.
- Docker: chạy container, quản lý image/container, volume, Docker Hub.
- Docker Compose: hệ nhiều container.
Sandbox & micro-VM
- Sandbox & micro-VM: Kata, Firecracker, gVisor.
Real-time & vRAN
- Real-time KVM tuning: isolcpus/nohz_full, pin vCPU và emulator thread, huge page 1G, NUMA, đo
cyclictesttrong guest. - vRAN trên VM: SR-IOV VF cho fronthaul, DPDK trong guest, PTP qua VF, checklist triển khai.
Ứng dụng cho embedded
- Docker cho môi trường build: Dockerfile mẫu, lưu ý Yocto/Petalinux.
- QEMU cross-arch: qemu-user, binfmt_misc, container và buildx đa kiến trúc.