samedi 16 janvier 2016

Virtualisation part 2: Préparer les sources de linux et Xen

  Objectifs

Linux est installé, nous préparons les sources à compiler et l'environnement.

  Options qemu

Rapidement parler des options qemu que j'utilise:

 -enable-kvm : comme mon PC est un x86_64 et que je n'émule pas sous qemu une autre architecture, j'utilise kvm pour la virtualisation matérielle,
  -cpu host : j'indique ici à qemu d'utiliser directement le type de cpu de mon PC,
 -smp 4 : je permets à qemu d'utiliser 4 coeurs,
 -m 2048 : je lui donne 2Go de mémoire,
 -hda xxx : le disque 1 sera xxx
 -hdb yyy : le disque 2 sera yyy


  Backing file

Maintenant que l'installation est faite de la Debian 7.8, je vais veiller à ne pas l'abîmer et pour cela rien de plus facile que d'utiliser un snapshot disque.

L'idée est de créer un nouveau disque qui est l'image du 1er mais qui ne contiendra que les modifications du travail qui va suivre.
Ainsi, si pb, le 1er disque est intact et il suffit de refaire une image de travail à partir de lui pour reprendre proprement.

Pour créer le backing, sur mon PC hôte:
$ qemu-img create -f qcow2 -b xendeb.qcow  xendeb2.qcow

xendeb2.qcow devient notre second disque sur lequel nous allons poursuivre les mises à jour.

 DiskB

Autre chose, je crée, sur mon PC hôte, un disqueB qui va me permettre de faciliter les transferts entre mon PC et linux sous qemu.
Je pourrai monter ce disque simplement dans un répertoire local sur mon PC et sous qemu.

Ok, je pouvais faire cela avec le disque qcow, mais je trouve pénible les montages en nbd même si c'est génial et bien pratique dans d'autres circonstances. Et oui aussi, je peux faire cela par réseau lorsque celui-ci sera configuré. A voir suivant mon humeur... :-)

Création du disque B:
$ truncate diskB.raw --size 32G

Je le formate en ext2:
$ sudo mkfs.ext2 diskB.raw

Et je le monte dans un répertoire mnt local (que je crée si nécessaire):
$ mkdir mnt
$ sudo mount diskB.raw mnt

Par la suite j’appellerai Bmnt le répertoire où je monte diskB.

Attention, il me faudra monter/démonter régulièrement ce disque afin de l'utiliser une fois dans mon environnement PC (hôte), une fois sous qemu.

 

  Script lancement qemu

Comme je n'ai pas envie de multiplier les commandes pour démarrer mon environnement qemu, j'écris un script shell go.sh:
#!/bin/bash
# I would like to test XEN Ballooning
#
#
DISKNAME=xendeb.qcow
DISKB=diskB.raw
WORKDISKNAME=xendeb2.qcow
RMWORK="TRUE"

# $1 $... - the message string
die()
{
  retcode=-1
  printf >&2 "%s\n" "$@"
  exit $retcode
}

while [ "$1" != "" ]; do
  if [ "$1" == "-no-rm" ]; then
    RMWORK="FALSE"
  else
    die "Unknown option $1. Only valid is -no-rm";
  fi
  shift
done

# working disk deletion
if [ "$WORKDISKNAME" == "" ]; then
  echo "No Work Disk used !!!";
else
  echo "Work Disk used !!!";
  if [ "$RMWORK" == "TRUE" -a -f $WORKDISKNAME ]; then
      echo "it is recreated"
      rm $WORKDISKNAME || die "$WORKDISKNAME deletion failed"
  else
      echo "it is not recreated"
  fi
fi

# Go go go
if [ "$WORKDISKNAME" != "" ]; then
  if [ ! -f $WORKDISKNAME ]; then
    qemu-img create -f qcow2 -b $DISKNAME $WORKDISKNAME
  fi
else
  WORKDISKNAME=$DISKNAME
fi
qemu-system-x86_64 -enable-kvm -cpu host -smp 4 -m 2048 -hda $WORKDISKNAME -hdb $DISKB
En deux mots, ce script va démarrer qemu avec un disque A (xendeb2.qcow) qui sera le disque de travail et un disque B (diskB.raw).

xendeb2.qcow est effacé à chaque démarrage (si l'option -no-rm n'est pas utilisée) et recréé comme backing file de xendeb.qcow. Nous repartons donc à chaque démarrage sur une image propre.

 

  Linux Vanilla

Je vais utiliser le diskB pour y placer les sources linux et xen que je vais utiliser pour les générations.

Tout d'abord, quelle est la version du noyau que j'ai installé via le CD Debian ?
Pour cela je regarde dans le fichier /boot/config-3.2.0-4-amd64 sous qemu. Donc je lance la machine virtuelle qemu en utilisant mon script:

