15 novembre 2012

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.