KVM – Linux Kernel-based Virtual Machine od środka
Wirtualizacja

KVM – Linux Kernel-based Virtual Machine od środka

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.

Intel:

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 – Linux Kernel-based Virtual Machine od środka
KVM – Linux Kernel-based Virtual Machine od środka

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.

Polecane wpisy
Automatyzacja zadań administracyjnych za pomocą skryptów i narzędzi
Automatyzacja zadań administracyjnych za pomocą skryptów i narzędzi

🤖 Automatyzacja zadań administracyjnych za pomocą skryptów i narzędzi Wraz z rosnącą złożonością środowisk IT oraz potrzebą szybszego wdrażania i Czytaj dalej

Planowanie ciągłości działania (DR) w środowiskach zwirtualizowanych
Planowanie ciągłości działania (DR) w środowiskach zwirtualizowanych

🛡️ Planowanie ciągłości działania (DR) w środowiskach zwirtualizowanych W dzisiejszym cyfrowym świecie, przestoje systemów IT mogą prowadzić do poważnych strat Czytaj dalej

Marek "Netbe" Lampart Inżynier informatyki Marek Lampart to doświadczony inżynier informatyki z ponad 25-letnim stażem w zawodzie. Specjalizuje się w systemach Windows i Linux, bezpieczeństwie IT, cyberbezpieczeństwie, administracji serwerami oraz diagnostyce i optymalizacji systemów. Na netbe.pl publikuje praktyczne poradniki, analizy i instrukcje krok po kroku, pomagając administratorom, specjalistom IT oraz zaawansowanym użytkownikom rozwiązywać realne problemy techniczne.