Parawirtualizacja – część pierwsza

To pierwsza moja notka na temat parawirtualizacji oraz jednocześnie zapis moich zmagań konfiguracyjnych. Parawirtualizacja w przeciwieństwie do zwykłej, która jest prawie całkowicie emulowana, potrafi korzystać bezpośrednio ze sprzętu gospodarza co pozwala osiągnąć wydajność zbliżoną do natywnej.

 

Chciałbym przedstawić etap konfiguracji maszyny wirtualnej na Archu, gdzie gościem będzie Windows, który z kolei będzie miał bezpośredni dostęp do karty graficznej (Nvidii). Na komputerze gospodarzu (Archu) będę korzystał z zintegrowanej karty Intelowskiej.

 

Wymagania sprzętowe:

  • Procesor (Intel/AMD) musi wspierać wirtualizację: lista dla intela i AMD
  • Płyta główna musi również wspierać IOMMU. To trudniej zweryfikować gdyż opcja IOMMU nie zawsze jest dostępna na płycie. Na mojej płycie nie mam jej wcale lecz mimo tego wszystko działa. Posiadam jedynie włączoną funkcję VT-d.
  • Musimy mieć dwie karty graficzne (wystarczy dodatkowa i zintegrowana) z tego ta dodatkowa musi obsługiwać UEFI. Czyli praktycznie wszystkie karty nie starsze niż 3-4 lata. Oczywiście jak ktoś się bardzo uprze to wystarczy jedna, ale wtedy konfiguracja będzie przebiegała trochę inaczej.
  • Nasz monitor, a najlepiej dwa monitory, musi posiadać co najmniej dwa wyjścia, z którego jedno będzie podłączone do jednej karty, a drugie do drugiej.

 

Cała konfiguracja będzie przebiegała w kilku krokach:

  1. Przełączenie kart graficznych, u mnie z Nvidii na Intela gdyż Nvidię chcę używać w maszynie wirtualnej
  2. Włączenie modułu iommu w GRUBie
  3. Wyłączenie karty Nvidii w linuxie tak aby żaden sterownik z niej nie korzystał
  4. Instalacja dodatkowego oprogramowania do zarządzania maszyną wirtualną

 

Wszystkie poniższe kroki pochodzą ze strony Arch Wiki i są w zasadzie uniwersalne dla wszystkich dystrybucji z niewielkimi różnicami: https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF

1) W pierwszym etapie odinstalowałem sterowniki Nvidii i zainstalowałem sterowniki dla karty Intela po czym zrestartowałem komputer  i w biosie włączyłem zintegrowaną kartę. Następnie wskazałem w BIOSie, z której karty ma korzystać komputer. Fajne są te nowe biosy 🙂

sudo pacman -Rsn nvidia lib32-nvidia-libgl nvidia-libgl nbidia_utils lib32-nvidia-utils
sudo pacman -S  xf86-video-intel mesa-libgl lib32-mesa-libgl
Po restarcie można sprawdzić, który sterownik jest używany
glxinfo|egrep "OpenGL vendor|OpenGL renderer

 

2) Kolejny krok to włączenie w opcjach GRUB’a modułu intel_iommu=on (dla kart AMD moduł nazywa się amd_iommu=on) wygenerowanie nowego pliku konfiguracyjnego GRUBa

sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="... intel_iommu=on"
sudo grub-mkconfig -o /boot/grub/grub.cfg
i restart

Jeśli wszystko zadziało dobrze, a nasza płyta wspiera wirtualizację to poniższa komenda:
dmesg|grep -e DMAR -e IOMMU

Powinna wyświetlić coś podobnego:

[ 0.000000] ACPI: DMAR 0x00000000BC816270 0000B8 (v01 INTEL SNB 00000001 INTL 00000001)
[ 0.000000] DMAR: IOMMU enabled
[ 0.140828] DMAR: Host address width 36
[ 0.140829] DMAR: DRHD base: 0x000000fed90000 flags: 0x0

 

