Hướng dẫn cấu hình GPU Passthrough (VFIO/IOMMU) trên Fedora Workstation chi tiết

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Dùng Linux làm việc nhưng vẫn vướng phần mềm Windows?

Dân lập trình hay DevOps thường chọn Linux vì terminal tiện lợi và môi trường Docker native. Rắc rối chỉ bắt đầu khi bạn cần dựng video 4K bằng Adobe Premiere, test app DirectX, hay chơi vài trận Valorant, Apex Legends. Dual-boot giải quyết được việc này. Nhưng reboot máy liên tục giữa giờ làm việc vừa phiền vừa đứt mạch tập trung.

Máy ảo thông thường (VirtualBox, VMware) dùng đồ họa ảo hóa nên render 3D rất giật. GPU Passthrough (VFIO) xử lý triệt để bài toán này. Kỹ thuật này bàn giao toàn bộ card PCIe rời cho máy ảo KVM/QEMU quản lý. Kết quả thực tế rất ấn tượng: Điểm benchmark 3DMark Time Spy trên máy ảo đạt khoảng 12.100 điểm so với 12.450 điểm native (giữ hơn 97% hiệu năng) mà không cần reboot Fedora.

Hiểu đúng về IOMMU và VFIO

Nắm rõ cơ chế hoạt động giúp bạn tự fix lỗi nhanh khi gặp màn hình đen hoặc dính IOMMU group:

  • IOMMU (Intel VT-d / AMD-Vi): Tính năng phần cứng trên bo mạch chủ. Nó cho phép máy ảo truy cập trực tiếp RAM và thiết bị PCIe mà không cần Kernel host trung gian can thiệp.
  • IOMMU Groups: Ranh giới cô lập phần cứng do BIOS quy định. Muốn passthrough ổn định, GPU rời và controller Audio đi kèm phải nằm trọn trong một Group riêng. Group này không được chứa chung SSD NVMe hay card mạng.
  • VFIO Driver (vfio-pci): Driver kernel đóng vai trò “chiếm chỗ”. Nó chặn driver đồ họa của host (nvidia, nouveau, amdgpu) nhận card rời lúc boot, giữ nguyên thiết bị đó để QEMU sử dụng.

Cấu hình phần cứng tối thiểu: Bạn cần 2 GPU. Phổ biến nhất là 1 iGPU (Intel UHD/Iris hoặc AMD Radeon tích hợp) để xuất hình Fedora, kèm 1 card rời (Nvidia/AMD) cắm khe PCIe chính để chuyển sang Windows.

Các bước triển khai thực tế trên Fedora

Fedora dùng Kernel mới rất nhanh, các bản vá VFIO được cập nhật liên tục nên setup khá mượt. Dưới đây là quy trình chuẩn từng bước.

Bước 1: Bật ảo hóa phần cứng và nạp Kernel params

Khởi động vào BIOS, tìm và bật mục Intel VT-d hoặc AMD IOMMU (SVM / AMD-Vi).

Vào lại Fedora, mở Terminal và nạp tham số kernel bằng công cụ grubby:

# Máy chạy CPU Intel:
sudo grubby --update-kernel=ALL --args="intel_iommu=on iommu=pt"

# Máy chạy CPU AMD:
sudo grubby --update-kernel=ALL --args="amd_iommu=on iommu=pt"

Khởi động lại máy. Chạy lệnh sau để kiểm tra trạng thái kích hoạt:

dmesg | grep -E -i "(iommu|dmar)"

Nếu terminal trả về DMAR: IOMMU enabled hoặc AMD-Vi: Initialized IOMMU, hệ thống đã sẵn sàng.

Bước 2: Lấy Hardware ID và rà soát IOMMU Group

Chạy script bash sau để kiểm tra danh sách IOMMU Groups:

for d in /sys/kernel/iommu_groups/*/devices/*; do
    n=${d#*/iommu_groups/*}; n=${n%%/*}
    printf 'IOMMU Group %s ' "$n"
    lspci -nns "${d##*/}"
done | grep -i -E "vga|3d|audio"

Kết quả mẫu trên dàn máy test:

IOMMU Group 14 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA106 [GeForce RTX 3060] [10de:2503] (rev a1)
IOMMU Group 14 01:00.1 Audio device [0403]: NVIDIA Corporation GA106 High Definition Audio Controller [10de:228e] (rev a1)

Lưu lại hai mã định danh phần cứng nằm trong ngoặc vuông cuối dòng: 10de:2503 (VGA) và 10de:228e (Audio controller tích hợp trên card).

Bước 3: Gán GPU cho driver vfio-pci từ lúc khởi động

Khai báo ID phần cứng vừa lấy vào modprobe:

sudo bash -c 'cat <<EOF > /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:2503,10de:228e
EOF'

Ép Dracut nạp driver VFIO sớm ngay trong giai đoạn initramfs:

sudo bash -c 'cat <<EOF > /etc/dracut.conf.d/vfio.conf
force_drivers+=" vfio vfio_iommu_type1 vfio_pci "
EOF'

Tạo lại toàn bộ initramfs và reboot máy:

sudo dracut --regenerate-all --force
sudo reboot

Kiểm tra lại xem driver vfio-pci đã nắm quyền kiểm soát card rời chưa:

lspci -k -s 01:00.0

Nếu thấy dòng Kernel driver in use: vfio-pci, GPU đã được cô lập hoàn toàn khỏi Fedora.

Bước 4: Thiết lập máy ảo Windows trên Virt-Manager

Cài đặt trọn bộ công cụ KVM/QEMU:

sudo dnf install -y qemu-kvm libvirt virt-manager virt-install edk2-ovmf
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt $(whoami)

Mở Virtual Machine Manager (virt-manager), tạo máy ảo Windows 10/11 rồi cấu hình các mục quan trọng:

  1. Overview: Chọn Chipset Q35, Firmware chọn UEFI x86_64: .../OVMF_CODE.secboot.fd.
  2. CPU: Đặt model là host-passthrough để máy ảo nhận đủ tập lệnh AVX2/SSE4. Chia topology phù hợp (ví dụ máy 8 core 16 thread thì gán 6 core 12 thread cho guest).
  3. Add Hardware: Chọn PCI Host Device, thêm thiết bị VGA (01:00.0) và thiết bị Audio tương ứng (01:00.1).
  4. Loại bỏ display ảo: Xóa các mục Display Spice, Video QXL/Virtio và Channel spice. Card rời vật lý sẽ xuất hình trực tiếp ra màn hình.

Cắm cáp HDMI/DisplayPort từ card rời vào màn hình riêng (hoặc đổi cổng input trên màn hình hiện tại). Khởi động máy ảo và cài driver Nvidia/AMD trực tiếp trong Windows.

Lời kết

Phần khó nhất của GPU Passthrough là tách IOMMU Group và ép kernel nạp đúng driver lúc boot. Khi cấu hình chuẩn, bạn có ngay môi trường làm việc kép tối ưu: code trên Linux ổn định và làm đồ họa, giải trí trên Windows với sức mạnh phần cứng nguyên bản.

Share: