KVM – Linux Kernel-based Virtual Machine od środka
KVM (Kernel-based Virtual Machine) to technologia wirtualizacji wbudowana w jądro Linuxa. Pozwala wykorzystać Linux jako hypervisor i uruchamiać na jednym fizycznym serwerze wiele niezależnych maszyn wirtualnych.
KVM jest podstawą wielu współczesnych platform wirtualizacyjnych, chmur prywatnych oraz rozwiązań takich jak Proxmox.
Czym właściwie jest KVM?
KVM nie jest klasycznym programem typu:
VMware Workstation
VirtualBox
KVM jest częścią kernela Linux:
Linux Kernel
|
v
KVM
|
+-----------+-----------+
| |
VM 1 VM 2
Linux Windows
Kernel Linux otrzymuje możliwość uruchamiania kodu systemu gościa bezpośrednio na procesorze, z wykorzystaniem sprzętowych rozszerzeń wirtualizacji.
Intel VT-x i AMD-V
KVM wykorzystuje sprzętową wirtualizację CPU.
VT-x
AMD:
AMD-V
Na współczesnych procesorach jest to standardowa funkcja.
Można sprawdzić jej dostępność w Linuxie:
grep -E 'vmx|svm' /proc/cpuinfo
vmx oznacza Intel VT-x, a svm AMD-V.
KVM + QEMU
Najważniejsze:
KVM i QEMU to nie to samo.
Najczęściej współpracują:
Virtual Machine
|
v
QEMU
|
+---------+---------+
| |
Devices KVM
|
v
CPU Hardware
QEMU
Odpowiada m.in. za:
- emulację urządzeń,
- wirtualny dysk,
- wirtualną kartę sieciową,
- firmware,
- urządzenia PCI,
- uruchamianie procesu VM.
KVM
Odpowiada za:
- wirtualizację CPU,
- wejście VM w tryb wykonania na fizycznym procesorze,
- obsługę sprzętowych mechanizmów wirtualizacji.
Jak wygląda architektura?
Physical Server
CPU
|
VT-x / AMD-V
|
v
Linux Kernel
|
v
KVM
|
+-----------+-----------+
| |
QEMU QEMU
| |
VM 1 VM 2
| |
Ubuntu Windows
/dev/kvm
Jednym z najważniejszych elementów jest:
/dev/kvm
To interfejs, przez który aplikacje przestrzeni użytkownika, takie jak QEMU, korzystają z funkcji wirtualizacji kernela.
Sprawdzenie:
ls -l /dev/kvm
Można też sprawdzić:
lsmod | grep kvm
Typowo zobaczymy:
kvm
kvm_intel
albo:
kvm
kvm_amd
Co dzieje się podczas uruchamiania VM?
Przykładowo uruchamiamy Ubuntu.
qemu-system-x86_64
|
v
/dev/kvm
|
v
KVM ioctl
|
v
Virtual CPU
|
v
Physical CPU
KVM tworzy wirtualny procesor dla maszyny.
VM jako proces Linuxa
Jedną z ciekawych rzeczy jest to, że maszyna wirtualna jest zarządzana przez Linux jako proces.
Możemy zobaczyć proces QEMU:
ps aux | grep qemu
Przykład:
qemu-system-x86_64
To właśnie proces reprezentujący VM.
vCPU
Maszyna wirtualna może mieć wiele wirtualnych CPU.
Przykład:
Physical CPU
CPU 0
CPU 1
CPU 2
CPU 3
CPU 4
CPU 5
CPU 6
CPU 7
VM:
VM
vCPU 0
vCPU 1
vCPU 2
vCPU 3
Linux scheduler decyduje, kiedy poszczególne vCPU otrzymają czas procesora.
VMEXIT
Jednym z najważniejszych pojęć w KVM jest:
VMEXIT
VM wykonuje kod:
Guest OS
|
v
CPU
Jeżeli wykonuje operację wymagającą interwencji hypervisora:
Guest
|
v
VMEXIT
|
v
KVM
|
v
Handle Event
Następnie:
KVM
|
v
VMRESUME
|
v
Guest
Dlaczego VMEXIT jest ważny?
Ponieważ częste przejścia:
Guest
↕
KVM
mogą być kosztowne wydajnościowo.
Dlatego nowoczesne technologie wirtualizacji starają się ograniczać liczbę niepotrzebnych VMEXIT.
Pamięć VM
Maszyna wirtualna potrzebuje własnej pamięci:
Physical RAM
+-----------------------+
| Linux Host |
+-----------------------+
| VM 1 |
| 4 GB |
+-----------------------+
| VM 2 |
| 8 GB |
+-----------------------+
| VM 3 |
| 2 GB |
+-----------------------+
QEMU/KVM mapuje pamięć VM do przestrzeni adresowej procesu.
vCPU i vRAM
Można myśleć o VM jako o zestawie wirtualnych zasobów:
VM
|
+-- vCPU
|
+-- vRAM
|
+-- vDisk
|
+-- vNIC
|
+-- Devices
Wirtualny dysk
Najpopularniejsze rozwiązania:
qcow2
raw
LVM
Ceph RBD
ZFS
Przykładowo:
VM
|
v
/dev/vda
|
v
qcow2
|
v
Physical Storage
QCOW2
qcow2 jest formatem dysków QEMU.
Jedną z jego zalet jest możliwość tworzenia snapshotów.
Base Image
|
+---- Snapshot 1
|
+---- Snapshot 2
Możliwe są również obrazy typu copy-on-write.
Wirtualna sieć
KVM może tworzyć wirtualne karty sieciowe:
VM
eth0
|
v
vNIC
|
v
QEMU
|
v
Linux Bridge
|
v
Physical NIC
|
v
Internet
Linux Bridge
Przykładowa architektura:
br0
+----+----+
| |
VM 1 VM 2
|
Physical NIC
|
Network
NAT
Możliwe jest również:
VM
|
v
Virtual Network
|
v
NAT
|
v
Host
|
v
Internet
VM może wtedy korzystać z Internetu bez bezpośredniego adresu publicznego.
Virtio
Jednym z najważniejszych elementów wydajności KVM są urządzenia virtio.
Zamiast pełnej emulacji sprzętu:
VM
|
v
Emulated NIC
|
v
QEMU
możemy użyć:
VM
|
v
virtio-net
|
v
Host
Podobnie:
virtio-blk
virtio-scsi
virtio-fs
virtio-rng
Virtio ogranicza narzut wirtualizacji.
PCI Passthrough
KVM może również przekazać fizyczne urządzenie bezpośrednio do VM.
Przykład:
Physical GPU
|
v
VFIO
|
v
VM
VM może wtedy korzystać z fizycznego GPU niemal bezpośrednio.
Popularne zastosowania:
- GPU computing,
- AI,
- machine learning,
- gaming,
- specjalistyczne urządzenia PCIe.
IOMMU
PCI Passthrough często wykorzystuje:
Intel VT-d
AMD IOMMU
Schemat:
PCIe Device
|
v
IOMMU
|
v
VFIO
|
v
VM
IOMMU zapewnia izolację dostępu urządzenia do pamięci.
KVM a bezpieczeństwo
Wirtualizacja tworzy dodatkową warstwę izolacji:
Physical Server
|
v
Linux Host
|
v
KVM
|
+----+----+
| |
VM 1 VM 2
Jeżeli VM 1 zostanie przejęta:
Attacker
|
v
VM 1
nie powinien automatycznie uzyskać dostępu do:
VM 2
Host Kernel
Other Devices
Ale VM escape jest realnym zagrożeniem
Wirtualizacja nie jest magiczną barierą.
Błąd w:
QEMU
KVM
virtio
device emulation
VFIO
może potencjalnie prowadzić do:
Guest
|
v
Vulnerability
|
v
Host
Dlatego hypervisor i QEMU muszą być regularnie aktualizowane.

