05 décembre 2012

Chrome Enterprise dans Program Files

Le navigateur Google Chrome à la très fâcheuse habitude de s’installer dans l’espace de l’utilisateur (C:\Documents and Settings\username\Local Settings\Application Data\Google) au lieu du classique «C:\Program Files\Google ». Ceci est très gênant pour 3 raisons :
  • Il y a un gros problèmes de sécurité puisque les fichiers dans l'espace utilisateur sont modifiables sans avoir les droits d’administration.
  • Il faut installer chrome pour chaque utilisateur de la machine.
  • L’installeur est générique, il a besoin d’une connexion à l’internet public au moment de l’installation pour télécharger le navigateur Chrome au complet. Pas pratique dans les intranets.
Il existe cependant une méthode officielle. Il suffit d’utiliser cette url : https://www.google.com/intl/en/chrome/business/browser/admin/ On obtient le téléchargement d’un fichier nommé GoogleChromeStandaloneEnterprise.msi  contenant le navigateur au complet, et qui s’installe dans « C:\Program Files\Google\Chrome ».



Bien sur il faut être admin pour installer cette version


Comme on peut le voir ci-dessous, ChromeSetup.exe ne contient pas le navigateur chrome (746Ko) contrairement à la version msi.

Une fois installé pour tout le monde dans "Program Files", si un utilisateur tente d'installer Chrome dans son espace perso, il obtiendra l'erreur Error 0x00000003


Notes: Fut une époque ou cette méthode ne donnait accès qu’aux versions bêta de Chrome, ce n’est plus le cas.

L’historique de révisions de Chrome est ici : http://googlechromereleases.blogspot.fr/
Les news fraiches à propos de Chrome sont là: http://chrome.blogspot.fr/

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


10 mai 2012

Firefox Synch

Comme beaucoup de choses il faut y gouter pour apprécier. La synchronisation du bookmark, des mots de passe et des préférences fait partie de ces ‘bonnes’ choses. Firefox propose cette fonctionnalité mais la manière de l’activer n’est pas toujours évidente car il y a plusieurs chemins pour faire la même chose. Voici une méthode homogène.

(oui j’utilise un Firefox en Anglais …)

1) Créer le compte de synchronisation depuis le premier poste

Menu: Tools > Options > Onglet "Sync".
Cliquez sur le texte "Setup Firefox sync".
Cliquez sur le bouton "Create a new account".

  email              (aucun mail de confirmation n'est envoyé)
  password       (8 caractères minimum)
  accepter les termes d'utilisation
  capcha

  Cliquer sur le bouton en bas à gauche "Sync options"
    - donnez un nom à cette machine et/ou session et/ou profils.
    - choisissez ce que vous voulez synchroniser.
  Enfin, cliquez sur le bouton "next".
 
  Vos données sont encryptées localement et envoyées sur le serveur de Mozilla.
 
2) Préparer la synchronisation avec d’autres postes

Menu: Tools > Options > Onglet "Sync"
Cliquez sur le texte "pair a Device".
Cliquez sur le texte "I don't have the device with me".
La "Recovery key" sera affichée. Notez/Sauvez là, elle sera demandée sur les autres postes à l'étape #3.

3) Sur les autres postes (ou autres sessions, ou autres profils)

Menu: Tools > Options > Onglet "Sync".
Cliquer sur le texte "Setup Firefox sync".
Cliquez sur le boutton "I Have an Account".
Cliquez sur le texte "I don't have the device with me".
Entrez les informations demandées (les mêmes que celles données à la création du compte).
  email
  password
Puis la "recovery key" obtenue à l’étape #2.

Les données sont récupérées encryptées depuis le serveur de Mozilla, puis décryptées localement, et fusionnées avec la configuration locale.


Notes :

* A tout moment, pour forcer la synchronisation, vous pouvez faire:
Menu: Tools > Synch now

* Pour arrêter la synchroniser faire:
Menu: Tools > Options > Onglet "Sync" 
Cliquez sur le texte "Unlink this device"
Les infos sauvées sur ce compte ne sont pas détruites et la config locale (bookmark, mots de passe, préférences) reste inchangée.

