Linux - wparcie dla wirtualizacji w kontekście serwerów ARM
Plan Terminologia i koncepcja wirtualizacji QEMU Czym jest? Architektura ARMv8 i wsparcie dla wirtualizacji poziomy uprzywilejowania dodatkowy tryb pracy CPU podwójna translacja MMU wirtualny kontroler przerwań i timer Emulacja I/O wirtualizacja parawirtualizacja VHOST
Terminologia Wirtualizacja - technika pozwalająca na jednoczesne uruchamianie wielu systemów operacyjnych na tej samej platformie sprzętowej Hipernadzorca (ang. hypervisor) - kawałek kodu realizujący powyższe założenia i zarządzający zasobami sprzętowymi Host OS - system operacyjny na którym działa hipernadzorca Guest OS - system operacyjny który działa na wirtualnej maszynie QEMU (ang. Quick Emulator) - szybki emulator różnych architektur oraz urządzeń I/O + interfejs użytkownika do uruchamiania i konfiguracji maszyny wirtualnej
Koncepcja hypervisor a i co ma do tego? Brak wirtualizacji - jeden OS Hypervisor - dodatkowy warstwa zarządzająca sprzętem QEMU + jako implementacja hypervisora App App App App App App QEMU App App QEMU App App OS kernel OS kernel OS kernel OS kernel App OS kernel Hypervisor Linux kernel Hardware Hardware Hardware
QEMU QEMU process == VM Guest OS ioctl() host kernel Hardware I/O emulation User space Kernel space wykorzystuje jako akcelerator (wirtualizacja natywnej architektury) może działać autonomicznie (bez ) odpowiedzialny za interakcję z vm_fd = open( /dev/kvm ); ioctl(vm_fd,...); mmap() pamięci RAM wirtualnej maszyny emulacja urządzeń I/O (wirtualizacja i parawirtualizacja) qemu -name <vm_name> -machine virt,accel=kvm -cpu <cpu_type> -m <RAM_size> -smp <cpu_nr>...
Czym jest (Kernel-based Virtual Machine)? QEMU Process Guest OS I/O emulation host kernel Hardware User space Kernel space kvm.ko moduł kernela, który wykorzystuje dostępne i stabilne podsystemy kernela MMU synchronizacja scheduling przerwania itd zarządza zasobami sprzętowymi wymaga sprzętowego wsparcia zmienia kontekst procesora host/guest tzw. world switch
Czym jest? c.d. zapewnia obsługę wyjątków wirtualnej maszyny (trap) tj.: przerwania dostęp do rejestrów I/O udostępnia urządzenie /dev/kvm, za pomocą którego możliwe jest poznanie dostępnych urządzeń/funkcjonalności i ich konfiguracja np.: typ kontrolera przerwań ilość procesorów (SMP) współpracuje z emulatorami np. QEMU, kvmtool emulacja pozostałych rzeczy np. dostęp do dysku virtio-blk
ARMv8 poziomy uprzywilejowania EL - Exception Level Powodem zmiany EL może być: przerwanie, page faults instrukcja SVC (przejście do EL1) instrukcja HVC (przejście do EL2) instrukcja SMC (przejście do EL3) ERET (przejście poziom niżej)
ARMv8 poziomy uprzywilejowania c.d.
i architektura ARMv8.0 Guest Userspace Guest Userspace Host Userspace Guest Userspace Guest Kernel Guest Kernel Linux host kernel Guest Kernel Hypervisor Switching code
i architektura ARMv8 c.d. Poziom EL2 ma tylko jeden bazowy rejestr tablicy translacji TTBR1_EL2 Wymagane ogromne zmiany żeby uruchomić kernel na EL2 EL2 zawiera mały kawałek kodu zmieniające kontekst host - guest tzw. world switch
i architektura ARMv8.1 (VHE) Host Userspace Linux host kernel Guest Userspace Guest Kernel Rozszerzenie dla wirtualizacji: wsparcie dla TTBR0_EL2 i TTBR1_EL2!!! host kernel może pracować na EL2 host kernel nie musi przechodzić z EL2 do EL1 zmiana kontekstu na tym samym poziomie EL2
Jak zwirtualizować CPU (tzw. vcpu)? emulacja? emulacja wybranych instrukcji? modyfikacja kernela VM? użycie nowego trybu CPU - guest procesor wchodzi w tryb guest i działa w trybie natywnym wychodzi do trybu host gdy potrzebuje pomocy każdy vcpu może być osobnym wątkiem Handle reason (user. mode) Handle reason (kern. mode) Start Enter Guest Exit to Hyp for some reason Guest execution ** Wymaga od procesora wsparcia dla wirtualizacji (Intel VT-x, ARM s Virt. extensions)!!!
Jak zwirtualizować CPU (tzw. vcpu)? c.d. pthread 0 vcpu QEMU process pthread 1 vcpu I/O emulation vcpu to wątek możemy użyć taskset, numactl, ps... exit enter exit enter exit enter User space Exception handling Kernel space host kernel I/O emulation
Jak zwirtualizować CPU (tzw. vcpu)? c.d. Return from QEMU with updated CPU state While no heavy exit - orno error Check pend interrupts, timers. Update & inject into guest Exit to QEMU 1. Heavy Exit - MMIO 2. Runtime error Host Userspace QEMU Guest Userspace Handle Exit could be - 2nd stage MMU fault - Hype call - System reg access - error can t decode Disable interrupts About to enter Guest ioctl(_run) Update vcpu/ with Guest HW state Check for pending signals Set exit reason interrupted Enable interrupts Linux host kernel Guest Kernel Enter guest, this is where you world switch - Enter/ and return on Exit here Enable Interrupts Host interrupts happen here enter/exit Switching code
Jak zwirtualizować CPU (tzw. vcpu)? c.d. Guest enter HYP Host QEMU Run vcpu Guest Mode Ultra-light Exit Light-weight Exit Guest exit HYP Host QEMU Exit Handle Heavy Exit Konkluzje: narzut na wirtualizację to czas kiedy CPU spędza w trybie host i obsługuje wyjątki im mniej wychodzimy do hypervisora tym lepiej wyjście do userspace u (tzw. heavy exit) jest najgorszym z możliwych scenariuszy jeżeli chodzi o wydajność
MMU - pojedyncza translacja
MMU - podwójna translacja
Kontroler przerwań (VGIC)
Kontroler przerwań (VGIC) c.d. exit pthread 0 vcpu host kernel QEMU process enter Exception handling VGIC I/O emulation exit Dist. regs reg 0 reg 1 reg 2 enter User space Kernel space przerwania nadal są obsługiwane przez kernel host dostęp do rejestrów i/f CPU nie powodują wyjątku dostęp do rejestrów dystrybutora nadal powoduje wyjątek (in-kernel emulation) host jest w stanie wygenerować przerwanie programując wirtualny i/f CPU przerwanie jest generowane s/w na żądanie emulowanego urządzenia I/O
VTimer operacje na rejestrach timera są krytyczne dla wydajności fizyczny timer dostępny tylko dla hosta wirtualny timer (vtimer) przeznaczony dla VM dostęp do rejestrów vtimera nie powoduje wyjątków : ) wciąż potrzebna emulacja vtimera w kernelu : ( przerwanie vtimera nadal powoduje wyjątek i world switch optymalizacja - sprawdza rejestry vtimera i wstrzykuje przerwanie do VM
VTimer c.d. pthread 0 QEMU process vcpu I/O emulation exit enter exit enter User space Exception handling IRQ injection Kernel space VGIC VTimer host kernel
Emulacja I/O - pełna wirtualizacja IRQ e1000 Guest kernel reg 0 reg 1 reg 2 reg 3 QEMU process MMIO IRQFD host kernel e1000 I/O emulation machine state MMIO RX/TX TAP dev User space Kernel space istniejący sterownik kompatybilność wstecz każdy zapis/odczyt rejestru to trap i wyjście do userspace-u skomplikowana maszyna stanu w QEMU IRQFD
Virtio - parawirtualizacja virtio-net Guest kernel virtio-defined registers QEMU process vring host kernel virtio-net I/O emulation virtio-defined protocol IRQ MMIO EVENTFD MMIO RX/TX TAP dev User space Kernel space typowy sterownik dla VM konieczne wsparcie dla VIRTIO w kernelu protokół zaprojektowany dla potrzeb wirtualizacji vring - współdzielona pamięć eventfd - komunikacja w dwie strony prostsza implementacja niż emulacja zachowania HW
VHOST virtio-net Guest kernel virtio-defined registers QEMU process VRING vhost-net I/O emulation control plane IRQ MMIO MMIO ioctl User space QEMU jako funkcja kontrolna QEMU przekierowuje data plane przepływ pakietów VM<->kernel pomijamy warstwę QEMU<- >TAP qemu -netdev type=tap,id=net0,vhost=on -device virtio-net-pci,netdev=net0 /dev/vhost-net vhost-net Kernel space EVENTFD host kernel TAP dev
Q/A Dziękuję za uwagę Pytania? Kontakt: Tomasz Nowicki tn@semihalf.com