Skip to the content.

1.VirtIO

VirtIO là nền tảng cho ảo hóa các các thiết bị I/O(Input/ Output), phổ biến với một số hypervisors (trong đó có QEMU). Hệ điều hành khách cần các driver đặc biệt để xử lý những thiết bị này.

Các thiết bị được hỗ trợ.

|Chức năng| Bus| Loại | Thiết bị | Ví dụ | |———|—-|——|————–|——-| |Mạng | PCI|10Gp/s|virtio-net-pci|-net nic,model=virtio…| |Lưu trữ | PCI|SCSI |virtio-scsi-pci|-device virtio-scsi-pci -drive file=disk.img,if=none,id=hd0 -device scsi-hd,drive=hd0| ||PCI |Custom|virtio-blk|-drive file=disk.img,if=virtio …| |Memory|PCI|RAM| virtio-balloon-pci|| |Serial| PCI |Serial |virtio-serial-pci|| |Random Number Generator| PCI| RNG| virtio-rng-pci| → virtio-rng-pci

2. Ảo hóa card mạng.

Để thêm card mạng ta sử dụng tùy chọn - net nic và với cấu hình model để chọn phần cứng. Ví dụ:

qemu -net nic,model=pcnet ...

Một số thiết bị mạng |Tên thiết bị| Bus| Tốc độ| Mô tả| |———-|———-|———-|—–| |e1000 |PCI |1Gb/s| Intel Gigabit Ethernet| |i82551| |?| ?| ?| |i82557b| |?| ?| ?| |i82559er |? |100Mb/s| ?| |ne2k_pci |PCI |10Mb/s |NE2000| |ne2k_isa |ISA |10Mb/s |NE2000| |pcnet |PCI| 10Mb/s| AMD Ethernet Card| |rtl8139 |PCI |10/100Mb/s| Realtek Fast Ethernet| |virtio |PCI |1Gb/s| Virtual High Performance Ethernet card (see Virtio)|

Để liệt kê các card mạng được hỗ trợ trên các kiến trúc khác nhau:

qemu-system-<arch> -net nic,model=?

3. SR-IOV.

3.1. Khái niệm

Single Root I/O Virtualization là một kỹ thuật mà cho phép một thiết bị PCI chia thành nhiều thiết bị riêng biệt gồm có Physical Function (PF) và một hoặc nhiều Virtual Function (VF). SR-IOV cung cấp một cách chuẩn cho một thiết bị vào ra vật lý để present chính nó để PCIe bus như nhiều thiết bị ảo.

Trong khi các PF có tất cả các tính năng của PCIe thì VFs là các chức năng nhẹ mà không đủ các cấu hình tài nguyên. Cấu hình các VFs và quản lý được thực hiện thông qua PF vì vậy chúng nó thể chỉ tập tập trung vào việc di chuyển dữ liệu. Điều này rất quan trọng để lưu ý là tổng bandwidth sẵn có với PF được chia sẻ cho tất cả các VF mà tương tác với nó.

SR-IOV yêu cầu sự hỗ trợ từ BIOS , OS hay Hypervisor và phần cứng.

Danh sách OS hỗ trợ

Windows Server 2012  
Windows Server 2012 R2  
Windows Server 2008* R2  
Windows Server 2008  
Linux* 2.6.30 kernel or later  
Red Hat Enterprise Linux 6.0* and later  
SUSE Linux Enterprise Server 11* SP1 and later

Danh sách Hypervisor hỗ trợ

Microsoft Hyper-V* (Windows Server 2012*)  
VMware Sphere* 5.1  
Xen Hypervisor*  
KVM* (Kernel Based Virtual Machine)  

Về lý thuyết mỗi một thiết bị SR-IOV có tối đa 256 VF. Nhưng 64 VFs được xem là giới hạn cho tất cả các thiết bị PCI.

PCI passthrough.