$ go.sh

Une fois qemu démarré et le linux booté, je me loggue comme root et un simple head me permet d'afficher la 1ère ligne du fichier où se trouve la version exacte du noyau:
$ head /boot/config-3.2.0-4-amd64

Je lis sur la troisième ligne qu'il s'agit d'un 3.2.73. Je vais donc le chercher dans les archives du noyau:
https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.2.73.tar.xz

Et j'arrête ma machine qemu:
$ halt

Sur mon PC hôte, je télécharge donc les sources d'un kernel linux. Et je le décompresse dans Bmnt:
$ cd Bmnt
$ sudo tar xJf ~/Téléchargements/linux-3.2.73.tar.xz

   Source Xen

Pendant que j'y suis, je vais aussi y placer les sources de Xen 4.1.4:
http://www.xenproject.org/downloads/xen-archives/supported-xen-41-series/xen-414.html

Une fois téléchargées sur le site précédent,  je les décompresse dans Bmnt:
$sudo tar xzf ~/Téléchargements/xen-4.1.4.tar.gz


Voilà pour cette partie deux. Pour la suite nous allons passer sous qemu pour compiler tout ce petit monde...

Virtualisation part 1: Qemu, Xen, Linux et Ballooning

Allez, je me lance dans un tuto d'installation de Xen et de mise en œuvre du ballooning. Le tout sous qemu car je ne souhaite pas réinstaller ma machine.

Ce tuto sera en plusieurs parties afin de ne pas faire des articles trop longs.

Mon objectif est le suivant:
Je vais installer une machine (Dom0) avec Xen dans qemu, créer 2 machines virtuelles (DomU), vous faire une petite configuration réseau et au final vous montrer comment faire du ballooning dans les deux VMs.

Le tout sur une ancienne version de linux et de Xen afin de montrer une génération du kernel pour le Dom0, pour les DomU et aussi générer ma version de Xen.

Au passage j'en profiterai pour parler un peu du mécanisme de ballooning et des backing files de qemu.

Bref, voilà, pas mal de choses je crois.
Bon voyage...

PS: je ne garantis pas que ma démarche est parfaite et qu'elle est la plus efficace. Mais c'est celle que j'ai réussi à faire fonctionner.

 Ma configuration

Je suis sous environnement linux Debian 8 "Jessie" en 64bits (amd64), et je vais installer sous Debian 7.8 "Wheezy" en 64bits; ne me demandez pas pourquoi, je vous répondrai : et pourquoi pas ?

 Pré-requis

Je travaille en mode console en bash shell sous Debian Jessie. Je n'expliquerai pas comment utiliser le shell linux donc si nécessaire, n'hésitez pas à vous faire la main en shell par ailleurs.

 Qemu sous Debian

En théorie, rien de bien sorcier pour installer Qemu sous Debian si vous êtes habitués aux packages.
Moi j'ouvre une console, dans laquelle je fais un:
$ sudo aptitude
Et une fois dans le gestionnaire de paquets je vais sélectionner le paquet qemu dans otherosfs/main, j'en demande son installation dans le menu et let's Go... qemu doit être installé.

Préparation disque

Tout d'abord, je crée un disque qemu de travail (nommé: xendeb.qcow) pour installer ma version linux Wheezy.

Pour cela, dans mon répertoire de travail, je fais:

$ qemu-img create xendeb.qcow 128G

Très honnêtement, je n'ai pas besoin de 128G mais bon... J'ai de la place alors. Et de toute manière, le disque ne fait pas physiquement 128Go mais il se remplira petit à petit au besoin.

Je profiterai de cet article pour parler du backing file (ou snapshot) que l'on peut faire sous Qemu pour gérer des disques en mode Redirect On Write.
C'est super extra pratique pour ne pas détruire une installation par manipulation du disque.

Récupération de l'image d'installation Wheezy

Afin d'installer le linux hôte (ou Dom0), je récupère une iso de la distribution Debian Wheezy. Et la mauvaise nouvelle est que la méthode pour récupérer une vieille version Debian est... particulière.

et suivre les instructions.

En particulier, dans mon cas, je télécharge ma version Debian 7.8 dans:

Et il faut que je passe par l'outil jigdo pour obtenir le CD d'installation.
Note: je n'utiliserai que le CD1 pour mon tutoriel.

Pour jigdo, rebelote, il faut passer par aptitude pour l'installer.
Voir plus haut l'installation de qemu, c'est pareil mais pour jigdo.

Donc, pour récupérer le CD1 je fais:
$jigdo-lite http://cdimage.debian.org/mirror/cdimage/archive/7.8.0/amd64/jigdo-cd/debian-7.8.0-amd64-CD-1.jigdo

