KVM a encore frappé !
Publié : jeu. 20 juil. 2017, 23:04
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 :
Etape 2 / Installation de la Debian9 depuis l'internet dans la machine :
Etape 3 / Connexion à la VM via :
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
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 !)
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 :
et si ça bloque (mode bourrin)
b) Si on a raté la création de sa machine, on peut détruire proprement sa machine via un :
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) :
Exemple de bridge dynamique (si le serveur reçoit lui-même une IP dynamique) :
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é) :
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
en:
(La ligne en <address...> sera recréée par libvirt)
Il faut ensuite recharger sa VM :
Et comme la commande précédente démarre tout de suite la VM, il ne reste plus qu'à s'y connecter via :
Petit résumé pour la création des domaines
Petit résumé pour la gestion des domaines
Liste de toutes les VMs KVM configurées et de leurs états.
Et pour tout le reste :
et le web, bien sûr !
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
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'
Code : Tout sélectionner
virsh console vmdebian
Code : Tout sélectionner
Booting a command list
Loading Linux 4.9.0-3-amd64 ...
Loading initial ramdisk ...
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
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
Code : Tout sélectionner
virsh destroy vmdebian
Code : Tout sélectionner
virsh undefine vmdebian
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
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
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
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>
Code : Tout sélectionner
<interface type='bridge'>
<mac address='51:54:12:d1:b1:21'/>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
Il faut ensuite recharger sa VM :
Code : Tout sélectionner
virsh create /tmp/vmdebian.xml
Code : Tout sélectionner
virsh console vmdebian
Code : Tout sélectionner
virsh create/undefine domaine
Code : Tout sélectionner
virsh start/shutdown/destroy/suspend/resume domaine
Code : Tout sélectionner
virsh -c qemu:///system list --all
Code : Tout sélectionner
virsh help|less