Émulateur Qemu - Kvm - Script

Mise à jour : Debian Bulleseye 11.1

Références

Sommaire

1 - Installation

(hôte) $ sudo aptitude install qemu-system-x86 ovmf tigervnc-viewer ssh
(invité) $ sudo aptitude install ssh
#! /usr/bin/env bash

AIDE="\nAide : $(basename $0) [-h] [-s] [-n|-H|-M] [-g|-m|-v|-S] [-u|-U|-Z] [-d cd_name] [-c disk1_name] [-e disk2_name] [-b cdrom|cdrom_once] \n\n
Description des options \n\n
-h = Affichage de l'aide \n\n

# Par défaut, la commande d'émulation est lancée avec les droits non privilégiés \n
#Sélectionner l'option -s, si un périphérique réél (/dev/sdx, ...) est connecté \n
-s = sudo \n\n

# Par défaut, la connexion réseau standard est activée \n
# Sélectionner une option parmi les suivantes pour modifier le type de connexion réseau \n
-n = Désactivation réseau (non compatible samba et ssh) \n
-H = Activation interface ssh (non compatible samba) \n
-M = Activation interface samba (non compatible ssh) \n\n

# Par défaut, l'affichage s'effectue dans l'interface qemu-gtk
# Sélectionner une option parmi les suivantes pour changer l'affichage \n
-g = Affichage émulateur série et moniteur qemu dans console hôte. NOTE : l'émulateur série nécessite redirection dans ligne cde noyau: console=ttys0 \n
-m = Affichage émulateur VGA et émulateur série dans qemu-gtk, affichage moniteur qemu dans console hôte \n
-v = Affichage vnc \n
-S = Affichage spicy \n\n

# Par défaut, l'amorçage est du type MBR/Bios \n
# Sélectionner une option parmi les suivantes pour changer le type d'amorçage \n
-u = Amorçage uefi non secure boot - Nvram Lecture seule - Origine ovmf Debian \n
-U = Amorçage uefi non secure boot - Nvram Lecture / Ecriture - Origine ovmf Debian \n
-Z = Amorçage uefi secure boot - Nvram Lecture / Ecriture - Origine ovmf SUZE \n\n