Ainsi j'obtiens après un long téléchargement, l'image de mon CD du 
nom de : debian-7.8.0-amd64-CD-1.iso

Installation linux Debian 7.8 qui deviendra le Dom0

Maintenant que j'ai le CD, j'effectue l'installation sur mon disque virtuel créé précédemment.
Pour cela:
$qemu-system-x86_64 -enable-kvm -cpu host -smp 4 -m $((2*1024)) -boot d -hda  xendeb.qcow  -cdrom debian-7.8.0-amd64-CD-1.iso

Je ne vais pas expliquer en détail l'installation, mais faire une liste à la Prévert rapide des choix ou étapes:

  • Install
  • French
  • France
  • Français
  • Nom de machine: debian
  • domaine: <rien>
  • mot de passe root: rootc'est pas bien mais j'm'en f...
  • nouvel utilisateur: user
  • mot de passe: userc'est pas bien mais j'm'en f...
  • Partitionnement disque: Assisté - utiliser un disque entier
  • SCSI1
  • Tout dans une seule partition
  • Terminer et appliquer
  • Oui
  • Non je n'analyse pas d'autre CD
  • Faut-il utiliser un miroir, Non.Pour le moment en tout cas
  • non, je ne participe pas aux statistiques des paquets
  • je décoche l'installation de l'environnement de bureau Debian
  • continuer
  • oui, installer le programme de démarrage grub
  • et redémarrer... et fermer la fenêtre qemu quand cela reboot
Voilà, nous avons maintenant une installation Debian 7.8 en mode console sous qemu.

En fin de ce billet, nous devons avoir un disque xendeb.qcow avec une installation Debian dessus. qemu est arrêté et je suis revenu sur mon PC hôte.

jeudi 19 novembre 2015

kvm nested et ept

Lors de l'utilisation du module kvm, penser à vérifier l'état de ses paramètres:
$ systool -v -m kvm
Module = "kvm"

  Attributes:
    coresize            = "456261"
    initsize            = "0"
    initstate           = "live"
    refcnt              = "1"
    srcversion          = "BC27E5FC9EC8E4A83C79517"
    taint               = "F"
    uevent              = <store method only>

  Parameters:
    allow_unsafe_assigned_interrupts= "N"
    ignore_msrs         = "N"
    min_timer_period_us = "500"
    tsc_tolerance_ppm   = "250"
...
 Penser aussi à vérifier le module "kvm_intel" afin d'activer les "ept" et "nested"
$ systool -v -m kvm_intel
Module = "kvm_intel"

  Attributes:
    coresize            = "137928"
    initsize            = "0"
    initstate           = "live"
    refcnt              = "0"
    srcversion          = "0DB7A728004E8D66BAA5199"
    taint               = "F"
    uevent              = <store method only>

  Parameters:
    emulate_invalid_guest_state= "Y"
    ept                 = "Y"
    eptad               = "Y"
    fasteoi             = "Y"
    flexpriority        = "Y"
    nested              = "Y"
    ple_gap             = "128"
    ple_window          = "4096"
    unrestricted_guest  = "Y"
    vmm_exclusive       = "Y"
    vpid                = "Y"
Si les paramètres ne sont pas correctes, faire:
$ sudo rmmod kvm_intel
$ sudo modprobe kvm_intel ept="Y" nested="Y"


lundi 26 octobre 2015

Monter une partition lvm d'un disque loop

Voici un petit article qui indique comment monter puis démonter une partition lvm présente sur un disque virtuel "loop".

J'ai un fichier disk.img qui est un disque loop.
Ce disque est partitionné initialement en mode dos avec une partition linux de type 83:

$ sudo fdisk -lu disk.img
Disk disk.img: 17.2 GB, 17179869184 bytes
171 têtes, 2 secteurs/piste, 98112 cylindres, total 33554432 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Identifiant de disque : 0x96c428f3

Périphérique Amorçage  Début         Fin      Blocs    Id. Système
disk.img1            2048    33554431    16776192   83  Linux
Afin de monter la partition, je l'attache d'abord à un /dev/loop:
$ sudo losetup -o $((512*2048)) /dev/loop0 disk.img
Une fois cela fait, avec la commande lsblk nous pouvons voir les partitions lvm :
note:pvscan permet aussi de voir le groupe virtuel.
$   lsblk
NAME                  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0                   7:0    0    16G  0 loop
├─vg0-g1--swap (dm-0) 252:0    0   128M  0 lvm 
├─vg0-g1--disk (dm-1) 252:1    0     2G  0 lvm 
└─vg0-lnx (dm-2)      252:2    0    10G  0 lvm 
Je souhaite monter la partition vg0-lnx sur le point de montage /mnt:
Je fais alors simplement:
$ sudo mount /dev/vg0/lnx /mnt
 Pour démonter et détacher le fichier loop:
