Bối cảnh: Khi phần cứng ‘từ chối’ hợp tác lúc nửa đêm
Cảnh tượng quen thuộc: Bạn vừa tậu con RTX 3060 về lắp cho server Proxmox chạy 12 VM ở nhà. Đây là nơi bạn vọc vạch đủ thứ từ Docker đến Kubernetes. Mục tiêu rất rõ ràng là chuyển thẳng sức mạnh GPU vào máy ảo (GPU Passthrough) để chạy AI hoặc làm Cloud Gaming. Nhưng thực tế lại không suôn sẻ như vậy.
Vừa nhấn nút Start máy ảo, toàn bộ server treo cứng hoặc log dmesg nhảy lỗi I/O liên tục. Kiểm tra kỹ, bạn phát hiện GPU đang nằm chung IOMMU Group với card mạng onboard hoặc controller SATA. Muốn đưa GPU vào VM, bạn buộc phải ‘bứng’ luôn cả card mạng đi cùng. Kết quả là server mất kết nối, biến thành một cục gạch đúng nghĩa.
Vấn đề này thường xuất hiện trên các bo mạch chủ phổ thông (Consumer Motherboards). Các nhà sản xuất thường cắt giảm tính năng ACS (Access Control Services) để giảm giá thành, khiến việc phân nhóm IOMMU cực kỳ lộn xộn. ACS Override Patch chính là cứu cánh để ép hệ thống phải tách các nhóm này ra.
Cài đặt: Khám bệnh cho hệ thống PCIe
Đừng vội can thiệp sâu khi chưa biết rõ ‘bệnh tình’. Bạn cần dùng script để soi kỹ cách các thiết bị PCIe đang được phân bổ.
Bước 1: Kích hoạt IOMMU trong BIOS
Trước hết, hãy chắc chắn Intel VT-d hoặc AMD-Vi đã được Enable trong BIOS. Sau đó, kiểm tra trạng thái trên Linux bằng lệnh:
dmesg | grep -e DMAR -e IOMMU
Nếu không thấy dòng thông báo “IOMMU enabled”, mọi nỗ lực phía sau đều vô nghĩa. Hãy quay lại BIOS ngay.
Bước 2: Soi lỗi phân nhóm bằng Script
Đoạn script dưới đây sẽ liệt kê chi tiết các thiết bị đang ‘ở chung nhà’:
#!/bin/bash
for d in /sys/kernel/iommu_groups/*/devices/*; do
n=${d#*/iommu_groups/*}; n=${n%%/*}
printf 'IOMMU Group %s ' "$n"
lspci -nns "${d##*/}"
done
Nếu Group của GPU chứa thêm 4-5 thiết bị lạ như USB Controller hay PCI Bridge, bạn chắc chắn cần đến bản vá ACS.
Cấu hình chi tiết: Triển khai ACS Override Patch
Về kỹ thuật, bản vá này cho phép nhân Linux bỏ qua các kiểm tra bảo mật phần cứng để ép buộc phân tách thiết bị. Trên Proxmox hoặc các bản Kernel tùy chỉnh như Zen kernel, tính năng này thường có sẵn. Bạn chỉ cần kích hoạt nó qua tham số khởi động.
Bước 1: Chỉnh sửa cấu hình GRUB
Truy cập file cấu hình bằng lệnh:
sudo nano /etc/default/grub
Tại dòng GRUB_CMDLINE_LINUX_DEFAULT, hãy thêm tham số pcie_acs_override. Có ba tùy chọn phổ biến:
downstream: Tách các thiết bị nằm sau switch PCIe.multifunction: Tách các thiết bị đa chức năng (ví dụ: GPU tích hợp sẵn audio).id:xxxx:yyyy: Chỉ áp dụng cho một ID thiết bị cụ thể để đảm bảo an toàn.
Kinh nghiệm của mình là dùng combo mạnh nhất để xử lý triệt để trên mainboard dòng B hoặc Z:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction"
Mẹo nhỏ: Thay intel_iommu=on bằng amd_iommu=on nếu bạn dùng CPU Ryzen.
Bước 2: Cập nhật hệ thống
Lưu file và chạy lệnh cập nhật để thay đổi có hiệu lực trong lần khởi động tới:
sudo update-grub
sudo update-initramfs -u
Kiểm tra thành quả và những lưu ý sống còn
Sau khi khởi động lại, hãy chạy lại script liệt kê IOMMU Groups. Lúc này, GPU của bạn sẽ nằm hiên ngang trong một Group riêng biệt.
Xác nhận qua log hệ thống
Gõ lệnh dmesg | grep -i acs để xem Kernel đã nhận lệnh chưa. Nếu thấy thông báo forced into separate group, bạn đã thành công 90%.
Rủi ro bảo mật (Cảnh báo thực tế)
Dùng ACS Override giống như việc bạn bẻ khóa một chốt chặn bảo mật của phần cứng. Trong môi trường doanh nghiệp, điều này có thể dẫn đến tấn công Peer-to-Peer DMA giữa các máy ảo. Tuy nhiên, với dân chơi Homelab, đây là sự đánh đổi xứng đáng để có hiệu năng GPU tối đa trên phần cứng giá rẻ.
Một lỗi thường gặp sau khi patch là AER (Advanced Error Reporting) làm tràn log hệ thống. Nếu dmesg nhảy log liên tục, hãy thêm tham số pci=noaer vào GRUB để dập tắt nó. Chúc các bạn cấu hình thành công và không còn phải thức trắng đêm vì lỗi IOMMU!

