Skip to content

I/O Virtualization

Có ba cách đưa thiết bị cho VM, đánh đổi giữa tính tương thích, hiệu năng và khả năng chia sẻ.

Cách Ý tưởng Ưu Nhược
Emulation Hypervisor giả lập một thiết bị thật có sẵn (ví dụ card mạng e1000, đĩa IDE) Guest dùng driver có sẵn, không cần sửa Nhiều VM exit nên chậm
Para-virtual Guest dùng driver riêng biết mình đang chạy trên hypervisor, giao tiếp qua giao diện đơn giản, hiệu quả (virtio, VMBus) Nhanh, ít exit Cần driver trong guest
Passthrough Gán thẳng thiết bị vật lý cho VM (VFIO, SR-IOV) Gần native Cần IOMMU, thiết bị bị gắn với VM, khó di chuyển VM

virtio

virtio là chuẩn thiết bị para-virtual mở, được dùng rộng rãi (KVM/QEMU, Firecracker, Cloud Hypervisor...). Mô hình gồm:

  • Front-end: driver trong guest (virtio-net, virtio-blk, virtio-scsi, virtio-console, vsock, virtio-fs...).
  • Back-end: phần phục vụ ở hypervisor/VMM, hoặc ở tiến trình riêng (vhost-user).
  • Virtqueue: các vòng đệm (vring) nằm trong bộ nhớ chia sẻ giữa guest và back-end, guest đẩy buffer vào và "kick" để báo back-end, back-end trả kết quả và gửi ngắt.
  • Transport: cách thiết bị được khám phá và cấu hình, gồm virtio-pci (phổ biến trên PC/server) và virtio-mmio (hay dùng cho board ARM/RISC-V không có PCI, như máy virt của QEMU).

Tối ưu thêm: vhost đưa back-end vào kernel (hoặc tiến trình khác với vhost-user) để bỏ bớt chuyển ngữ cảnh qua VMM.

Các hệ khác có thiết bị para-virtual tương đương: VMBus + synthetic device trên Hyper-V, split driver (netfront/netback) trên Xen.

Passthrough: VFIO và SR-IOV

  • VFIO là framework của Linux cho phép tiến trình userspace (QEMU) điều khiển thiết bị trực tiếp một cách an toàn nhờ IOMMU, thiết bị được gán nguyên vẹn cho một VM.
  • SR-IOV cho một thiết bị PCIe tự chia thành nhiều VF (virtual function) cạnh một PF (physical function). Mỗi VF có thể gán cho một VM bằng VFIO, nên một card mạng phục vụ được nhiều VM mà vẫn gần native.

Passthrough bắt buộc phải có IOMMU đúng cấu hình và nhóm IOMMU (IOMMU group) phù hợp, xem Memory Virtualization.

Ví dụ dùng SR-IOV VF cho workload nhạy độ trễ (fronthaul của vRAN, DPDK trong guest, PTP) xem vRAN trên VM.

Ngắt

Ngắt cũng cần được ảo hóa: guest cần một bộ điều khiển ngắt ảo (vAPIC, vGIC). Phần cứng hiện đại hỗ trợ đưa ngắt thẳng vào guest không qua hypervisor (APIC virtualization/posted interrupts trên x86, GICv4 direct injection trên ARM), giúp giảm VM exit đáng kể (xem CPU Virtualization).

Trong hệ nhúng

  • Board ARM/RISC-V thường dùng virtio-mmio với QEMU, xem KVM & QEMU.
  • Với partitioning hypervisor, thiết bị thường được gán cứng cho một cell/VM (kiểu passthrough) vì SoC ít khi có SR-IOV, xem Partitioning hypervisor.