Nhanh như ổ cứng thật: Cấu hình Shared Folder KVM với virtiofs

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

Tại sao virtiofs lại là ‘chân ái’ cho máy ảo KVM?

Dùng KVM lâu ngày, chắc chắn anh em sẽ gặp một nỗi đau: Làm sao để ném dữ liệu từ host vào máy ảo nhanh nhất? Trước đây, giải pháp quốc dân thường là 9p (Plan 9). Tuy nhiên, tốc độ của 9p rất tệ. Khi mình test với thư mục chứa 10.000 file source code, 9p mất gần 2 phút để index, trong khi virtiofs chỉ tốn chưa đầy 5 giây.

Sau nhiều lần benchmark trên dàn homelab Proxmox, mình khẳng định virtiofs là lựa chọn số một. Nó không giả lập giao thức mạng phức tạp. Thay vào đó, nó dùng chung bộ nhớ (shared memory) để máy ảo truy cập trực tiếp vào hệ thống tệp của host. Hiệu suất thực tế có thể đạt tới 90-95% so với ổ cứng vật lý, vượt xa mức 30-40% của NFS hay 9p.

Chuẩn bị ‘đồ nghề’ trước khi bắt đầu

Virtiofs yêu cầu Host và Guest phải hiểu ý nhau. Để chạy mượt, anh em cần kiểm tra các thông số sau:

  • Host OS: Kernel 5.4 trở lên. Ubuntu 20.04 hoặc Debian 11 đều dùng tốt.
  • QEMU: Phiên bản 4.2 trở lên là bắt buộc.
  • Guest OS: Linux Kernel 5.4+ hoặc cài thêm driver nếu dùng Windows.
  • virtiofsd: Daemon xử lý I/O. Trên Ubuntu, hãy cài gói qemu-system-common.

Các bước cấu hình chi tiết

Bước 1: Cấu hình bộ nhớ dùng chung (Shared Memory)

Đây là bước then chốt. Virtiofs yêu cầu máy ảo phải có bộ nhớ được đánh dấu là “shared” để host và guest cùng truy cập được.

Mở file cấu hình XML của máy ảo:

virsh edit <ten_may_ao>

Thêm đoạn mã sau vào ngay dưới thẻ <domain>:

<memoryBacking>
  <source type='memfd'/>
  <access mode='shared'/>
</memoryBacking>

Nếu anh em đang dùng Hugepages để tối ưu RAM, cấu hình sẽ khác đôi chút. Nhưng với đa số nhu cầu, memfd là lựa chọn ổn định nhất.

Bước 2: Thêm thiết bị Filesystem vào máy ảo

Vẫn trong file XML, tìm thẻ <devices>. Hãy khai báo thư mục muốn chia sẻ tại đây:

<filesystem type='mount' accessmode='passthrough'>
  <driver type='virtiofs'/>
  <source dir='/path/to/host/folder'/>
  <target dir='my_shared_tag'/>
</filesystem>

Lưu ý các thông số:

  • source dir: Đường dẫn tuyệt đối trên máy Host.
  • target dir: Một cái “nhãn” (tag) để gọi khi mount. Hãy đặt tên ngắn gọn, không chứa dấu cách.
  • accessmode='passthrough': Giữ nguyên quyền sở hữu file (UID/GID) từ host sang guest.

Bước 3: Mount thư mục trên máy ảo Guest

Lưu XML và khởi động lại máy ảo. Bây giờ, hãy đăng nhập vào Guest để gắn đĩa.

Tạo thư mục đích:

sudo mkdir -p /mnt/shared_data

Thực hiện lệnh mount:

sudo mount -t virtiofs my_shared_tag /mnt/shared_data

Để máy tự động mount khi reboot, hãy thêm dòng này vào cuối file /etc/fstab:

my_shared_tag  /mnt/shared_data  virtiofs  defaults  0  0

Fix lỗi phân quyền – Nỗi ám ảnh kinh điển

“Thấy file nhưng không ghi được” là lỗi 90% anh em sẽ gặp. Nguyên nhân là do User ID (UID) trên Host và Guest không khớp nhau.

Nếu dùng cho môi trường dev, cách nhanh nhất là set quyền 777 cho thư mục nguồn. Tuy nhiên, cách này không an toàn cho production. Phương pháp chuyên nghiệp hơn là kiểm tra user chạy tiến trình QEMU bằng lệnh ps aux | grep qemu. Thông thường là user libvirt-qemu. Hãy đảm bảo user này có quyền đọc/ghi vào thư mục gốc trên Host.

Kinh nghiệm thực chiến từ Lab

Sau 6 tháng chạy virtiofs cho dàn 12 VM, mình rút ra 3 lưu ý quan trọng:

  1. Tránh dùng cho Database nặng: Dù nhanh, virtiofs vẫn có độ trễ I/O cao hơn ổ cứng ảo chuẩn (qcow2). Với MySQL hay Postgres, hãy ưu tiên ổ đĩa ảo để đảm bảo tính toàn vẹn dữ liệu.
  2. AppArmor/SELinux: Nếu VM không khởi động được, hãy kiểm tra log. Thường do AppArmor chặn QEMU truy cập thư mục ngoài. Bạn cần khai báo thư mục source trong /etc/apparmor.d/abstractions/libvirt-qemu.
  3. Xử lý file nhỏ: Virtiofs cực kỳ bá đạo khi xử lý node_modules hay vendor. Tốc độ thực thi lệnh npm install nhanh gấp 5 lần so với dùng NFS.

Chốt lại

Virtiofs xóa bỏ rào cản về tốc độ giữa Host và Guest. Cấu hình không quá khó nhưng hiệu quả mang lại rất đáng kể cho workflow. Nếu bạn vẫn đang vật lộn với Samba hay NFS, hãy chuyển sang virtiofs ngay hôm nay.

Chúc anh em thực hiện thành công. Nếu kẹt ở bước phân quyền hay AppArmor, cứ để lại comment bên dưới mình sẽ hỗ trợ!

Share: