Affichage des articles dont le libellé est fedora. Afficher tous les articles
Affichage des articles dont le libellé est fedora. Afficher tous les articles

18 septembre 2014

pg_hba.conf (part2)

(Dans la première partie on a vu comment configurer l'accès local à un serveur Postgresql)

Sachant que pour se connecter à distance (via le réseaux) à un serveur Postgresql il faut utiliser la commande
    psql -h host  database  username

On va essayer d’accéder à notre nouvelle installation de Postgresql se situant sur le serveur avec l'ip 192.168.0.3

> psql -h 192.168.0.3  postgres  postgres
psql: n'a pas pu se connecter au serveur : Connection refused
      Le serveur est-il actif sur l'hôte « 192.168.0.3 » 
      et accepte-t-il les connexions TCP/IP sur le port 5432 ?

Effectivement la première chose à faire est d’autoriser les connections venant du réseau.
Pour cela il faut éditer le fichier /var/lib/pgsql/data/postgresql.conf et y ajouter la ligne
    listen_addresses = '*'

puis redémarrer le serveur Postgresql
    systemctl restart postgresql

On ré-essaye :
    psql  -h 192.168.0.3  postgres  postgres
    psql: FATAL:  no pg_hba.conf entry for host "192.168.0.59",

    user "postgres", database "postgres", SSL off

Maintenant il faut autoriser les connections sur la base du triplet : (data-base, user, ip-client)

Pour faire simple on va ajouter cette ligne à pg_hba.conf
    host   all   all   all   md5
Ce qui signifie que s'il connait le password n'importe quel utilisateur de Postgresql peut se connecter à n'importe quelle base de données depuis n'importe où sur internet. C'est un peut trop ouvert !

En utilisant cette ligne
    host   all   all   samenet   md5
les clients devront être sur des machines du même réseau local que le serveur Postgresql.

En utilisant cette ligne
    host   sameuser   all   samenet   md5
Un user ne pourra se connecter qu'a la base de données qui porte son nom et seulement depuis une machine du réseau local. (config typique d'un environnement de développement dédié. Ne pas utilisé si le réseau local est trop ouvert, ni dans un environnement cloud)

En utilisant ces deux lignes en même temps
    host   webapp    webapp  w.x.y.z/32  md5
    host   sameuser  all     a.b.c.0/24  md5

Le serveur web situé à l'adresse w.x.y.z pourra se connecter à la base webapp avec le user webapp
et les développeurs du sous réseau a.b.c.0/24 pourront utiliser la base qui à le même nom que d'utilisateur.
Par exemple : postgres/postgres, webapp/webapp, webbackup/webbackup  jean/jean


Si vous avez pigez cela vous pigerez la petite doc qui se trouve au début du fichier pg_hba.conf


RAPPEL: Pour que les changements dans le fichier pg_hba.conf prennent effet il faut redémarrer le serveur Postgresl.

Info sur le codage md5 des mots de passe dans la table pg_shadow de Postgresql;
http://code18.blogspot.fr/2010/01/cracker-un-md5-de-postgresql.html




 

17 septembre 2014

pg_hba.conf (part1)

Dans cette première partie on va voir comment sécuriser Postgresql  juste après son installation.


1) Vous venez donc d'installer Posgresql 9.x et voulez vous connectez en tapant psql.

> psql
psql: FATAL:  role "bidule" does not exist


En fait, en absence d'information, psql utilise le nom de l'utilisateur coté Unix et essaye de s'en servir pour se connecter à la base de données du même nom.

En fait, pour l'utilisateur 'bidule'
    > psql
est équivalant de
    > psql bidule bidule

Le premier 'bidule' est le nom de la base de données et le second le nom de l'utilisateur coté postgresql.


2) Dans toute installation par défaut de Postgresql il y a une base de données nommée postgres et un utilisateur nommé postgres. Donc ceci doit marcher :

> psql postgres postgres
psql (9.2.7)
Type "help" for help.

postgres=# _


Effectivement, on a bien le prompt du serveur Posgresql.


3) QUOI ?! Pas besoin de mot de passe !!!
Incroyable : Sur la machine où s’exécute le serveur Postgresql aucun utilisateur local n'a besoin de mot de passe pour y accéder. Ceci est dû à cette ligne dans le fichier pg_hba.conf

    local   all   all  trust

Elle signifie qu'en 'local', toutes  les bases de données (premier 'all') sont accessibles par tous les utilisateurs (deuxième 'all') à qui l'OS a déjà fait confiance ('trust') en acceptant qu'ils se connectent sur la machine.

Bien sur ceci est un véritable problème sur une machine multi-utilisateurs.

Notez que cette méthode très libérale pose exactement les mêmes problèmes que le mot de passe par défaut connu de tout le monde ou que l'utilisateur par défaut sans mot de passe.


4) Les trois premières choses à faire sont, dans cet ordre :
- attribuer un password au user 'postgres'  (coté Postgresql, pas coté Unix)
- changer la ligne de pg_hba en: "local   all   all  md5"
- mettre en commentaire toute les autres lignes utilisant la méthode 'trust'

En remplaçant la méthode 'trust' par la méthode 'md5' on force tout utilisateur local à donner le mot de passe de l'utilisateur coté base de données. Encore faut-il qu'il en ait un...

4.1) Donc on se connecte à Posgresql avec:

    > psql postgres postgres

puis on tape ces deux commandes pour attribuer un mot de passe à l'utilisateur postgres :

    ALTER USER postgres WITH PASSWORD 'Secr3tPassW0rd';
    \q



4.2) Dans le fichier pg_hba on remplace sur la ligne local la methode 'trust' par 'md5'
et on met en commentaire les deux lignes host utilisant aussi trust
# host    all  all  127.0.0.1/32   trust
# host    all  all  ::1/128        trust
On sauve, puis on redémarre le serveur Postgresql :

    systemctl restart postgresql


4.3) Maintenant si on utilise la commande  psql on doit taper le mot de passe

    > psql postgres postgres
    Password for user postgres: xxxxxxxxxxxx
    psql (9.2.7)
    Type "help" for help.
   
    postgres=# _


Ouf !

Notez qu'en remettant la méthode d'authentification pour 'local' à 'trust' pour pourrez vous connecter à nouveau (en local) sans mot de passe, ce qui est bien pratique si vous l'avez oublié.

Ce qui signifie que le 'root' Unix a tous pouvoirs sur le serveur Postgresql puisque il peut outre passer l’authentification en modifiant le fichier pg_hba.conf

Passons à l’accès via le réseaux ...

07 juin 2013

MySQL setup

Voici un rapide mémo pour la configuration de base de MySQL.

Avec Fedora on installe et démarre MySQL en 3 commandes (en root) :
 # yum install mysql-server
 # systemctl start mysqld
 # systemctl enable mysqld


Par défaut MySQL attend les connexions sur le port 3306. Pour changer cette valeur éditer le fichier /etc/my.cfg et ajouter (ou modifier) le paramètre 'port' dans la section [mysqld]
[mysqld]
port=1234
Puis redémarrer
 # systemctl restart mysqld

Notes:
- Dans ce qui suit "www.example.com" està remplacer par le nom de votre serveur.
- On va utiliser le user root de MySQL mais ce n'est pas le root du serveur. 

- Ce qui suit peut être fait par n'importe quel utilisateur.

> mysql -u root
 

-- etape 1: lister les users existants:

mysql> select user,host,password from mysql.user;
+------+-----------------+----------+
| user | host            | password |
+------+-----------------+----------+
| root | localhost       |          |
| root | www.example.com |          |
| root | 127.0.0.1       |          |
| root | ::1             |          |
|      | localhost       |          |
|      | www.example.com |          |
+------+-----------------+----------+


-- etape 2: supprimer les users inutiles:

mysql> delete from mysql.user where user='root' and host='::1';
mysql> delete from mysql.user where user='';

mysql> select user,host,password from mysql.user;
+------+-----------------+----------+
| user | host            | password |
+------+-----------------+----------+
| root | localhost       |          |
| root | www.example.com |          |
| root | 127.0.0.1       |          |
+------+-----------------+----------+


-- etape 3: donner un mot de passe au user root de MySQL:

mysql> set password for root@localhost=password('secret');
mysql> set password for root@'127.0.0.1'=password('secret');
mysql> set password for root@'www.example.com'=password('secret');

