Si à la base on a un serveur à la hauteur on constate très vite qu'il est plus souple de gérer des machines virtuelles que des serveurs réels. Voici comment configurer le serveur hôte (le serveur réel) puis comment créer un serveur virtuel. Tout ceci a été testé avec Fedora 16 noyau 3.3.0-4.fc16.i686.PAE puis Fedora 18 noyau 3.8.9-200.fc18.x86_64
A: VÉRIFICATIONS
1) Vérification du processeur
grep -E 'vmx|svm' /proc/cpuinfo
Si rien ne s’affiche inutile de continuer car le processeur ne permet pas la virtualisation.
2) Installation des packages utiles
yum groupinstall Virtualisation
3) Vérification de la configuration logiciel
yum groupinstall Virtualisation
3) Vérification de la configuration logiciel
lsmod | grep kvm
Doit afficher un truc comme ca
kvm_intel 126394 0
kvm 346342 1 kvm_intel
sinon essayer
modprobe kvm
modprobe kvm-intel (ou modprobe kvm-amd)
FC16> /etc/init.d/libvirtd status
FC18> systemctl status libvirtd
kvm_intel 126394 0
kvm 346342 1 kvm_intel
sinon essayer
modprobe kvm
modprobe kvm-intel (ou modprobe kvm-amd)
FC16> /etc/init.d/libvirtd status
FC18> systemctl status libvirtd
Doit afficher ce type d'information
libvirtd.service - LSB: daemon for libvirt virtualization API
Loaded: loaded (/etc/rc.d/init.d/libvirtd)
Active: active (running) since Mon, 19 Mar 2012 16:25:13
Process: 2131 ExecStart=/etc/rc.d/init.d/libvirtd start
Main PID: 2137 (libvirtd)
CGroup: name=systemd:/system/libvirtd.service
2137 libvirtd --daemon
2187 /usr/sbin/dnsmasq --strict-order ...
libvirtd.service - LSB: daemon for libvirt virtualization API
Loaded: loaded (/etc/rc.d/init.d/libvirtd)
Active: active (running) since Mon, 19 Mar 2012 16:25:13
Process: 2131 ExecStart=/etc/rc.d/init.d/libvirtd start
Main PID: 2137 (libvirtd)
CGroup: name=systemd:/system/libvirtd.service
2137 libvirtd --daemon
2187 /usr/sbin/dnsmasq --strict-order ...
sinon essayer
/etc/init.d/libvirtd stop (FC18> systemctl stop libvirtd)
/etc/init.d/libvirtd start (FC18> systemctl start libvirtd)
virsh -c qemu:///system list
/etc/init.d/libvirtd stop (FC18> systemctl stop libvirtd)
/etc/init.d/libvirtd start (FC18> systemctl start libvirtd)
virsh -c qemu:///system list
Doit donner une liste vide:
Id Name State
----------------------------------
ifconfig
Doit afficher, en plus des interfaces normales, l'interface virbr0
virbr0 Link encap:Ethernet HWaddr 52:54:00:AB:EA:FD
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Id Name State
----------------------------------
ifconfig
Doit afficher, en plus des interfaces normales, l'interface virbr0
virbr0 Link encap:Ethernet HWaddr 52:54:00:AB:EA:FD
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Ceci est signe que la configuration de base est en place mais on n’utilisera pas virbr0. On va même le retirer pour le remplacer par une interface Bridge.
B: CONFIGURATION RÉSEAU (HOST)
NOTES:
- Depuis Fedora 15 les interfaces ethernet sont nommées em1 em2 ect... à la place de eth0 eth1 .... Dans ce qui suit remplacer em1 par eth0 si vous avez une interface nommée eth0.
- BOOTPROTO=static est la même chose que BOOTPROTO=none
- NETMASK ou PREFIX (deux méthodes pour fixer le réseaux/host)
- DOMAIN ou SEARCH (deux méthodes pour fixer le domaine par défaut)
- Depuis Fedora 15 les interfaces ethernet sont nommées em1 em2 ect... à la place de eth0 eth1 .... Dans ce qui suit remplacer em1 par eth0 si vous avez une interface nommée eth0.
- BOOTPROTO=static est la même chose que BOOTPROTO=none
- NETMASK ou PREFIX (deux méthodes pour fixer le réseaux/host)
- DOMAIN ou SEARCH (deux méthodes pour fixer le domaine par défaut)
1) Désactiver NetworkManager
/etc/init.d/NetworkManager stop
chkconfig NetworkManager off
/etc/init.d/NetworkManager stop
chkconfig NetworkManager off
2) Activer le démarrage classique du réseau
chkconfig --levels 35 network on
/etc/init.d/network restart
3) Rebooter (en ayant la machine à porté de main ;-) pour vérifier que le réseau fonctionne.
4) Configurer l'interface bridge br0
/etc/init.d/network restart
3) Rebooter (en ayant la machine à porté de main ;-) pour vérifier que le réseau fonctionne.
4) Configurer l'interface bridge br0
Créer le fichier /etc/sysconfig/network-scripts/ifcfg-br0 en reprenant les valeurs de ifcfg-em1
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=none
IPADDR=<ip de ifcfg-em1>
PREFIX=<valeur de ifcfg-em1>
GATEWAY=<ip de ifcfg-em1>
DNS1=<ip de ifcfg-em1>
DNS2=<ip de ifcfg-em1>
SEARCH=<nom de ifcfg-em1>
5) Reconfigurer l'interface ethernet em1
Modifier /etc/sysconfig/network-scripts/ifcfg-em1 pour avoir
DEVICE=em1
TYPE=Ethernet
ONBOOT=yes
HWADDR=xx:xx:xx:xx:xx:xx
#### valeurs déplacées dans le bridge
# BOOTPROTO=none
# IPADDR=xxx.xxx.xxx.xxx
# PREFIX=xx
# GATEWAY=xxx.xxx.xxx.xxx
# DNS1=xxx.xxx.xxx.xxx
# DNS2=xxx.xxx.xxx.xxx
# SEARCH=xxxxxxx.xxx
####
NM_CONTROLLED=no
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
BRIDGE=br0
ATTENTION: Avec FC18 le paramètre GATEWAY est ignoré dans les fichiers ifcg-xxxx. Il faut le placer dans /etc/sysconfig/network.
6) Redémarrer le réseau ou rebooter.
/etc/init.d/network restart
/etc/init.d/network restart
7) Vérifier les interfaces et les routes
On doit voir apparaitre br0
On doit voir apparaitre br0
ifconfig
br0 Link encap:Ethernet HWaddr 50:E5:49:20:A3:16
inet addr:xx.xx.xx.xx Bcast:xx.xx.xx.255 Mask:255.255.255.0
inet6 addr: fe80::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
em1 Link encap:Ethernet HWaddr 50:E5:49:20:A3:16
inet6 addr: fe80::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
virbr0 Link encap:Ethernet HWaddr 52:54:00:AB:EA:FD
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
br0 Link encap:Ethernet HWaddr 50:E5:49:20:A3:16
inet addr:xx.xx.xx.xx Bcast:xx.xx.xx.255 Mask:255.255.255.0
inet6 addr: fe80::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
em1 Link encap:Ethernet HWaddr 50:E5:49:20:A3:16
inet6 addr: fe80::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
virbr0 Link encap:Ethernet HWaddr 52:54:00:AB:EA:FD
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
Vérifier les routes avec la commande route
Destination Gateway Genmask Flags Metric Ref Use Iface
default xx.xx.xx.xx 0.0.0.0 UG 0 0 0 br0
link-local * 255.255.0.0 U 1003 0 0 br0
192.168.122.0 * 255.255.255.0 U 0 0 0 virbr0
xx.xx.xx.0 * 255.255.255.0 U 0 0 0 br0
Destination Gateway Genmask Flags Metric Ref Use Iface
default xx.xx.xx.xx 0.0.0.0 UG 0 0 0 br0
link-local * 255.255.0.0 U 1003 0 0 br0
192.168.122.0 * 255.255.255.0 U 0 0 0 virbr0
xx.xx.xx.0 * 255.255.255.0 U 0 0 0 br0
8) Supprimer virbr0 et utiliser br0 par défaut.
Par défaut le réseau utilisé pour communiquer avec les machine virtuelle s'appelle 'defaut'
Il est définit dans le fichier /etc/libvirt/qemu/networks/default.xml
Et doit ressembler a ceci:
<network>
<name>default</name>
<uuid>ea588191-e2b0-459a-92f8-f89cea306984</uuid>
<bridge name="virbr0" />
ect...
<name>default</name>
<uuid>ea588191-e2b0-459a-92f8-f89cea306984</uuid>
<bridge name="virbr0" />
ect...
</network>
On va en construire un autre: /etc/libvirt/qemu/networks/host-bridge.xml
contenant:
<network>
<name>host-bridge</name>
<uuid>d78fe37d-5723-27cb-102e-73386878f36d</uuid>
<forward mode='bridge'/>
<bridge name='br0' />
</network>
<name>host-bridge</name>
<uuid>d78fe37d-5723-27cb-102e-73386878f36d</uuid>
<forward mode='bridge'/>
<bridge name='br0' />
</network>
Maintenant on peut désactiver le réseau 'defaut' qui utilise virbr0
virsh net-destroy default virsh net-autostart default --disable
Et activer notre réseaux 'host-bridge' qui utilise br0
virsh net-define host-bridge.xmlvirsh net-autostart host-bridge
virsh net-start host-bridge
Vérifier que tout est ok:
virsh net-info host-bridge
Name host-bridge
UUID d78fe37d-5723-27cb-102e-73386878f36d
Active: yes
Persistent: yes
Autostart: yes
Bridge: br0
Vérifier avec ifconfig et route que virtbr0 n'apparait plus.
Name host-bridge
UUID d78fe37d-5723-27cb-102e-73386878f36d
Active: yes
Persistent: yes
Autostart: yes
Bridge: br0
Vérifier avec ifconfig et route que virtbr0 n'apparait plus.
C: Installation de la machine virtuelle
ATTENTION
** Suite a une limitation du programme virt-install il n’est pas possible d’installer en mode texte autrement qu’en prenant la source via l'option --location. (En pratique ce n'est pas un problème)
** L’installation en mode texte ne permet pas de partitionner soit même. On est limité au partitionnement standard. (C'est rarement un problème)
** Il faut au minimum 800MB de ram pour installer Fedora 16 (même en mode texte!). Si nécessaire on pourra par la suite diminuer cette valeur avant d’exécuter la machine virtuelle en éditant le fichier xml de configuration de cette machine.
** avoir son terminal en mode UTF8 pour avoir les cadres texte.
** Suite a une limitation du programme virt-install il n’est pas possible d’installer en mode texte autrement qu’en prenant la source via l'option --location. (En pratique ce n'est pas un problème)
** L’installation en mode texte ne permet pas de partitionner soit même. On est limité au partitionnement standard. (C'est rarement un problème)
** Il faut au minimum 800MB de ram pour installer Fedora 16 (même en mode texte!). Si nécessaire on pourra par la suite diminuer cette valeur avant d’exécuter la machine virtuelle en éditant le fichier xml de configuration de cette machine.
** avoir son terminal en mode UTF8 pour avoir les cadres texte.
Insérez le dvd de Fedora 16 dans votre lecteur de dvd puis :
mkdir /mnt/cdrom
mount /dev/cdrom1 /mnt/cdrom
virt-install \
-n vm1 \
-r 1024 \
--vcpus 1 \
--nographics \
--os-type linux \
--os-variant fedora16 \
--network bridge:br0 \
--location /mnt/cdrom \
--disk path=/dev/vg_srv0/lv_vm1 \
--extra-args 'console=tty0 console=ttyS0,115200n8 serial' \
--prompt
Si vous n'avez pas de DVD :
- soit vous utilisez la version en ligne en donnant l'url comme paramètre de l'option --location :
--location 'http://ftp.lip6.fr/ftp/pub/linux/distributions/fedora/releases/16/Fedora/i386/os' - soit vous telechargez la version iso avec wget
wget http://ftp.lip6.fr/ftp/pub/linux/distributions/fedora/releases/17/Fedora/i386/iso/Fedora-17-i386-DVD.iso
puis remplacez /mnt/cdrom par le path vers le fichier iso qui vient d'etre telechargé.
Pour des raisons de performances on utilise comme paramètre de --disk path=... un volume LVM (/dev/vg_srv0/lv_vm1) spécialement créé, plutôt qu'un fichier classique pour stoker le disque virtuel. Voir ce post pour plus d'info sur la gestion des volumes LVM.
La procédure d’installation commence ainsi :
Starting install...
Retrieving file .treeinfo... | 1.8 kB 00:00 ...
Retrieving file vmlinuz... | 7.8 MB 00:01 ...
Retrieving file initrd.img... | 257 MB 00:38 ...
Creating domain... | 0 B 00:01
Connected to domain vm1
Escape character is ^]
...attendre environ une minute ...
[0.000000] Initializing cgroup subsys cpuset
[0.000000] Initializing cgroup subsys cpu
[0.000000] Linux version 3.1.0-7.fc16.i686 (mockbuild@x86-11.phx2.fedoraproject.org) (gcc version 4.6.2 20111027 (Red Hat 4.6.2-1) (GCC) ) #1 SMP Tue Nov 1 21:00:16 UTC 2011
[0.000000] BIOS-provided physical RAM map:
[0.000000] BIOS-e820: 0000000000000000 - 000000000009dc00 (usable)
ect...
[0.000000] Booting paravirtualized kernel on KVM
[0.000000] setup_percpu: NR_CPUS:32 nr_cpumask_bits:32 nr_cpu_ids:1 nr_node_ids:1
[0.000000] PERCPU: Embedded 13 pages/cpu @ee400000 s29504 r0 d23744 u4194304
[0.000000] kvm-clock: cpu 0, msr 0:2e406b01, primary cpu clock
[0.000000] KVM setup async PF for cpu 0
[0.000000] kvm-stealtime: cpu 0, msr 2e402240
[0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 259978
[0.000000] Kernel command line: console=tty0 console=ttyS0,115200n8 serial
[0.000000] Initializing cgroup subsys cpuset
[0.000000] Initializing cgroup subsys cpu
[0.000000] Linux version 3.1.0-7.fc16.i686 (mockbuild@x86-11.phx2.fedoraproject.org) (gcc version 4.6.2 20111027 (Red Hat 4.6.2-1) (GCC) ) #1 SMP Tue Nov 1 21:00:16 UTC 2011
[0.000000] BIOS-provided physical RAM map:
[0.000000] BIOS-e820: 0000000000000000 - 000000000009dc00 (usable)
ect...
[0.000000] Booting paravirtualized kernel on KVM
[0.000000] setup_percpu: NR_CPUS:32 nr_cpumask_bits:32 nr_cpu_ids:1 nr_node_ids:1
[0.000000] PERCPU: Embedded 13 pages/cpu @ee400000 s29504 r0 d23744 u4194304
[0.000000] kvm-clock: cpu 0, msr 0:2e406b01, primary cpu clock
[0.000000] KVM setup async PF for cpu 0
[0.000000] kvm-stealtime: cpu 0, msr 2e402240
[0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 259978
[0.000000] Kernel command line: console=tty0 console=ttyS0,115200n8 serial
ect...
[0.022024] Brought up 1 CPUs
[0.022361] Total of 1 processors activated (6185.94 BogoMIPS).
[0.022361] Total of 1 processors activated (6185.94 BogoMIPS).
ect...
ect...
et enfin...
On reboote...
Notez le (ttyS0) qui correspond au deuxième paramètre console de l'option --extra-args
--extra-args 'console=tty0 console=ttyS0,115200n8 serial'
Si vous ne l'avez plus, retablir le lien avec la console de votre machine virtuelle
virsh console vm1
[voir ce post sur virsh et l'access à la concole d'une machine virtuelle]
Se loger en root sur la machine virtuelle et taper :
Puis rebooter la machine virtuelle
Si on veut qu’une machine nomée vm1 démarre quand la machine hôte boote faire :
virsh autostart vm1
Pour arreter proprement une machine virtuelle il suffit de faire
virsh shutdown vm1
Avec la console (virsh console vm1) on peut verifier le déroulement de l'arret de la machine.
ATTENTION : pour pouvoir faire un shutdown d’une machine virtuelle depuis l’hôte avec la commande « virsh shutdown vm1 » il faut deux choses :
1) Coté machine virtuelle il faut que le daemon acpid fonctionne (yum install acpid si nécessaire)
2) Coté hôte il faut que le fichier xml (/etc/libvirt/qemu/vm1.xml) décrivant la machine virtuelle contienne :
Perte de controle d'une machine virtuelle qui ne boote pas ? Commencez par ici...
--extra-args 'console=tty0 console=ttyS0,115200n8 serial'
D: Configuration reseau (Guest)
Coté machine virtuelle le réseau est configuré comme indiqué durant son installation mais le réseau n'est pas activé au boot.Si vous ne l'avez plus, retablir le lien avec la console de votre machine virtuelle
virsh console vm1
[voir ce post sur virsh et l'access à la concole d'une machine virtuelle]
Se loger en root sur la machine virtuelle et taper :
cat /etc/sysconfig/network-scripts/ifcfg-eth0
chkconfig --level 35 network on
Note: Dans la machine virtuelle, même avec Fedora 16, l'interface ethernet s'apelle eth0, et non em1 comme dans la machine reelle...
Si la config est ok on peut la rendre active au boot :
Puis rebooter la machine virtuelle
reboot
La machine virtuelle est maintenant accessible en ssh, comme une machine réelle.E: START / STOP
Une fois les machines virtuelles crées on en trouve les traces dans le repertoire /etc/libvirt/qemu , avec un fichier xml par machine virtuelle et dans la liste des volumes logiques (si on a installé les machines virtuelles dans des volumes logiques)
lvdisplay | grep "LV Name"
Attention : il se peut que tous les volumes ne soient pas des machines virtuelles. Certains peuvent être ceux utilisés par la machine hôte.
Connaissant le nom d’une machine virtuelle (ici vm1) on peut la démarrer manuellement avec la commande :
virsh -c qemu:///system start vm1
lvdisplay | grep "LV Name"
Attention : il se peut que tous les volumes ne soient pas des machines virtuelles. Certains peuvent être ceux utilisés par la machine hôte.
Connaissant le nom d’une machine virtuelle (ici vm1) on peut la démarrer manuellement avec la commande :
virsh -c qemu:///system start vm1
Si on veut qu’une machine nomée vm1 démarre quand la machine hôte boote faire :
virsh autostart vm1
Ceci créera un lien logique depuis /etc/libvirt/qemu/autostart/vm1.xml vers le fichier /etc/libvirt/qemu/vm1.xml
Si on ne veut plus que la machine virtuelle nomée vm1 démarre au boot de la machine hôte faire :
virsh autostart vm1 -–disable
Ceci detruira le lien logique.
Note: Le boot automatique des machines virtuelles n’est possible que si libvirtd est actif.
Pour l’activer utiliser la commande
chkconfig libvirtd on
Si on ne veut plus que la machine virtuelle nomée vm1 démarre au boot de la machine hôte faire :
virsh autostart vm1 -–disable
Ceci detruira le lien logique.
Note: Le boot automatique des machines virtuelles n’est possible que si libvirtd est actif.
Pour l’activer utiliser la commande
chkconfig libvirtd on
Pour arreter proprement une machine virtuelle il suffit de faire
virsh shutdown vm1
Avec la console (virsh console vm1) on peut verifier le déroulement de l'arret de la machine.
ATTENTION : pour pouvoir faire un shutdown d’une machine virtuelle depuis l’hôte avec la commande « virsh shutdown vm1 » il faut deux choses :
1) Coté machine virtuelle il faut que le daemon acpid fonctionne (yum install acpid si nécessaire)
2) Coté hôte il faut que le fichier xml (/etc/libvirt/qemu/vm1.xml) décrivant la machine virtuelle contienne :
<features>
<acpi/>
<apic/>
<pae/>
</features>
Perte de controle d'une machine virtuelle qui ne boote pas ? Commencez par ici...