KVM hỗ trợ gán trực tiếp thiết bị PCI trên hệ thống host cho guest. PCI passthrough cho phép guest có độc quyền truy cậu lên thiết bị PCI để thực hiện các tác vụ, cho phép các thiết bị PCI xuất hiện và hoạt động như một thiết bị vật lý thật được gắn vào hệ điều hành guest.

Các thiết bị PCI bị giới hạn bởi kiến trúc hệ thống ảo hóa. Một thiết bị có thể có nhiều chức năng hoạt động chung trên một slot PCI. Mỗi guest có thể sử dụng tối đa 32 thiết bị PCI và mỗi thiết bị có thể có tối đa 8 chức năng.

Chức năng VT-d hoặc AMD IOMMU phải được bật ở trong BIOS.

Active VT-d và AMD IOMMU để có thể sử dụng PCI passthrough.

Active Intel VT-d.

  1. Trên Ubuntu host:
    • Chỉnh sửa file /etc/default/grub
      ...
      GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on"
      ...
      
    • Chạy lệnh:
      update-grub
      
    • Khởi động lại máy.
  2. Trên Centos host:
    • Chỉnh sửa hoặc thêm vào file /boot/grub/grub.conf:
      intel_iommu=on
      
    • Khởi động lại hệ thống.

Active AMD IOMMU.

  1. Trên ubuntu host:
    • Chỉnh sửa file /etc/default/grub
      ...
      GRUB_CMDLINE_LINUX_DEFAULT="amd_iommu=on"
      ...
      
    • Chạy lệnh:
      update-grub
      
    • Khởi động lại máy.
  2. Trên Centos host:
    • Chỉnh sửa hoặc thêm vào file /boot/grub/grub.conf:
      iommu=on
      
    • Khởi động lại hệ thống.

Lab Cấu hình GPU passthough

1. Cấu hình bật chức năng IOMMO

LƯU Ý: Trước khi blacklist gpu trong kernel của hypervisor, cần chắc chắn rằng vẫn còn một gpu khác đang chạy để vẫn có thể console vào được hệ thống.

Xác định nhóm IOMMO của gpu.

$ lspci -vs 01:00.1 01:00.1 Audio device: NVIDIA Corporation GP106 High Definition Audio Controller (rev a1) Subsystem: ZOTAC International (MCO) Ltd. GP106 High Definition Audio Controller Flags: fast devsel, IRQ 255 Memory at f7080000 (32-bit, non-prefetchable) [disabled] [size=16K] Capabilities: [60] Power Management version 3 Capabilities: [68] MSI: Enable- Count=1/1 Maskable- 64bit+ Capabilities: [78] Express Endpoint, MSI 00 Capabilities: [100] Advanced Error Reporting Kernel driver in use: snd_hda_intel Kernel modules: snd_hda_intel

   - Với mỗi module trong 'Kernel modules', thêm một dòng vào file /etc/modprobe.d/01-vfio-pci.conf theo định dạng sau(thay $module bằng tên module):

softdep $module pre: vfio-pci - Thêm vào cuối file /etc/modprobe.d/01-vfio-pci.conf dòng sau bao gồm hardware ID của các thiết bị passthough options vfio-pci ids=10de:0ffc,10de:0e1b ```

- File /etc/modprobe.d/01-vfio-pci.conf sẽ giống như thế này:
```
softdep nouveau pre: vfio-pci
softdep nvidiafb pre: vfio-pci
softdep snd_hda_intel pre: vfio-pci
options vfio-pci ids=10de:0ffc,10de:0e1b
```

- Chạy lênh sau và reboot hypervisor again:
```
update-initramfs -u
update-grub
reboot
```

- Sau khi khởi động lại, kiểm tra `Kernel driver in use` của các thiết bị xem đã chuyển về vfio-pci chưa:
```
lspci -vs 01:00.0

```

Nguồn tài liệu: https://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM https://clayfreeman.github.io/gpu-passthrough/