mysql> select user,host,password from mysql.user;
+------+-----------------+-------------------------------------------+
| user | host            | password                                  |
+------+-----------------+-------------------------------------------+
| root | localhost       | *14E65567ABDB5135D0CFD9A70B3032C179A49EE7 |
| root | www.example.com | *14E65567ABDB5135D0CFD9A70B3032C179A49EE7 |
| root | 127.0.0.1       | *14E65567ABDB5135D0CFD9A70B3032C179A49EE7 |
+------+-----------------+-------------------------------------------+


La valeur de la colonne 'password' change suivant le mot de passe. Ici on voit le codage de 'secret'.

-- pour autoriser root à se connecter à MySQL via le réseau :

mysql> update mysql.user set host="%" 
       where user="root" and host="www.example.com";
mysql> flush privileges;


mysql> select user,host,password from mysql.user;
+------+-----------+-------------------------------------------+
| user | host      | password                                  |
+------+-----------+-------------------------------------------+
| root | localhost | *14E65567ABDB5135D0CFD9A70B3032C179A49EE7 |
| root | %         | *14E65567ABDB5135D0CFD9A70B3032C179A49EE7 |
| root | 127.0.0.1 | *14E65567ABDB5135D0CFD9A70B3032C179A49EE7 |
+------+-----------+-------------------------------------------+


mysql> quit

ATTENTION:
% matche tout host, sauf localhost !
Donc l'entrée avec localhost n'est pas redondante avec l'entrée %

On se reconnecte et là il faut utiliser l'option -p puisque root a maintenant un mot de passe.
>mysql -u root -p
Enter password:    <-- entrer le mot de passe ('secret' dans notre example)

-- utiliser MySQL
mysql> quit


Après cela on peut tout faire en ligne de commande, avec phpMyAdmin ou MySQL Workbench.

15 novembre 2012

virt-clone

Par souci de performance on utilise des volumes logiques (LV) pour installer les machines virtuelle. Ce gain de performance se paye par un système de backup un peut moins habituel que dans le cas d’un fichier. Voici comment proceder.
Commencons par obtenir la description du LV utilisé par la machine virtuelle actuelle.

# lvdiplay

  --- Logical volume ---
  LV Name                /dev/vg_srv0/lv_vm2
  VG Name                vg_srv0
  LV UUID                MIzDop-R7NY-qvQP-kmN1-C9hT-jD1p-7zQFTP
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                20.00 GiB
  Current LE             640
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:4


Le LV /dev/vg_srv0/lv_vm2, qui contient la machine virtuelle vm2, fait donc exactement 20Go.

On va créer, une fois pour toute, le LV /dev/vg_srv0/lv_vm2_back, de la même taille, pour y stoker un clone de la machine existante vm2.

 lvcreate -L 20G -n lv_vm2_back vg_srv0

Ensuite il suffit de faire le clonage, en prenant soin d’arreter la machine virtuelle vm2 pendant le clonage.

 virsh shutdown vm2 
 virt-clone  -o vm2 -n vm2_back -f /dev/vg_srv0/lv_vm2_back
 virsh start vm2

-o donne le nom de la machine virtuelle Originale
-n donne le nom de la Nouvelle machine virtuelle
-f désigne la destination du clonage (le LV crée avec lvcreate)

Il faut environ 6 min pour : arrêter, cloner 20Go, redémarrer.

Notez que virt-clone a créé le fichier /etc/libvirt/qemu/vm2_back.xml en personnalisant l’adresse mac et le uuid pour éviter les conflits avec l’original mais il n’a pas changer les fichiers dans le clone. Des paramètres, comme l’adresse ip, restent donc les mêmes.

Si on veut exécuter vm2_back en parallèle de son origianl vm2, il faudra eviter les conflits et donc reconfigurer certains fichiers de vm2_back avec des commandes du type :

  guestfish -d vm2_back  -i edit xxxxx

Pour plus d'info sur l'utilisation de guestfish voir ce post.

guestfish

Les machines virtuelle c’est bien mais …
… comment extraire des fichiers d’une machine virtuelle sans avoir à la démarrer, ou, plus grave, quand elle ne veut pas démarrer ?