$ sudo umount /mnt
$ sudo  vgchange -an
$ sudo losetup -d /dev/loop0

lundi 16 février 2015

Configuration d'une liaison série sous linux et outils

Pour configurer une liaison série sous linux nous pouvons utiliser stty
Outil  pour accéder à une liaison série minicom


Exemples: 
 pour passer à 115200 bauds la liaison série /dev/ttyS0

$ sudo stty -F /dev/ttyS0 speed 115200

 pour passer à 115200 bauds 8bits de données, 1 bit de stop et pas de parité

$ sudo stty -F /dev/ttyS0 speed 115200 cs8 -parenb crtscts -echo -cstopb -ixon



Liens: stty

lundi 28 juillet 2014

Image Magick - Faire un tableau d'image

Image Magick
Faire un tableau d'image

Image Magick est une suite d'outils de traitement d'images formidable.
Cette suite est accessible ici : http://www.imagemagick.org

Afin de créer des tableaux de photos, j'ai fait un petit script python que voici:

import os

def strFor(strObj):
    return strObj.replace('[','').replace(']','').replace('\'','').replace(',','')

l = os.listdir()
r = []
counter=0
for x in l:
    if '.JPG' in x:
        r.append(x)
        if len(r) == 10:
            counter = counter + 1
            print('convert -label "%%f" '  + strFor(str(r)) + ' -frame 10x5+3+0 miff:- | montage - -tile 5x2 -frame 5 -geometry "512x512+5+5>" thumb{}.png'.format(counter))
            r = []

if len(r)>0:
    counter = counter + 1
    print('convert -label "%%f" '  + strFor(str(r)) + ' -frame 10x5+3+0 miff:- | montage - -tile 5x2 -frame 5 -geometry "512x512+5+5>" thumb{}.png'.format(counter))
Ce script permet de créer un second script (ici un batch windows) qui va permettre d'exécuter les commandes convert et montage de la suite Image Magick pour créer des tableaux de 5x2 images.

Les commandes convert et montage doivent être dans le PATH.

Pour faire une conversion de png vers jpg: mogrify -format jpg *.png
ATTENTION: mogrify remplace le fichier original.

mercredi 9 juillet 2014

Émuler un port de communication RS232 sur Linux et le lier à TCP/IP



Article intéressant pour comprendre les ports série sous linux : http://pficheux.free.fr/articles/lmf/serial/



1 - Solution à essayer avec Socat :
socat -d -d PTY,ignoreeof,echo=0,raw,link=f1 PTY,ignoreeof,echo=0,raw,link=f2 &

options :
-d -d : affiche les messages fatal, erreur, warning et notice
PTY : ouvre un pseudo terminal (pty)
ignoreeof : ne ferme pas le 'tunnel' si eof est rencontré
echo=0 : ???
raw : à priori, passe les infos input/output sans traitement (pas de mode canonique => pas d'attente de line feed [LF] pour envoyer/recevoir les caractères)
link=f1 : nomme le lien f1

La solution 1 fonctionne en faisant :
- la commande
- puis deux terminaux
- dans l'un : cat f2
- dans l'autre cat «<fichier> > f1


Utilisation de minicom

Une fois installé, minicom est simple d'utilisation. Il faut le lancer avec -s afin d'obtenir un écran de configuration qui permette de configurer le port série à utiliser et beaucoup d'autres options.

En démarrant minicom dans deux terminaux indépendant et sur les /dev/pts/12 et 14 (selon liens proposés sous f1 et f2), nous pouvons communiquer en liaison série entre les deux minicom.

Essai de lier une interface TCP/IP à un port série

socat -d -d PTY,ignoreeof,echo=0,raw,link=f1 TCP-LISTEN:22021,ignoreeof

Cela fonctionne ensuite en utilisant minicom d'un côté :
minicom -p /dev/pts/12

et netcat de l'autre :
netcat 127.0.0.1 22021

Essai de lier une interface TCP/IP à un device système (/dev/urandom)

socat -d -d /dev/urandom TCP-LISTEN:22021,ignoreeof

et netcat de l'autre :
netcat 127.0.0.1 22021

Essai pour lier une RS (ex /dev/ttyS0) existante à un port TCP/IP:

socat -d -d /dev/ttyS0 TCP-LISTEN:22021,ignoreeof

attention: il faut au préalable configurer la liaison série par exemple avec stty

Des exemples intéressants :
A cette adresse des exemples intéressants d'usage de socat :