12 avril 2012

HG en 7 commandes

Vous avez un projet en cours de développement et vous aimeriez le partager avec d'autres développeurs. Cela implique de le mettre sous contrôle d’un système de contrôle de révision come CVS, SVN ou Mercurial.

Voici comment passer votre projet sous contrôle de Mercurial en utilisant TortoiseHg, la version Windows de Mercurial. (hg étant le nom du programme utilisé en ligne de commande)

Disons que votre projet à passer sous Mercurial est dans workspace/Demo.

1) init
Allez dans le repertoire workspace.
Bouton droit sur « demo » : TortoiseHg > Create Repository Here


Cliquer « Close »
Un message confirme la création.
En fait hg a créé le répertoire Demo/.hg

2) add
Maintenant il faut ajouter les fichiers à ce repository local. En fait il s’agit de dire à Mercurial quels sont les fichiers qu’il doit prendre en charge.

Aller dans votre répertoire workspace\Demo
Sélectionnez les répertoires et fichiers à passer sous contrôle de Mercurial.
Bouton droit sur la selection de fichiers : TortoiseHg > Add Files…



Une fenêtre listant tous les fichiers à ajouter s’ouvre.
En cliquant sur un nom de fichier on peut voir son contenu.
Confirmez en cliquant sur le bouton « Add »

3) commit
Il faut maintenant dire à Mercurial de faire une copie de ces fichiers dans le repository local (en fait le répertoire .hg)
Bouton droit n’importe où dans le repertoire workspace/Demo : TortoiseHg > Commit…

Une fenêtre s’ouvre avec la liste de tous les fichiers de ce répertoire.
La couleur et la lettre qui préfixe chaque fichier indique l’état du fichier :
  A=Ajouté mais pas encore pris en compte, 
  ?=non géré par mercurial
  ect...

Tapez un commentaire dans le champ en haut à droite.
Cliquez sur le bouton « Commit »

La fenêtre est mise à jour. Les fichiers ajoutés n’y figurent  plus.
La fermer en cliquant sur le bouton « Close »

4) clone
Votre repository local est maintenant en place. Il faut mettre en place le repository central, celui qui vous permettra de partager vos fichiers avec les autres développeurs du monde extérieur.

Bouton droit n’importe où dans le directory workspace\Demo : TortoiseHg > Clone…
Donner l’url de votre repository dans le champ destination. (Voir comment configurer ssh + hg)



Et voila !
Votre repository Mercurial est maintenant opérationnel des deux cotés (local et central).
Vous n’aurez plus à utiliser les commandes init et clone.

Pour mémoire voici comment sont organisés les 2 niveaux de repository (Local/Central) de Mercurial


Ceci signifie qu'il n'est pas necessaire d'etre connecté au réseau pour travailler avec le repository local.

Pour valider votre travail en local : commit
Pour envoyer vos fichiers sur le serveur : push
Pour récupérer des fichiers depuis le server : pull
Pour mettre à jour vos fichiers de travail : update

Ne pas oublier de faire un add chaque fois que l’on crée un nouveau fichier.

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

Paradoxe de Borda

PREALABLE

Ceci n'est pas une discussion sur la fiabilité des sondages mais sur un paradoxe soulevé par Bordas et repris par Condorcet (les sondages n’existaient pas à leur époque). Le paradoxe présenté ici ne fait que rajouter à la complexité d’interprétation des sondages.

Ce qui suit peut s’appliquer à tous types de choix ; qu’il s’agisse de choisir un président de la république, un sous-traitant, un projet à financer ect…  J’utiliserai le vocabulaire des élections (candidats, électeurs, voix) mais ce n’est pas une exigence.

ETABLIR  LES  PREFERENCES

Posons la question suivante à tous les électeurs et supposons que tous les électeurs répondent honnêtement.
« Parmi ces 3 candidats A, B, C pour lequel voteriez vous ? »
On note la réponse de l’électeur, puis on lui repose la question en éliminant de la liste celui qu’il vient de choisir. Ainsi, pour chaque électeur on obtient un classement des 3 candidats.