Le cœur de la solution s’appelle guestfish. Il s’agit d’un shell permettant de ‘dialoguer’ avec une machine virtuelle en fonctionnement mais surtout à l’arrêt. Il faut cependant que le daemon libvirtd fonctionne (/etc/init.d/libvirtd start)

Dans ce qui suit:
  • --ro : indique un accès en lecture seule, ce qui permet d’accéder à une machine virtuelle en cours de fonctionnement sans risques.
  • -i : a pour effet d’inspecter la machine virtuelle et de monter ses divers filesystem automatiquement.
  • /path/to/file et /path/to/dir : sont des chemins absolus dans la machine virtuelle.
  • local/dir et local/file : sont relatifs ou absolus sur la machine hôte.

A) Commandes de base pour extraire des fichiers d'une machine virtuelle (domaine) nommée ‘vm1’:
guestfish -d vm1  --ro  -i  cat      /path/to/file
guestfish -d vm1  --ro  -i  download /path/to/file  local/file
guestfish -d vm1  --ro  -i  tar-out  /path/to/dir   local/file
guestfish -d vm1  --ro  -i  copy-out /path/to/dir   local/dir


Note: 'copy-out' effectue une copie récursive en combinant download et tar-out.

Ces commandes sont très utiles pour ausculer les logs et fichiers de conf d'une machine virtuelle qui ne boote pas, ou pour sauvegarder des fichiers avant de reconstruire la machine virtuelle.

B) Commandes de base pour modifier des fichiers d'une machine virtuelle (domaine) nommée ‘vm1’. Cette machine virtuelle doit impérativement être à l’arrêt. (shutdown)
guestfish -d vm1  -i  edit     /path/to/file
guestfish -d vm1  -i  upload   local/file    /path/to/file
guestfish -d vm1  -i  tar-in   local/tarfile /path/to/dir
guestfish -d vm1  -i  copy-out local/dir     /path/to/dir


Note: 'edit' combine download + édition en local avec $EDITOR + upload. Si votre editeur est vi ou emacs vous pouvez remplacer la commande 'edit' par 'vi' ou 'emacs'. Pour utiliser un autre éditeur il faudra configurer la variable $EDITOR.

Ces commandes sont très utiles pour corriger les fichiers de conf comme /boot/grub/grub.conf, ou /etc/passwd, d'une machine virtuelle qui ne boote pas, ou pour personaliser des machinesvirtuelles bâties sur le même master (hostname, ip, domaine, ect...)


C) Enfin, comme avec tout shell on peut entrer en mode interactif avec guestfish et le quitter avec ^D ou exit ou quit. Pour automatiser certaines taches vous pouvez écrire des scripts guestfish, comme avec bash ou perl. Il suffit de commencer le script par :

#!/usr/bin/guestfish –f

Puis de taper les commandes.

Une autre solution est de faire un script bash en y invoquant guestfish et en lui passant les commandes via une redirection de stdin :

#!/bin/sh

guestfish <<_EOF_
domain vm1
run
write /etc/resolv.conf "nameserver 8.8.8.8"
_EOF_


Cette méthode est plus souple car on bénéficie de la puissance de bash pour, par exemple, traiter les paramètres du script et les résultats retournés par guestfish.

Plus d’info :
La référence: http://libguestfs.org/guestfish.1.html à lire absolument pour voir l'étendu des possibiltés.
Plein de petits scripts: http://libguestfs.org/guestfs-recipes.1.html
Pour les cas graves: http://libguestfs.org/virt-rescue.1.html

14 novembre 2012

UTC or not UTC

UTC linux
Universal Time Coordinate
Pour certaines applications l’heure est un paramètre très important. Un changement d’heure été/hiver non pris en compte, ou faux, peut être grave. Comment gérer l’heure sur un système Linux (Fedora) ?

A: Choisir le temps de référence :
Le plus simple est de prendre comme référence le temps universel, c'est-à-dire UTC, et d’utiliser ce temps pour régler l’horloge matérielle de votre serveur, c'est-à-dire l’horloge maintenue à jour dans un circuit électronique CMOS et qui est réglable via le BIOS. (Mais on va s’arranger pour ne pas avoir à passer par le BIOS)

