Quitter le forum et retourner au site

KVM a encore frappé !

Vous avez un didactiel ou une astuce particulière concernant un logiciel, partagez votre expérience dans cette partie.
Avatar de l’utilisateur
le Manchot Masqué
Administrateur du site
Messages : 719
Inscription : lun. 26 mai 2008, 21:05
Distribution : Debian, Ubuntu
Niveau : Moitié plein !
Localisation : Guebwiller

KVM a encore frappé !

Message par le Manchot Masqué »

C'est les vacances (pour ceux qui en ont). Il est donc temps de s'amuser un peu avec des défis impossibles.

Votre mission du jour, si vous l'acceptez, sera de créer une machine virtuelle Debian9 sur un serveur distant en SSH, en mode console histoire de corser le jeu, le tout sans aucun téléchargement d'image ISO !

On ne s'attaquera pas tout de suite au réseau lié à la machine virtuelle : on utilisera dans un premier temps le bridge interne virbr0 fournit par libvirt (à installer).

Avant de se lancer, je recommande l'ouverture et l'utilisation d'un xterm classique sur le serveur distant, via la commande du même nom. Ce n'est pas une obligation en soi, mais les terminaux de nos environnements graphiques usuels ont souvent leurs petits réglages "maison", lesquels peuvent poser quelques problèmes d'affichage dans une installation en mode console. A bon entendeur.

Une fois connecté en SSH au serveur :

Etape 1 / Création d'un disque de 20 Go au format qcow2 qui contiendra la machine virtuelle :

Code : Tout sélectionner

apt-get install qemu-utils
qemu-img create -f qcow2 -o preallocation=metadata /votre_dossier_des_machines_virtuelles/vm.debian.qcow2 20G
Etape 2 / Installation de la Debian9 depuis l'internet dans la machine :

Code : Tout sélectionner

apt-get install virtinst
virt-install --connect qemu:///system --name=vmdebian --ram=1024 --vcpus=1 --disk path=/votre_dossier_des_machines_virtuelles/vm.debian.qcow2,format=qcow2,bus=virtio,cache=none --os-type linux --accelerate --network bridge=virbr0,model=virtio --nographics --location='http://ftp.fr.debian.org/debian/dists/stretch/main/installer-amd64/' --extra-args='console=ttyS0'
Etape 3 / Connexion à la VM via :

Code : Tout sélectionner

virsh console vmdebian
Mais là : au démarrage de la VM, c'est le drame ! Le démarrage du noyau s'arrête sur des lignes du type

Code : Tout sélectionner

Booting a command list

Loading Linux 4.9.0-3-amd64 ...
Loading initial ramdisk ...
En fait, il manque juste la console indiquée lors de la création. On édite donc le noyau au démarrage via la touche 'e' dans GRUB, on va à la fin de la ligne "linux..." et on remplace l'option "quiet" (parfaitement inutile) par "console=ttyS0", puis enfin on fait un CTRL-X pour démarrer. Si tout va bien, on doit arriver à l'invité.

Pour ne pas à avoir à se farcir cette manipulation à chaque démarrage, on peut procéder de deux façons.

Dans les deux cas, on commence par démarrer la machine virtuelle avec la manipulation ci-dessus, et on se connecte sous root.

1 / Choix 1

Dans /etc/default/grub, on remplace l'option "quiet" par le "console=ttyS0" déjà vu, puis on fait un "update-grub" et un "reboot" pour vérifier que tout est ok.

2 / Choix 2

On laisse le /etc/default/grub en paix, et l'on utilise le "systemd" qui s'occupe du démarrage du système (merci à http://www.server-world.info/en/note?os ... &p=kvm&f=2 pour l'astuce !)

Code : Tout sélectionner

systemctl enable getty@ttyS0
puis on redémarre la machine avec un "reboot".

3 / Choix 3

On fait les deux manipulations comme un gros bourrin, et on se retrouve avec deux terminaux qui se chevauchent et foutent le bordel ! (c'est tellement plus amusant !)

A noter :

Toutes les machines peuvent être contrôlées en console via la commande "virsh".

Quelques exemples :

a) On cas de problème, on peut arrêter la machine avec un :

Code : Tout sélectionner

virsh shutdown vmdebian
et si ça bloque (mode bourrin)

Code : Tout sélectionner

virsh destroy vmdebian
b) Si on a raté la création de sa machine, on peut détruire proprement sa machine via un :

Code : Tout sélectionner

virsh undefine vmdebian
avant de recommencer la création de la VM avec la commande virt-install

Il y a plein d'autres outils très sympas à découvrir (cf. commandes virt-qqchose pour ceux qui veulent aller plus loin).

Seule petite ombre au tableau : virsh ne mémorise par l'historique des commandes. Il faut donc tout se retaper à la main.

Pour la partie réseau, si on veut connecter la nouvelle VM sur la configuration existante, il faut se construire un bridge côté serveur.

Exemple de bridge statique (si le serveur à une IP fixe) :

Code : Tout sélectionner

# cat /etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.1.1
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
        dns-nameservers 8.8.8.8
Exemple de bridge dynamique (si le serveur reçoit lui-même une IP dynamique) :

Code : Tout sélectionner

# cat /etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
Attention : ne faites pas ces modifs sans savoir ce que vous faites, surtout avec systemd qui est capable de bloquer le démarrage en cas de problème de configuration réseau (longs timeout).

D'après la documentation, il est possible de créer automatiquement le bridge à partir de l'interface réseau bridgée (pas testé) :

Code : Tout sélectionner

virsh iface-bridge eth0 br0
Si le bridge existe déjà (imaginons ici un br0), on arrête la VM (virsh shutdown/destroy vmdebian), on exporte la configuration dans un fichier XML (virsh dumpxml vmdebian > /tmp/vmdebian.xml), et on modifie les lignes

Code : Tout sélectionner

<interface type='bridge'>
      <mac address='51:54:12:0c:e3:13'/>
      <source bridge='virbr0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </interface>
en:

Code : Tout sélectionner

<interface type='bridge'>
      <mac address='51:54:12:d1:b1:21'/>
      <source bridge='br0'/>
      <model type='virtio'/>
    </interface>
(La ligne en <address...> sera recréée par libvirt)

Il faut ensuite recharger sa VM :

Code : Tout sélectionner

virsh create /tmp/vmdebian.xml
Et comme la commande précédente démarre tout de suite la VM, il ne reste plus qu'à s'y connecter via :

Code : Tout sélectionner

virsh console vmdebian
Petit résumé pour la création des domaines

Code : Tout sélectionner

virsh create/undefine domaine
Petit résumé pour la gestion des domaines

Code : Tout sélectionner

virsh start/shutdown/destroy/suspend/resume domaine
Liste de toutes les VMs KVM configurées et de leurs états.

Code : Tout sélectionner

virsh -c qemu:///system list --all
Et pour tout le reste :

Code : Tout sélectionner

virsh help|less
et le web, bien sûr !
Répondre