{"id":597,"date":"2024-04-15T16:26:26","date_gmt":"2024-04-15T15:26:26","guid":{"rendered":"http:\/\/almic.fr\/blog\/?p=597"},"modified":"2025-11-16T01:45:01","modified_gmt":"2025-11-16T00:45:01","slug":"kvm-installation-et-usage-courant","status":"publish","type":"post","link":"https:\/\/almic.fr\/blog\/2024\/04\/15\/kvm-installation-et-usage-courant\/","title":{"rendered":"KVM : installation et usage courant"},"content":{"rendered":"<p style=\"text-align: justify;\">KVM est l\u2019hyperviseur du noyau Linux permettant d\u2019ex\u00e9cuter des machines virtuelles, avec un OS d\u00e9di\u00e9 pour chacune d\u2019entre elles. KVM n\u00e9cessite un processeur avec les extensions de virtualisation, mais en retour il offre de bien meilleures performances que la paravirtualisation. Voici un guide pour Debian.<\/p>\n<p><!--more--><\/p>\n<h2>Installation<\/h2>\n<p style=\"text-align: justify;\">Pour commencer, il faut v\u00e9rifier que votre CPU dispose des extensions VMX ou SVM :<\/p>\n<pre>% grep --color -E 'vmx|svm' \/proc\/cpuinfo<\/pre>\n<p style=\"text-align: justify;\">Ensuite on installe les paquets de base :<\/p>\n<pre># apt install qemu-system libvirt-daemon-system virtinst qemu-utils<\/pre>\n<p style=\"text-align: justify;\">Pour le r\u00e9seau :<\/p>\n<pre># apt install dnsmasq-base mdevctl bridge-utils<\/pre>\n<p style=\"text-align: justify;\">Si vous avez pr\u00e9vu d\u2019utiliser Windows 11 dans une VM :<\/p>\n<pre># apt install ovmf swtpm swtpm-tools<\/pre>\n<p style=\"text-align: justify;\">Si vous pr\u00e9f\u00e9rez g\u00e9rer vos VM avec une interface graphique, plut\u00f4t qu\u2019avec des lignes de commande :<\/p>\n<pre># apt install virt-manager gir1.2-spiceclientgtk-3.0<\/pre>\n<p style=\"text-align: justify;\">Depuis Bookworm, les limites d\u2019UID et GID pour les utilisateurs syst\u00e8mes ont chang\u00e9. Si vous aviez d\u00e9j\u00e0 install\u00e9 KVM sur ce syst\u00e8me par le pass\u00e9, \u00e7a peut causer cette erreur :<\/p>\n<pre>useradd warning: libvirt-qemu's uid 64055 is greater than SYS_UID_MAX 999<\/pre>\n<p style=\"text-align: justify;\">Dans ce cas, choisissez de nouveaux UID et GID < 999. On v\u00e9rifie qu\u2019ils ne soient pas d\u00e9j\u00e0 utilis\u00e9s, on corrige le probl\u00e8me, puis on r\u00e9attribue les fichiers syst\u00e8mes.<\/p>\n<pre>% getent passwd 150\r\n% getent group 150\r\n# usermod -u 150 libvirt-qemu\r\n# groupmod -g 150 libvirt-qemu\r\n# find \/var\/lib\/libvirt -user 64055 -exec chown -h libvirt-qemu {} ;\r\n# find \/var\/lib\/libvirt -group 64055 -exec chgrp -h libvirt-qemu {} ;<\/pre>\n<p style=\"text-align: justify;\">V\u00e9rifiez que l&rsquo;installation de base fonctionne :<\/p>\n<pre># virsh list --all\r\n Id   Name   State\r\n--------------------<\/pre>\n<p style=\"text-align: justify;\">Quand on utilise virsh en simple utilisateur, il se connecte \u00e0 libvirt via qemu:\/\/\/session. Mais les VMs utilisant qemu:\/\/\/session ont certaines limitations, notamment l&rsquo;impossibilit\u00e9 d&rsquo;utiliser les dossiers partag\u00e9s avec virtiofs. Pour acc\u00e9der aux VM du syst\u00e8me en simple utilisateur, il faut rajouter \u00ab &#45;&#45;connect qemu:\/\/\/system \u00bb quand on utilise virsh. Pour \u00e9viter de surcharger tous les appels \u00e0 virsh, on peut cr\u00e9er cette variable d\u2019environnement dans <i>~\/.zshrc<\/i> ou <i>~\/.bashrc<\/i> :<\/p>\n<pre>export LIBVIRT_DEFAULT_URI=\"qemu:\/\/\/system\"<\/pre>\n<p style=\"text-align: justify;\">Ajoutez votre utilisateur au groupe libvirt :<\/p>\n<pre># adduser <USER> libvirt<\/pre>\n<p style=\"text-align: justify;\">D\u00e9connectez-vous, reconnectez-vous, et v\u00e9rifiez que tout fonctionne :<\/p>\n<pre>% virsh list --all\r\n Id   Name   State\r\n--------------------<\/pre>\n<p style=\"text-align: justify;\">Pour d\u00e9marrer le r\u00e9seau des VM, et faire en sorte qu\u2019il soit d\u00e9marr\u00e9 automatiquement avec le syst\u00e8me h\u00f4te :<\/p>\n<pre>% virsh net-start default\r\n% virsh net-autostart default<\/pre>\n<h2>Utilisation courante<\/h2>\n<h4>Cr\u00e9ation de VM<\/h4>\n<p style=\"text-align: justify;\">Cr\u00e9er une VM Debian en netinstall :<\/p>\n<pre>% virt-install --name &lt;NEW_VM&gt; --virt-type kvm \\\r\n--vcpus=2 --memory 8192 \\\r\n--disk size=20 -o preallocation=off \\\r\n--os-variant debian12 \\\r\n--location https:\/\/deb.debian.org\/debian\/dists\/bookworm\/main\/installer-amd64\/<\/pre>\n<p style=\"text-align: justify;\">Cr\u00e9er une VM Debian avec une image ISO :<\/p>\n<pre>% virt-install --name &lt;NEW_VM&gt; --virt-type kvm \\\r\n--vcpus=2 --memory 8192 \\\r\n--disk size=20 -o preallocation=off \\\r\n--os-variant debian12 \\--cdrom &lt;PATH&gt;\/debian-live-12.5.0-amd64-xfce.iso<\/pre>\n<p style=\"text-align: justify;\">Cr\u00e9er une VM Debian en mode console :<\/p>\n<pre>% virt-install --name &lt;NEW_VM&gt; --virt-type kvm \\\r\n--vcpus=1 --memory 2048 \\\r\n--disk size=10 -o preallocation=off \\\r\n--graphics none --console pty,target_type=serial --extra-args \"console=ttyS0\" \\\r\n--os-variant debian12 \\\r\n--location https:\/\/deb.debian.org\/debian\/dists\/bookworm\/main\/installer-amd64\/<\/pre>\n<p style=\"text-align: justify;\">Importer une VM Windows 10 :<\/p>\n<pre>% virt-install --name &lt;NEW_VM&gt; --virt-type kvm \\\r\n--vcpus=2 --memory 16384 \\\r\n--os-variant win10 \\\r\n--disk &lt;PATH_IMAGE&gt; \\\r\n--import<\/pre>\n<p style=\"text-align: justify;\">Importer une VM Windows 11, qui n\u00e9cessite UEFI et TPM :<\/p>\n<pre>% virt-install --name &lt;NEW_VM&gt; --virt-type kvm \\\r\n--vcpus=2 --memory 16384 \\\r\n--os-variant win11 \\\r\n--video virtio --features kvm_hidden=on,smm=on \\\r\n--tpm backend.type=emulator,backend.version=2.0,model=tpm-tis \\\r\n--boot loader=\/usr\/share\/OVMF\/OVMF_CODE.secboot.fd,loader_ro=yes,loader_type=pflash,nvram_template=\/usr\/share\/OVMF\/OVMF_VARS.ms.fd \\\r\n--disk &lt;PATH_IMAGE&gt; \\\r\n--import<\/pre>\n<h4>Attribuer une IP fixe \u00e0 une VM<\/h4>\n<p style=\"text-align: justify;\">On modifie la configuration du r\u00e9seau par d\u00e9faut :<\/p>\n<pre>% virsh net-edit default\r\n&lt;network&gt;\r\n  &lt;name&gt;default&lt;\/name&gt;\r\n  &lt;forward mode='nat'\/&gt;\r\n  &lt;bridge name='virbr0' stp='on' delay='0'\/&gt;\r\n  &lt;mac address='52:54:00:00:00:00'\/&gt;\r\n  &lt;ip address='192.168.122.254' netmask='255.255.255.0'&gt;\r\n    &lt;dhcp&gt;\r\n      &lt;range start='192.168.122.100' end='192.168.122.200'\/&gt;\r\n      &lt;host mac='52:54:00:00:00:01' name='VM1' ip='192.168.122.1'\/&gt;\r\n      &lt;host mac='52:54:00:00:00:02' name='VM2' ip='192.168.122.2'\/&gt;\r\n    &lt;\/dhcp&gt;\r\n  &lt;\/ip&gt;\r\n&lt;\/network&gt;<\/pre>\n<p style=\"text-align: justify;\">On red\u00e9marre le r\u00e9seau pour que les changements prennent effet :<\/p>\n<pre>% virsh net-destroy default\r\n% virsh net-start default<\/pre>\n<h4>Partager un dossier de l\u2019h\u00f4te avec une VM<\/h4>\n<p style=\"text-align: justify;\">On ne peut partager qu&rsquo;un seul dossier du syst\u00e8me h\u00f4te pour chaque VM.<\/p>\n<pre>% virsh edit &lt;VM&gt;\r\n  &lt;memoryBacking&gt;\r\n    &lt;source type='memfd'\/&gt;\r\n    &lt;access mode='shared'\/&gt;\r\n  &lt;\/memoryBacking&gt;\r\n\r\n[\u2026]\r\n\r\n  &lt;filesystem type='mount' accessmode='passthrough'&gt;\r\n    &lt;driver type='virtiofs'\/&gt;\r\n    &lt;source dir='&lt;PATH_FOLDER&gt;'\/&gt;\r\n    &lt;target dir='mount_virtio'\/&gt;\r\n  &lt;\/filesystem&gt;<\/pre>\n<p style=\"text-align: justify;\">Dans la VM, vous pouvez alors monter le dossier partag\u00e9 avec :<\/p>\n<pre># mount -t virtiofs mount_virtio \/mnt\/virtio\/<\/pre>\n<p style=\"text-align: justify;\">Pour que ce montage soit automatique au d\u00e9marrage de la VM, ajoutez cette ligne \u00e0 son <i>\/etc\/fstab<\/i> :<\/p>\n<pre>mount_virtio \/mnt\/virtio\/ virtiofs defaults,noatime,_netdev 0 0<\/pre>\n<h4>Monter l\u2019image d\u2019une VM (format qcow2)<\/h4>\n<p style=\"text-align: justify;\">Pour acc\u00e9der au contenu d\u2019un disque virtuel d\u2019une VM \u00e9teinte, sans avoir \u00e0 la d\u00e9marrer :<\/p>\n<pre># modprobe nbd max_part=8\r\n# qemu-nbd --connect=\/dev\/nbd0 &lt;PATH_IMAGE&gt;<\/pre>\n<p style=\"text-align: justify;\">On regarde la table de partitions de l&rsquo;image, pour savoir quelle partition monter.<\/p>\n<pre># fdisk \/dev\/nbd0 -l\r\n# mount \/dev\/nbd0p2 \/mnt\/mnt1\/<\/pre>\n<p style=\"text-align: justify;\">Vous pouvez maintenant acc\u00e9der au contenu de l\u2019image dans <i>\/mnt\/mnt1\/<\/i>. Quand vous avez fini les modifications que vous aviez besoin de faire :<\/p>\n<pre># umount \/mnt\/mnt1\/\r\n# qemu-nbd --disconnect \/dev\/nbd0\r\n# rmmod nbd<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>KVM est l\u2019hyperviseur du noyau Linux permettant d\u2019ex\u00e9cuter des machines virtuelles, avec un OS d\u00e9di\u00e9 pour chacune d\u2019entre elles. KVM n\u00e9cessite un processeur avec les extensions de virtualisation, mais en retour il offre de bien meilleures performances que la paravirtualisation. Voici un guide pour Debian.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-597","post","type-post","status-publish","format-standard","hentry","category-hebergement","radius"],"_links":{"self":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts\/597","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/comments?post=597"}],"version-history":[{"count":22,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts\/597\/revisions"}],"predecessor-version":[{"id":619,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts\/597\/revisions\/619"}],"wp:attachment":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/media?parent=597"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/categories?post=597"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/tags?post=597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}