Si on utilise une autre référence la gestion du changement d’heure hiver/été devient difficile ou même impossible. Si on y ajoute la gestion de machines virtuelles et la mise à jour via NTP ça devient un cauchemar.

B: Définir le temps local :
C'est-à-dire indiquer dans quel fuseau horaire est la machine et/ou l’utilisateur.

Voici comment procéder concrètement pour configurer un serveur Linux type Fédora. Attention if faut être root pour faire tout cela.
  1. Configurer le système de démarrage pour qu’il sache que l'horloge matérielle indique l’heure UTC.
  2. Configurer le fuseau horaire du serveur.
  3. Mettre à jour l’heure locale (heure du système linux)
  4. Mettre à jour l’heure UTC (heure dans le circuit cmos)
Allons y...

a) Editer le fichier /etc/sysconfig/clock pour qu’il ressemble à ceci :
UTC=true
ZONE="Europe/Paris"


UTC=true indique que la valeur lue dans l’horloge matérielle est le temps universel (UTC)
ZONE=" … " indique le nom du répertoire/fichier, relativement à /usr/share/zoneinfo, qui contient la description du fuseau horaire du serveur.

b) Faire un lien logique de /etc/localtime vers le repertoire/fichier choisi ci-dessus pour ZONE.
Exemple :
ln –sf /usr/share/zoneinfo/Europe/Paris /etc/localtime
Ceux qui ont un volume /usr qui risque de ne pas pouvoir être monté préférerons faire une copie. Mais dans ce cas les mises à jour des fichiers de zone n’auront pas d’effet sur la copie dans /etc.

c) IMPORTANT: Ce qui vient d’être fait n’a pas d'effet immédiat sur le fuseau actuel du système. Si en faisant ce qui précède vous avez changé de fuseau horaire, il est faut rebooter afin que cela soit pris en compte.

Pour les deux étapes qui suivent il est imperatif que le fuseau horaire effectif du système soit le bon (celui definit par ZONE dans /etc/sysconfig/clock et par /etc/localtime.

d) Mettre (si nécessaire) votre heure locale à jour avec la commande « date MMDDHHmm »
Exemple, pour le 13/dec 14h15 on tapera :

date 12131415

e) Copier l’heure système (linux) dans l’heure hardware (bios) en indiquant qu’on veut y mettre l’heure UTC. Linux s’occupera de faire la conversion heure locale/heure universelle.

hwclock --systohc –-utc

Voila !
L’étape suivante est de mettre en place un client NTP afin de garder cette heure à jour.

NOTE: Si un utilisateur n'est pas satisfait par le fuseau horaire définit au niveau du serveur, il peut facilement fixer son propre fuseau horaire, pour sa session, avec la variable TZ. L'usage est le même que pour ZONE dans le fichier /etc/sysconfig/clock.

# TZ='Asia/Kolkata'
# export TZ
# date
Wed Nov 14 21:33:11 IST 2012

# TZ='France/Paris'
# date
Wed Nov 14 16:03:30 France 2012

Non, j'ai pas mis une demie heure pour taper la deuxième commande !
Il a un déclage horaire de 5h30 entre Paris et Kolkata


30 mars 2012

Stop Disable Remove

Je défends l’idée que d’ajouter des couches de sécurité, et donc d’avoir plus de code en mémoire, n’est pas une garantie de plus de sécurité. Je préfère ne faire tourner que le strict minimum, correctement configuré et à jour.

Donc, après une installation de Linux je désactive systématiquement SELinux, iptables, ipv6 et les applications inutiles telles que sendmail.
systemctl stop sendmail
systemctl disable sendmail

systemctl stop iptables
systemctl disable iptables

systemctl stop ip6tables
systemctl disable ip6tables

systemctl stop firewalld
systemctl disable firewalld
Pour désactiver SELinux éditer /etc/selinux/config pour remplacer cette ligne :
SELINUX=enforcing
par celle ci :
SELINUX=disabled
Verifier l'etat avec
sestatus

Après le reboot il doit afficher
SELinux status:                 disabled

Pour désactiver ipv6, ajouter ces 4 lignes au fichier /etc/sysctl.conf
net.ipv6.conf.lo.disable_ipv6=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.enp2s0.disable_ipv6
Remplacer enp2s0 par le nom de l'interface sur la quelle vous voulez désactiver ipv6.