Exemple :
Q1) Votre choix entre « A, B, C » ?
R2) B.
Q2) Votre choix entre « A, C » ?
R2) A.
Pour cet électeur le classement est donc : B, A, C (ligne 3 dans les tableaux ci-dessous)

NOTES: Avec 3 candidats il y a 6 combinaisons possibles. De manière générale avec n candidats il y a factorielle(n) combinaisons, ce qui croit très vite : 3 candidats 6 combinaisons, 4 candidats 24 combinaisons … 11 candidats 39 916 800 combinaisons. Pour des raisons de facilité j’en reste à 3 candidats mais avec des programmes on peut simuler sans problèmes des millions de combinaisons. Notez qu’avec 12 candidats il y a plus de combinaisons que d’électeurs en Europe !

Imaginons que les préférences des électeurs établissent le classement suivant :

    combinaisons      voix
1    A    B    C       2 %
2    A    C    B      37 %
3    B    A    C       5 %
4    B    C    A      27 %
5    C    A    B       3 %
6    C    B    A      26 %

ANALYSE

39% des électeurs ont mis A en tête (lignes 1 et 2)
32% des électeurs ont mis B est en tête (lignes 3 et 4)
29% des électeurs ont mis C est en tête (lignes 5 et 6)


Notez que ces trois pourcentages sont exactements les même que dans le paradoxe de Condorcet.

Dans un système à deux tours, comme la présidentielle en France, A et B seraient sélectionnés pour le second tour.

Analysons les préférences en prenant les candidats deux à deux.


  1. A face à B : B l’emporte, paradoxalement, avec 58% des voix.
    Le candidat A recevra les voies des combinaisons où il est classé avant B,
    c’est à dire les lignes 1, 2, 5. Soit 2% + 37% + 3% = 42%
    Le candidat B recevra les voies des combinaisons où il est classé avant A,
    c’est à dire les lignes 3, 4, 6. Soit 5% +27% + 12% = 58% 

     
  2. B face à C : C l’emporte, paradoxalement, avec 66% des voix.
    Le candidat B recevra les voies des combinaisons où il est classé avant C,
    c’est à dire les lignes 1, 3, 4. Soit 2% + 5% +27% = 34%
    Le candidat C recevra les voies des combinaisons où il est classé avant B,
    c’est à dire les lignes 2, 5, 6. Soit 37% + 3% + 26% = 66%

     
  3. A face à C : C l’emporte, paradoxalement, avec 56% des voix.
    Le candidat A recevra les voies des combinaisons où il est classé avant C,
    c’est à dire les lignes 1, 2, 3. Soit 2% + 37% + 5% = 44%
    Le candidat C recevra les voies des combinaisons où il est classé avant A,
    c’est à dire les lignes 4, 5, 6. Soit 27% + 3% + 26% = 56%

     

PARADOXE  DE  BORDA

Paradoxalement, le vainqueur du premier tour perd en tête à tête face aux autres candidats. Ici le résultat des tête à tête est l'exact opposé du classement général : C'est le paradoxe de Borda. 

L'ordre, d'aprés les 3 tête à tête, est C, B, A. Contraitement au paradoxe de Condorcet, la transitivite des tête à tête est respectée. Pourtant on ne retrouve pas cette logique dans le classement quand on compares les 3 candidats sur un seul tour.

Le vainqueur de l'ensemble des tête à tête (ici C) est appelé "vainqueur de Condorcet". C'est  celui qui est préféré à tout autre. Mais ce vainqueur n'existe pas toujour : c'est le paradoxe de Condorcet.

Paradoxe de Condorcet

PREALABLE

Ceci n'est pas une discussion sur la fiabilité des sondages mais sur un paradoxe soulevé par Condorcet (les sondages n’existaient pas à son époque). Le paradoxe présenté ici ne fait que rajouter à la complexité d’interprétation des sondages.