3) Teraz najważniejszy punkt, w którym musimy sprawdzić do jakich grup IOMMU należą poszczególne komponenty komputera tj. karta, hosty usb, porty etc gdyż do maszyny wirtualnej może przekazywać jedynie całą grupę, a nie tylko jedno urządzenie (z wyjątkiem PCI bridge/root). Poniższa komenda zwróci podział na grupy IOMMU:

for iommu_group in $(find /sys/kernel/iommu_groups/ -maxdepth 1 -mindepth 1 -type d); do echo "IOMMU group $(basename "$iommu_group")"; for device in $(ls -1 "$iommu_group"/devices/); do echo -n $'\t'; lspci -nns "$device"; done; done

 

Nas najbardziej interesuje grupa, w której jest karta graficzna, którą będziemy przekazywać do maszyny wirtualne. U mnie np. jest to grupa pierwsza.

 

IOMMU group 1
00:01.0 PCI bridge [0604]: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor PCI Express Root Port [8086:0151] (rev 09)
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK104 [GeForce GTX 770] [10de:1184] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation GK104 HDMI Audio Controller [10de:0e0a] (rev a1)

 

Na szczęście pierwsza grupa jest ok, przekazywać będę dwa ostatnie urządzenia, pierwsze urządzenie to PCI bridge, które można ominąć.

 

Aby całkowicie wyizolować kartę graficzną będę korzystał z vfio-pci, które jest dostępny w jądrach 4.1+. Wiem, że większość tutoriali opiera się na pci-stub, ale u mnie działa nowsza metoda.

Dodajemy do pliku vfio.conf ID urządzenia karty graficznej z nawiasów kwadratowych (Nvidia akurat ma dwa urządzenia więc podaję po przecinku drugi vendor:deviceid)

sudo vi /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:1184,10de:0e0a

 

Ładujemy kilka modułów:

sudo vi /etc/mkinitcpio.conf
MODULES="... vfio vfio_iommu_type1 vfio_pci vfio_virqfd ..."
HOOKS="... modconf ...

 

Tworzymy na koniec nowy obraz initramfs
sudo mkinitcpio -p linux

 

Restartujemy i po zalogowaniu komenda

dmesg | grep -i vfio

 

Powinna wyświetlić coś podobnego z ID’kami, które wcześniej wpisaliśmy do vfio.conf

 

[ 1.092892] VFIO – User Level meta-driver version: 0.3
[ 1.111243] vfio_pci: add [10de:1184[ffff:ffff]] class 0x000000/00000000
[ 1.124545] vfio_pci: add [10de:0e0a[ffff:ffff]] class 0x000000/00000000
[ 497.668459] vfio-pci 0000:01:00.0: enabling device (0000 -> 0003)
[ 497.668621] vfio_ecap_init: 0000:01:00.0 hiding ecap 0x19@0x900

 

4) Gratulacje, najcięższa robota za nami, teraz pozostaje jeszcze instalacja niezbędnego softu do obsługi naszego parawirtualnego środowiska czyli qemu, virta, oraz ovmf’a.

 

pacaur -S qemu libvirt ovmf-git virt-manager dnsmasq ebtables

 

Po instalacji trzeba jeszcze edytować plik konfiguracyjny qemu i zmienić ścieżkę nvram

sudo vi /etc/libvirt/qemu.confnvram = [
    "/usr/share/ovmf/x64/ovmf_x64.bin:/usr/share/ovmf/x64/ovmf_vars_x64.bin"
]

 

Na koniec uruchamiamy usługi libvirta
sudo systemctl enable --now libvirtd
sudo systemctl enable virtlogd.socket

 

I to tyle jeśli chodzi o część pierwszą. W drugiej części będzie już górki,  opiszę etap tworzenia wirtualnej maszyny oraz wrażenia z grania 🙂

 

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.