Utiliser la commande  find /proc/sys/net/ipv6 -name disable_ipv6 pour trouver tous les flags pouvant être utilisés


Une partie de IPv6 est maintenant intégrée au noyau, la désactivation n'est donc jamais complète.

Je vérifie qu’il n’y que les services nécessaires qui acceptent des connections.
 netstat –nat
Je vérifie de n’avoir sur le disque que des applications utiles
yum list installed
Je supprime celles qui sont inutiles
yum erase sendmail procmail
Je met a jour celles qui restent

yum update
Enfin, pour que les modif dans les fichier de conf soient prises en compte:
shutdown -r now            # -r pour reboot

IMPORTANT:  Ce travail au niveau de Linux doit aussi être fait aussi au niveaux d'applications comme Apache qui, par défaut, chargent trop de modules inutiles.


 


26 mars 2012

Trucs pour virsh

Voici 3 conseils pour utiliser la commande virsh console

1) Comme cela vous est gentiment dit en début de session
Escape character is ^]
Le problème c’est que sur un clavier français CTRL + ] ne marche pas.
En fait l’équivalent de  CTRL + ]  est  CTRL + $.

2) Ne pas établir plusieurs sessions avec la même machine virtuelle en même temps. Vous obtiendrez des affichages incohérents dans toutes les sessions. En fait les caractères affichés sont dispatchés aléatoirement vers les différentes sessions ouvertes.

3) Quand on établie une session avec une machine virtuelle on prend le contrôle de la console dans l'état où elle est. On peut couper la session (avec CTRL + $), et la reprendre plus tard dans l’état où on l’a laissé. Le fait de couper la session ne provoque pas un logout. . (Un peut comme avec la commande screen)

Conséquence:
Dans le cas où la machine virtuelle est en attente du login le fait de s'y connecter à ce moment là ne fera pas apparaitre le prompt « login : »,. Donc on pourrait taper le nom d’utilisateur puis Enter, là on obtiendrait le prompt password et on continuerait comme d’habitude.

# virsh console vm1
Connected to domain vm1
Escape character is ^]
root
Password:
Last login: Mon Mar 26 01:08:45 on ttyS0
[root@localhost ~]#

Vous trouverez parfois le très mauvais conseil suivant :
« Taper sur la touche Enter pour faire apparaitre le prompt du login »
En effet, si vous ne tapez que sur la touche Enter sans avoir taper un nom d’utilisateur le prompt du login se réaffiche. Mais ceci est très dangereux !!

Que ce passerait il si, au lieu d’attendre le login, la machine virtuelle avait déjà un shell ouvert avec cette ligne de commande : « rm –rf / »
En appuyant aveuglement sur Enter vous valideriez l’effacement de tous les fichiers !!

Voila pourquoi il ne faut jamais taper sur Enter ‘pour faire apparaitre le prompt’. Il faut toujours commencer par CRTL+C pour annuler l’éventuelle commande en cours.
Si un shell est en cour il annulera l’éventuelle commande et réaffichera son prompt.

Si le CRTL+C ne provoque rien tapez CTRL+D. Dans le cas d’un login cela relance la procédure au début avec un nouveau prompt.


24 mars 2012

Virtualisation avec FEDORA

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

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
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 ...
 
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
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)

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) 
 
1) Désactiver NetworkManager
/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

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
 
7) Vérifier les interfaces et les routes
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

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

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...
</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>

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.xml
virsh 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. 

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.



Insérez le dvd de Fedora 16 dans votre lecteur de dvd puis :

mkdir /mnt/cdrom
mount /dev/cdrom1 /mnt/cdrom

La commande pour créer une machine virtuelle est (en une seule ligne)

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
ect...
[0.022024] Brought up 1 CPUs
[0.022361] Total of 1 processors activated (6185.94 BogoMIPS).
ect...

Et on arrive à la procédure d’installation en mode texte:


ect...


et enfin...



On reboote...


et voila ! On obtient le prompt de la machine virtuelle :


Notez le (ttyS0) qui correspond au deuxième paramètre console de l'option --extra-args
--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

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 :
chkconfig --level 35 network on

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

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

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...