KVM Security Best Practices
W środowisku produkcyjnym warto:
✔ aktualizować kernel
✔ aktualizować QEMU/libvirt
✔ ograniczać dostęp do management API
✔ stosować SELinux/AppArmor
✔ izolować sieci VM
✔ używać minimalnych VM images
✔ monitorować hosta
✔ ograniczać passthrough urządzeń
✔ stosować backupy
KVM + libvirt
Zamiast ręcznie zarządzać QEMU można używać:
libvirt
Schemat:
Administrator
|
v
libvirt
|
v
QEMU
|
v
KVM
|
v
Hardware
Typowe narzędzia:
virsh
virt-install
virt-manager
Prosta VM z virt-install
Przykład:
virt-install \
--name ubuntu-server \
--memory 4096 \
--vcpus 2 \
--disk size=30 \
--network network=default \
--os-variant ubuntu24.04 \
--cdrom ubuntu-server.iso
libvirt przygotuje konfigurację, a QEMU uruchomi maszynę wykorzystując KVM.
KVM vs kontenery
To bardzo ważne rozróżnienie.
Kontener:
Container
|
v
Host Kernel
VM:
VM
|
Guest Kernel
|
KVM
|
Host Kernel
Docker:
Application
|
Container
|
Linux Kernel
KVM:
Application
|
Guest OS
|
Virtual Hardware
|
KVM
|
Linux Host
VM zapewnia więc znacznie mocniejszą granicę izolacji niż typowy kontener.
KVM vs Docker
| Cecha | KVM | Docker |
|---|---|---|
| Virtualizuje | cały system | procesy |
| Guest kernel | ✅ | ❌ |
| Izolacja | wysoka | niższa |
| Start | sekundy | bardzo szybki |
| Narzut | większy | mały |
| Windows guest | ✅ | ograniczone zastosowanie |
| Linux containers | ❌ | ✅ |
KVM w Proxmox
Jednym z najbardziej popularnych zastosowań KVM jest Proxmox.
Schemat:
Proxmox VE
|
+----------------+
| |
KVM VM LXC
| |
Linux/Windows Container
Proxmox wykorzystuje KVM do pełnej wirtualizacji VM oraz LXC do kontenerów systemowych.
KVM w OpenStack
KVM jest również bardzo popularnym hypervisorem w chmurach prywatnych.
OpenStack
|
v
Compute Node
|
v
KVM
|
+--+--+
| |
VM1 VM2
KVM a Kubernetes
KVM i Kubernetes mogą działać razem.
Przykładowo:
Physical Server
|
v
KVM
|
v
VM
|
v
Kubernetes Node
|
v
Containers
Daje to dodatkową warstwę izolacji:
Hardware
↓
KVM
↓
VM
↓
Kubernetes
↓
Container
KVM i confidential computing
Nowoczesne procesory pozwalają dodatkowo chronić pamięć VM.
Przykłady:
AMD SEV
AMD SEV-SNP
Intel TDX
Schemat:
VM Memory
|
v
Hardware Encryption
|
v
Protected Guest
To jest szczególnie interesujące w chmurach i środowiskach, w których nie chcemy całkowicie ufać hostowi.
KVM a przyszłość
KVM pozostaje jednym z fundamentów infrastruktury:
Private Cloud
|
Public Cloud
|
Virtualization
|
KVM
W połączeniu z:
QEMU
libvirt
Virtio
VFIO
IOMMU
Ceph
Proxmox
OpenStack
tworzy kompletny ekosystem wirtualizacji Linux.
KVM – pełny obraz
PHYSICAL SERVER
|
v
CPU / RAM / NIC
|
v
Linux Kernel
|
+------------+------------+
| |
KVM Linux
| |
v |
QEMU |
| |
+------+------+ |
| | |
VM 1 VM 2 |
| | |
Linux/Win Linux |
| | |
virtio virtio |
| | |
+------+------+
|
Virtual Network
Najważniejsze do zapamiętania
KVM
→ wirtualizacja w jądrze Linux
QEMU
→ emulacja sprzętu i proces VM
libvirt
→ zarządzanie VM
Virtio
→ wydajne urządzenia wirtualne
VFIO
→ PCI Passthrough
IOMMU
→ izolacja dostępu urządzeń
VMEXIT
→ przejście z guest do hypervisora
KVM + QEMU
→ pełna wirtualizacja
KVM jest jednym z fundamentów współczesnej infrastruktury Linux. W przeciwieństwie do kontenerów zapewnia pełną wirtualizację systemu operacyjnego, a dzięki wykorzystaniu VT-x/AMD-V, Virtio, IOMMU i VFIO może oferować bardzo wysoką wydajność przy zachowaniu silnej izolacji między maszynami.