# Par défaut, aucun disque n'est présent et le bios par défaut ou sélectionné s'affiche \n
# Sélectionner 1,2 ou 3 des options suivantes en fonction des besoins \n
-d cd_name = Cdrom (fichier.iso ou /dev/cdrom) \n
-c disk1_name = Disk1 (fichier.raw ou fichier.qcow2 ou /dev/****) \n
-e disk2_name = Disk2 (fichier.raw ou fichier.qcow2 ou /dev/****) \n\n

# Par défaut, l'amorçage s'effectue en priorité, sur le disque c si présent, puis sur le disque e si présent, puis sur le cdrom si présent \n
# Sélectionner une des options suivantes, pour modifier les priorités d'amorçage \n
-b cdrom = priorité amorçage sur le cdrom \n
-b cdrom_once = priorité amorçage sur le cdrom une fois, puis amorçage sur disk1 les fois suivantes \n\n

# Notes \n
Utilisation console interface série :\n
Activer l'affichage de la console sur l'interface série en ajoutant dans ligne de commande du noyau: console=ttys0 \n\n

Utilisation ssh : \n
Installer ssh dans l'hôte et l'invité
Lancement client ssh depuis l'hôte : ssh <nom_utilisateur_invité>@localhost -p 5022 \n
Lancement client ssh depuis l'invité : ssh 10.0.2.2 \n\n

Utilisation samba :\n
Créer un dossier de partage ~/samba sur l'hôte \n\n"

###### Initialisation des variables

# Commande de base : par défaut sans sudo, avec carte graphique virtio
QEMU="qemu-system-x86_64 -m 2048 -smp 4 -accel kvm -cpu host"

# SUDO et RUNAS (désactivés par défaut)
SUDO=""
RUNAS=""

# Option réseau (Par défaut, réseau activé)
NET=""

# Par défaut,interface ssh non activée
SSH=""

# Par défaut,interface samba non activée
SMB=""

# Par défaut, affichage gtk,carte graphique vga standard, moniteur vc
DISP="-display gtk -vga std -monitor vc"

# Amorçage : Bios seabios par défaut
BIOS="-bios /usr/share/seabios/bios.bin"

# nom (fichiers ou périphériques) cdrom et disques, par défaut, absents
CDROM=""
DISK1=""
DISK2=""

# boot Par défaut, boot avec affichage menu
BOOT="-boot menu=on"

echo -e "\nListe des options sélectionnées :"

###### Traitement des options
while getopts "hsnHMgmvSuUZd:c:e:b:" Option; do

case $Option in

h) echo "Option -$Option = Aide"
# Affichage de l'aide
echo -e $AIDE
exit
;;

s) echo "Option -$Option = sudo"
# Obtention des droits root
sudo true
SUDO="sudo"
RUNAS="-runas $USER"
;;

n) echo "Option -$Option = Désactivation réseau"
# Désactivation réseau
NET="-net none"
;;

H) echo "Option -$Option = Activation interface ssh"
#SSH="-net nic -net user,hostfwd=tcp::5022-:22"
SSH="-nic user,hostfwd=tcp::5022-:22"
;;

M) echo "Option -$Option = Activation interface samba"
#SMB="-net nic -net user,smb=/home/$USER/samba" -
SMB="-nic user,smb=/home/$USER/samba"
;;

g) echo "Option -$Option = Affichage dans console hôte"
DISP="-nographic"
;;

m) echo "Option -$Option = Affichage du moniteur qemu dans console hôte"
DISP="-display gtk -vga std -monitor stdio"
;;

v) echo "Option -$Option = Affichage VNC"
DISP="-vga std -vnc :1 & sleep 0.5 && vncviewer :1 && pkill qemu"
;;

S) echo "Option -$Option = Affichage SPICE"
DISP="-vga qxl -spice port=5900,addr=127.0.0.1,disable-ticketing -device virtio-serial-pci \
-device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 -chardev spicevmc,id=spicechannel0,name=vdagent \
& sleep 0.5 && spicy -h 127.0.0.1 -p 5900 && pkill spicy"
;;

u) echo "Option -$Option = Amorçage uefi avec Nvram Lecture seulement - Non secure boot"
BIOS="-drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/OVMF.fd"
;;

U) echo "Option -$Option = Amorçage uefi avec Nvram Lecture / Ecriture - Non secure boot"

# Si un fichier OVMF_CODE.fd ou/et OVMF_VARS.fd est présent le conserver, sinon le recopier depuis l'original
[[ -e OVMF_CODE.fd ]] || cp /usr/share/OVMF/OVMF_CODE.fd ./
[[ -e OVMF_VARS.fd ]] || cp /usr/share/OVMF/OVMF_VARS.fd ./

BIOS="-machine pc-q35-2.5 -global ICH9-LPC.disable_s3=1 -drive if=pflash,format=raw,readonly,file=./OVMF_CODE.fd -drive if=pflash,format=raw,file=./OVMF_VARS.fd"
;;

Z) echo "Option -$Option = Amorçage uefi avec Nvram Lecture / Ecriture - Secure boot SUZE"

# Si un fichier OVMF_CODE.secureboot.fd ou/et OVMF_VARS.secureboot.df est présent le conserver, sinon le recopier depuis l'original
[[ -e OVMF_CODE.secboot.fd ]] || cp /opt/suze/ovmf/OVMF_CODE.secboot.fd ./
[[ -e OVMF_VARS.secboot.fd ]] || cp /opt/suze/ovmf/OVMF_VARS.secboot.fd ./

BIOS="-machine pc-q35-2.5 -drive if=pflash,format=raw,readonly,file=./OVMF_CODE.secboot.fd -drive if=pflash,format=raw,file=./OVMF_VARS.secboot.fd"
;;

d) echo "Option -$Option = cdrom"
CDROM="-drive media=cdrom,format=raw,file=$OPTARG"
;;

c) echo "Option -$Option = disk1"
# Par défaut, format=raw
DISK1="-drive media=disk,format=raw,file=$OPTARG"

# Si fichier a pour extension .qcow2, changer le format raw en format qcow2
DISK1=$(echo $DISK1 |sed "/file=.*.qcow2/{s/format=raw/format=qcow2/}")
;;

e) echo "Option -$Option = disk2"
# Par défaut, format=raw
DISK2="-drive media=disk,format=raw,file=$OPTARG"

# Si fichier a pour extension .qcow2, changer le format raw en formwt qcow2
DISK2=$(echo $DISK2 |sed "/file=.*.qcow2/{s/format=raw/format=qcow2/}")
;;

b) case $OPTARG in

cdrom) echo "Option -$Option $OPTARG = Amorçage cdrom"
# Amorçage cdrom
BOOT="-boot menu=on,order=d"
;;

cdrom_once) echo "Option -$Option $OPTARG = Amorçage cdrom une fois, puis disque"
# Amorçage sur cdrom puis sur disk1
BOOT="-boot menu=on,once=d,order=c"
;;

*) echo "Option -$Option $OPTARG = Option inconnue - Saisir $(basename $0) -h pour afficher l'aide"
exit
;;
esac
;;

*) echo "Option -$Option = Option inconnue - Saisir $(basename $0) -h pour afficher l'aide"
exit
;;

esac
done

# Construction de la commande
qemu="$SUDO $QEMU $RUNAS $NET $SSH $SMB $BIOS $CDROM $DISK1 $DISK2 $BOOT $DISP"

# Suppression des espaces vides et enregistrement de la commande
echo -e $qemu >/tmp/qemu.txt

# Affichage de la commande
echo -e "\nPour information la commande est \n"
cat /tmp/qemu.txt
echo ""

# Lancement de la commande
source /tmp/qemu.txt
exit
QEMU="qemu-system-x86_64 -m 2048 -smp 4 -accel kvm -cpu host"

pour adapter la valeur affectée à la mémoire et au nombre de processeurs

$ chmod +x qemu.sh

2 - Utilisation

2.1 - Affichage de l'aide

$ qemu.sh -h

Liste des options sélectionnées :
Option -h = Aide


Aide : qemu.sh [-h] [-s] [-n|-H|-M] [-g|-m|-v|-S] [-u|-U|-Z] [-d cd_name] [-c disk1_name] [-e disk2_name] [-b cdrom|cdrom_once]

Description des options

-h = Affichage de l'aide

# Par défaut, la commande d'émulation est lancée avec les droits non privilégiés
#Sélectionner l'option -s, si un périphérique réél (/dev/sdx, ...) est connecté
-s = sudo

# Par défaut, la connexion réseau standard est activée
# Sélectionner une option parmi les suivantes pour modifier le type de connexion réseau
-n = Désactivation réseau (non compatible samba et ssh)
-H = Activation interface ssh (non compatible samba)
-M = Activation interface samba (non compatible ssh)

# Par défaut, l'affichage s'effectue dans l'interface qemu-gtk # Sélectionner une option parmi les suivantes pour changer l'affichage
-g = Affichage émulateur série et moniteur qemu dans console hôte. NOTE : l'émulateur série nécessite redirection dans ligne cde noyau: console=ttys0
-m = Affichage émulateur VGA et émulateur série dans qemu-gtk, affichage moniteur qemu dans console hôte
-v = Affichage vnc
-S = Affichage spicy

# Par défaut, l'amorçage est du type MBR/Bios
# Sélectionner une option parmi les suivantes pour changer le type d'amorçage
-u = Amorçage uefi non secure boot - Nvram Lecture seule - Origine ovmf Debian
-U = Amorçage uefi non secure boot - Nvram Lecture / Ecriture - Origine ovmf Debian
-Z = Amorçage uefi secure boot - Nvram Lecture / Ecriture - Origine ovmf SUZE

# Par défaut, aucun disque n'est présent et le bios par défaut ou sélectionné s'affiche
# Sélectionner 1,2 ou 3 des options suivantes en fonction des besoins
-d cd_name = Cdrom (fichier.iso ou /dev/cdrom)
-c disk1_name = Disk1 (fichier.raw ou fichier.qcow2 ou /dev/****)
-e disk2_name = Disk2 (fichier.raw ou fichier.qcow2 ou /dev/****)

# Par défaut, l'amorçage s'effectue en priorité, sur le disque c si présent, puis sur le disque e si présent, puis sur le cdrom si présent
# Sélectionner une des options suivantes, pour modifier les priorités d'amorçage
-b cdrom = priorité amorçage sur le cdrom
-b cdrom_once = priorité amorçage sur le cdrom une fois, puis amorçage sur disk1 les fois suivantes

# Notes
Utilisation console interface série :
Activer l'affichage de la console sur l'interface série en ajoutant dans ligne de commande du noyau: console=ttys0

Utilisation ssh :
Installer ssh dans l'hôte et l'invité Lancement client ssh depuis l'hôte : ssh <nom_utilisateur_invité>@localhost -p 5022
Lancement client ssh depuis l'invité : ssh 10.0.2.2

Utilisation samba :
Créer un dossier de partage ~/samba sur l'hôte

2.2 - Modes uefi

3 - Exemples

3.1 - Installation debian sur disque virtuel

On suppose disponible dans le répertoire

$ qemu.sh -d debian.iso -c debian.raw -b cdrom_once

Options sélectionnées :
Option -d = cdrom
Option -c = disk1
Option -b cdrom_once = Amorçage cdrom une fois, puis disque

Pour information la commande est

qemu-system-x86_64 -m 2048 -smp 4 -accel kvm -cpu host -bios /usr/share/seabios/bios.bin -drive media=cdrom,format=raw,file=debian.iso -drive media=disk,format=raw,file=debian.raw -boot menu=on,once=d,order=c -display gtk -vga std -monitor vc
.....

3.2 - Exemple : Installation debian sur disque réel - amorçage uefi - affichage vnc

On suppose disponible

$ qemu.sh -s -u -v -d debian.iso -c /dev/sdb -b cdrom_once

Options sélectionnées :
Option -s = sudo
Option -u = Amorçage uefi avec Nvram Lecture seulement - Non secure boot
Option -v = Affichage VNC
Option -d = cdrom
Option -c = disk1
Option -b cdrom_once = Amorçage cdrom une fois, puis disque

Pour information la commande est

sudo qemu-system-x86_64 -m 2048 -smp 4 -accel kvm -cpu host -runas philippe -drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/OVMF.fd -drive media=cdrom,format=raw,file=debian.iso -drive media=disk,format=raw,file=/dev/sdb -boot menu=on,once=d,order=c -vga std -vnc :1 & sleep 0.5 && vncviewer :1 && pkill qemu
......