La virtualisation sous Linux peut de prime abord sembler déroutante de par l’omniprésence des amalgames et approximations dans les explications qui sont données ça et là sur le sujet. On entend presque indistinctement parler de QEMU, KVM, libvirt, rendant de fait la séparation des responsabilités floue et la découverte de ces briques logicielles sinueuse. Et si la ponctalité de mes usages m’ont pendant un moment tenu assez loin d’une clarification pérenne dans mon esprit, c’est ce moment d’attention sur l’historique de conception de ces outils de virtualisation qui me fait apprécier ce qu’est l’ingénieurie logicielle.

En bref

La virtualisation sous Linux repose sur QEMU, capable d’émuler l’environnement d’exécution d’un système d’exploitation, accéléré par KVM, un module du noyeau Linux permettant l’exécution des instructions de la machine cible directement sur le CPU de l’hôte. Enfin, pour faciliter les interactions avec les émulateurs tels que QEMU, Xen, etc., libvirt dispense une API générique et haut niveau pour l’utilisateur, tout en garantissant un principe de moindre moindre privilège et palliant les risques d’un usage malveillant de QEMU.

Historique

Kernel Virtual Machine (KVM)

KVM est développé en 2006 par Avi Kivity, puis intégré en 2007 au noyau Linux. Ce faisant, il rend la virtualisation opérante en palliant un certains nombres problèmes liées à l’exécution en ring 0 ; et ce, en introduisant l’anneau -1 où vit l’hyperviseur décidant de l’accès aux ressources matérielles.1 Ainsi, il est désormais possible d’exécuter des logiciels legacy sur du matériel plus récent, en émulant d’ancienne architecture ; et donc de réaliser des économies d’énergies.

  • Kernel Space Dès le début, l’idée est de déléguer un maximum de traitements à Linux, et n’implémentant que le jeu additionnel d’instruction de virtualisation.1
  • User Space KVM-userspace est un fork de QEMU où sont implémentés les mécanismes d’utilisation de l’API KVM permettant l’exécution de l’OS invité sur le CPU de l’hôte. Les fonctionnalités de kvm-userspace ont été mergées dans QEMU, et sont utilisable avec l’option --enable-kvm.

Info

Lire l’article 1 pour en savoir plus.

QEMU

Libvirt

Stack technique

flowchart TD
    subgraph Outils["Clients (parlent tous à libvirt)"]
        A1[virsh CLI] & A2[virt-install] & A3[virt-manager GUI] & A4[Provider OpenTofu]
    end
    A1 & A2 & A3 & A4 --> L[libvirtd / API libvirt<br/>modèle + XML]
    L --> Q[QEMU<br/>processus par VM, émule les périphériques]
    Q --> K[KVM /dev/kvm<br/>module noyau, accélération VT-x/AMD-V]
    K --> HW[CPU physique]

https://blog.stephane-robert.info/docs/virtualiser/type1/kvm/concepts/ https://avikivity.blogspot.com/2008/12/kvm-userspace-merging-into-upstream.html https://www.redhat.com/en/blog/all-you-need-know-about-kvm-userspace

Footnotes

  1. https://lwn.net/Articles/705160/ 2 3