Phá bỏ giới hạn ảo hóa
Ảo hóa một máy chủ web Linux cơ bản là một việc cực kỳ đơn giản. Tuy nhiên, mọi thứ sẽ thay đổi khi bạn cố gắng chạy một dàn máy gaming Windows cấu hình cao hoặc một instance AI chuyên sâu về CUDA bên trong Proxmox. Các driver ảo hóa tiêu chuẩn như VirtIO rất tốt cho môi trường desktop 2D, nhưng chúng sẽ “hụt hơi” khi xử lý khung hình 144Hz trong Cyberpunk 2077 hoặc huấn luyện mô hình Llama-3 với 7 tỷ tham số. Bạn đơn giản là không thể lấp đầy khoảng cách đó bằng phần mềm giả lập.
GPU Passthrough chính là giải pháp. Kỹ thuật này cấp cho một máy ảo (VM) cụ thể quyền kiểm soát hoàn toàn card đồ họa PCIe vật lý của bạn. Hệ điều hành khách (guest OS) tương tác trực tiếp với phần cứng, bỏ qua hypervisor và đạt được khoảng 96% đến 99% hiệu năng thực tế so với máy vật lý. Tôi đã vận hành hệ thống này hơn sáu tháng để render Stable Diffusion từ xa. Mặc dù quá trình thiết lập ban đầu khá tẻ nhạt, nhưng kết quả mang lại không khác gì đang sử dụng một chiếc PC vật lý.
Các khái niệm cốt lõi: IOMMU và VFIO
Bạn cần nắm vững hai công nghệ này trước khi bắt tay vào dòng lệnh: IOMMU và VFIO.
IOMMU (Input-Output Memory Management Unit) đóng vai trò như một bộ điều phối luồng dữ liệu ở cấp độ phần cứng. Được biết đến với tên gọi Intel VT-d hoặc AMD-Vi, nó cho phép một VM truy cập các địa chỉ bộ nhớ vật lý một cách an toàn. Nếu không có tính năng này, CPU không thể cô lập bộ nhớ của GPU khỏi phần còn lại của hệ thống host.
VFIO (Virtual Function I/O) là một driver nhân Linux đóng vai trò như một “vị trí giữ chỗ”. Nó ngăn chặn host Proxmox nạp các driver riêng của nó, chẳng hạn như NVIDIA hoặc Nouveau, lên card đồ họa. Điều này giữ cho GPU ở trạng thái sạch, “đang chờ”. Nếu host chiếm quyền điều khiển card trước, VM của bạn khả năng cao sẽ bị treo hoặc crash trong quá trình khởi động.
Bước 1: Chuẩn bị phần cứng và BIOS
Sự thành công phụ thuộc rất nhiều vào IOMMU grouping của bo mạch chủ. Để có trải nghiệm mượt mà, GPU nên nằm trong một nhóm cô lập riêng biệt. Nếu nó dùng chung nhóm với bộ điều khiển SATA, việc passthrough GPU có thể vô tình làm ngắt kết nối các ổ cứng của bạn.
- Khởi động lại vào BIOS/UEFI.
- Kích hoạt VT-d (Intel) hoặc AMD-Vi / IOMMU (AMD).
- Kích hoạt SR-IOV nếu có tùy chọn này.
- Vô hiệu hóa CSM (Compatibility Support Module); UEFI là bắt buộc đối với các thiết lập passthrough hiện đại.
- Thiết lập Primary Display thành iGPU (Internal Graphics). Điều này giúp card đồ họa rời của bạn ở trạng thái tự do để cấp cho VM.
Bước 2: Kích hoạt IOMMU trong Kernel
Chúng ta phải yêu cầu Proxmox kích hoạt IOMMU ngay từ khi bắt đầu quá trình khởi động. Mở tệp cấu hình GRUB:
nano /etc/default/grub
Tìm dòng GRUB_CMDLINE_LINUX_DEFAULT. Thêm các tham số sau dựa trên loại bộ vi xử lý của bạn:
Dành cho Intel (Thế hệ 10 đến thế hệ 14):
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
Dành cho AMD (Dòng Ryzen):
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
Cờ iommu=pt rất quan trọng. Nó ngăn kernel chạm vào các thiết bị mà nó không cần, giúp tăng hiệu năng. Lưu tệp, cập nhật GRUB và khởi động lại:
update-grub
reboot
Xác nhận thiết lập đã hoạt động bằng lệnh dmesg | grep -e DMAR -e IOMMU. Nếu bạn thấy dòng “IOMMU enabled”, bạn đang đi đúng hướng.
Bước 3: Cô lập GPU thông qua VFIO
Bây giờ chúng ta cần xác định ID phần cứng của GPU. Chạy lệnh sau:
lspci -nn | grep -i nvidia
Bạn sẽ thấy một cặp ID, thường trông như thế này:
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation [10de:2484] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation [10de:228b] (rev a1)
Ghi lại các ID 10de:2484 và 10de:228b. Tạo một tệp cấu hình mới để liên kết các ID này với driver VFIO:
nano /etc/modprobe.d/vfio.conf
Thêm dòng sau bằng các ID cụ thể của bạn:
options vfio-pci ids=10de:2484,10de:228b disable_vga=1
Cuối cùng, chúng ta phải đưa các driver của host vào danh sách đen (blacklist) để ngăn chúng can thiệp. Tạo tệp /etc/modprobe.d/pve-blacklist.conf và thêm:
blacklist nvidia
blacklist nvidiafb
blacklist nouveau
blacklist radeon
blacklist amdgpu
Chạy update-initramfs -u và khởi động lại một lần cuối.
Bước 4: Cấu hình máy ảo Proxmox
Khi tạo VM, các thiết lập cụ thể sau là bắt buộc để tăng tốc phần cứng. Đừng sử dụng các thiết lập mặc định, nếu không GPU sẽ không thể khởi tạo.
- System: Đặt Machine thành q35 và BIOS thành OVMF (UEFI). Thêm một ổ đĩa EFI.
- Display: Đặt tùy chọn này thành none. Chúng ta muốn GPU xử lý toàn bộ đầu ra hình ảnh.
- CPU: Thay đổi Type thành host. Điều này cho phép VM sử dụng các tập lệnh AVX và các nhân chuyên dụng cần thiết cho gaming và AI.
Đi đến tab Hardware, nhấp vào Add -> PCI Device. Chọn GPU của bạn (mục có đuôi .0). Đảm bảo các ô All Functions, Primary GPU, và PCI-Express đều được tích chọn. Nếu thiếu một trong số đó, bạn có thể gặp lỗi màn hình đen.
Bước 5: Hiệu năng thực tế và tối ưu hóa
Đối với người dùng Windows, NVIDIA từng kích hoạt lỗi “Error 43” khi phát hiện đang chạy trong máy ảo. Mặc dù các driver mới hơn đã nới lỏng quy định này, bạn vẫn nên ẩn hypervisor. Chỉnh sửa tệp cấu hình VM tại /etc/pve/qemu-server/[VM_ID].conf và sửa đổi dòng CPU:
cpu: host,hv_vendor_id=proxmox,hidden=1
Sau sáu tháng thử nghiệm, tôi thấy rằng lựa chọn mạng quan trọng hơn cả sức mạnh GPU thô khi chơi từ xa. Hãy bỏ qua Windows Remote Desktop (RDP) để chơi game; nó sử dụng trình render phần mềm và bỏ qua GPU của bạn. Thay vào đó, hãy sử dụng Parsec hoặc Sunshine/Moonlight. Trên mạng nội bộ 1Gbps, tôi thấy độ trễ chỉ từ 2ms đến 5ms, mang lại cảm giác như server đang đặt ngay dưới chân bàn làm việc.
Lời kết
GPU Passthrough biến một node Proxmox tiêu chuẩn thành một cỗ máy mạnh mẽ có thể xử lý mọi thứ từ gaming 4K đến huấn luyện LLM. Mặc dù yêu cầu phải thao tác trong menu BIOS và các tham số kernel, nhưng sự linh hoạt mà nó mang lại là vô song. Bạn có thể khởi chạy một VM gaming vào buổi tối và một trạm làm việc AI chuyên dụng vào buổi sáng trên cùng một phần cứng. Hãy lưu ý kiểm tra lại các nhóm IOMMU sau mỗi lần cập nhật BIOS, vì các nhà sản xuất thường thay đổi cách ánh xạ các làn PCIe, điều này có thể làm hỏng cấu hình của bạn.