Ce qui suit peut s’appliquer à tous types de choix ; qu’il s’agisse de choisir un président de la république, un sous-traitant, un projet à financer ect…  J’utiliserai le vocabulaire des élections (candidats, électeurs, voix) mais ce n’est pas une exigence.

ETABLIR  LES  PREFERENCES

Posons la question suivante à tous les électeurs et supposons que tous les électeurs répondent honnêtement.
« Parmi ces 3 candidats A, B, C pour lequel voteriez vous ? »
On note la réponse de l’électeur, puis on lui repose la question en éliminant de la liste celui qu’il vient de choisir. Ainsi, pour chaque électeur on obtient un classement des 3 candidats.

Exemple :
Q1) Votre choix entre « A, B, C » ?
R2) B.
Q2) Votre choix entre « A, C » ?
R2) A.
Pour cet électeur le classement est donc : B, A, C (ligne 3 dans les tableaux ci-dessous)

NOTES: Avec 3 candidats il y a 6 combinaisons possibles. De manière générale avec n candidats il y a factorielle(n) combinaisons, ce qui croit très vite : 3 candidats 6 combinaisons, 4 candidats 24 combinaisons … 11 candidats 39 916 800 combinaisons. Pour des raisons de facilité j’en reste à 3 candidats mais avec des programmes on peut simuler sans problèmes des millions de combinaisons. Notez qu’avec 12 candidats il y a plus de combinaisons que d’électeurs en Europe !

Imaginons que les préférences des électeurs établissent le classement suivant :

    combinaisons      voix
1    A    B    C      37 %
2    A    C    B       2 %
3    B    A    C       5 %
4    B    C    A      27 %
5    C    A    B      17 %
6    C    B    A      12 %

ANALYSE

39% des électeurs ont mis A en tête (lignes 1 et 2)
32% des électeurs ont mis B est en tête (lignes 3 et 4)
29% des électeurs ont mis C est en tête (lignes 5 et 6)
 

Notez que ces trois pourcentages sont les mêmes que dans le paradoxe de Borda.

Dans un système à deux tours comme la présidentielle A et B seraient sélectionnés pour le second tour.

Analysons les préférences en prenant les candidats deux à deux.


  1. A face à B : A l’emporte, logiquement, avec 56% des voix.
    Le candidat A recevra les voies des combinaisons où il est classé avant B,
    c’est à dire les lignes 1, 2, 5. Soit 37% + 2% + 17% = 56%
    Le candidat B recevra les voies des combinaisons où il est classé avant A,
    c’est à dire les lignes 3, 4, 6. Soit 5% +27% + 12% = 44%

  2. B face à C : B l’emporte, logiquement, avec 69% des voix.
    Le candidat B recevra les voies des combinaisons où il est classé avant C,
    c’est à dire les lignes 1, 3, 4. Soit 37% + 4% +27% = 69%
    Le candidat C recevra les voies des combinaisons où il est classé avant B,
    c’est à dire les lignes 2, 5, 6. Soit 2% + 17% + 12% = 31%

  3. A face à C : C l’emporte, paradoxalement, avec 56% des voix.
    Le candidat A recevra les voies des combinaisons où il est classé avant C,
    c’est à dire les lignes 1, 2, 3. Soit 37% + 2% + 4% = 44%
    Le candidat C recevra les voies des combinaisons où il est classé avant A,
    c’est à dire les lignes 4, 5, 6. Soit 27% + 17% + 12% = 56%

PARADOXE  DE  CONDORCET

Paradoxalement, le vainqueur du premier tour perd face à celui qui serait éliminé au premier tout !!  

En maths on dit que la transitivité n’est pas respectée. La transitivité c’est ce qui dit que : Si A pèse plus lourd que B et que B pèse plus lourd que C alors A pèse plus lourd que C. Le poids permet d’établir une relation transitive entre les personnes. Pas le vote !

Ce n’est pas l’absence de cette logique qui est la cause de ce paradoxe. Borda a montré que même avec des tête à tête transitifs on n’obtenait pas toujours un classement à un tour représentant cette logique.

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