lindev.fr

Aller au contenu | Aller au menu | Aller à la recherche

Mot-clé - fichier

Fil des billets - Fil des commentaires

27 mai 2011

LVM exemple de mise en pratique

recuperation-donnees-fichiers-9.jpg Cela fait longtemps que je tourne autour de ce gestionnaire de volumes jamais avoir eu l'occasion d'y mettre les mains . Aujourd'hui c'est chose faite !

LVM / LVM2 utilisation

Il y a quelques jours j'ai eu pour mission la mise en production d'un serveur web linux, hébergé sur une plateforme de virtualisation microsoft Hyper-V. Le contrainte principale était bien entendu la disponibilité de ce serveur , mais aussi la possibilité de restaurer le serveur sans connaissance particulière et surtout en un temps record ..

Première possibilité ,

La mise en place d'un cluster ( soit , deux machines virtuelles en front ou une maitre et l'autre esclave ). La machine hôte ( Hyper-V ) étant déjà bien chargé , la mise en place d'une seconde VM n'était pas envisageable.

Seconde possibilité ,

La machine hôte étant associée à une baie SAN, nous avons donc migré les données variables ( sources et BDD ) sur cette dernière , ce qui rend la restauration de la machine virtuelle aussi simple qu'un "copier coller", à partir du moment ou la vm est sauvegardé.

Pourquoi LVM

J'y viens, mettre les données dynamiques sur la baie SAN est bien beau , mais figer une taille de disque ( aussi virtuel soit-il ) est assez délicat. A moins d'être devint, il est très difficile d'estimer une taille suffisamment grande pour supporter les éventuelles évolutions, et il serait vraiment dommage de gâcher de de l'espace disque en surestimant le besoin .( l'espace disque SAS est à utiliser avec parcimonie, le moindre Go de cette qualité est précieux ).

J'ai donc créé un disque virtuel d'une taille fixe de 5Go ( il est aussi possible de créer un disque à taille variable , mais les performances chutent de 30% selon la doc ... ). 5Go est bien assez pour commencer et être tranquille un bon moment ( plus ou moins long selon l'activité ).

Ce disque virtuel nommé sdb ( que nos pouvons comparer à un disque dur physique ), sera dans un premier temps formaté, et nous allons créer une partition primaire sdb1 .

Création de la partition primaire

cfdisk /dev/sdb

Maintenant, étant donné que je souhaite utiliser ce disque avec LVM, il est nécessaire de déclarer la partition fraichement créée

Déclaration de la partition sdb1 à LVM

pvcreate /dev/sdb1

Maintenant étape importante, créer le groupe de volume(s) GV. Ce groupe de volume peut être représenté comme une unité regroupant un ensemble de volumes , ou plus simplement expliqué , une grosse partition composée de une ou plusieurs partitions de niveau inférieur appartenant ou non au même disque dur . Ce ne sera plus à vous de gérer la répartition de vos données sur entre les différentes partitions , le GV s'en chargera pour vous.

Création du GV ( Groupe de volumes )

vgcreate MONGROUP /dev/sdb1

Nous voilà maintenant avec un superbe groupe de volumes nommé MONGROUP sur lequel nous allons créer nos volumes logiques LV ( pour les utiliser comme des partitions standard )

Création d'une partition LV ( Volume Logique )

lvcreate -n mapartition -L 4,95g MONGROUP

warning.png Attention à mettre une taille valide, elle ne doit en aucun cas être supérieur à l'espace disponible ( risque de pertes ).

La partition maintenant créée, dernière étape avant de l'exploiter, le formatage .

Formatage de la partition mapartition

mkfs -t ext4 /dev/MONGROUP/mapartition

Et voilà notre volume prêt à l'emploi .

Ne reste plus qu'à le monter .. et l'exploiter ..

mount -t ext4 /dev/MONGROUP/mapartition /mnt

Je vous vois déjà venir en me disant .. que jusqu'à maintenant .. il n'y a pas d'avantage à utiliser LVM ... C'est vrai , créer simplement une partition et la formater directement serait tout aussi performant et bien plus rapide à mettre en place ..

Ok, alors le temps passe et tout d'un coup vous recevez mail de votre client indiquant avoir reçu plusieurs alerte concernant l'espace disponible sur le disque .. aïe !

Pas de panique puisque vous avez pris la peine de créer une partition géré par LVM, dans notre cas il suffira d'augmenter la taille de notre disque virtuel ( ou d'en créer un second ) et de l'ajouter à notre groupe de volumes MONGROUP

Augmenter la capacité du volume

Voyons comment faire cette manip en 5 minutes.

Dans un premier temps il faut démonter le volume avec la commande umount

Démonter le volume à modifier

umount /mnt

Puis il nous faut créer une nouvelle partition ( à partir du nouveau disque ou de l'espace disponible sur le disque virtuel sdb 5G de plus )

cfdisk /dev/sdb

info.png La nouvelle partition sera déclarée comme étant sdb2 ( à adapter dans votre cas )

Une fois la partition créée, nous allons la déclarer à LVM

pvcreate /dev/sdb2

Nous allons ensuite étendre notre groupe de volumes ( MONGROUP ) afin qu'il prenne en compte ma nouvelle partition , et de ce fait , offrir autant d'espace en plus.

Extension du groupe de volumes

vgextend MONGROUP /dev/sdb2

Voilà qui est fait. Nous allons vérifier la partition existante avant de la redimensionner

Vérification de la partition existante

e2fsck -f /dev/MONGROUP/mapartition

Une fois terminé, l'étape la plus importante , le redimensionnement de la partition . Pour commencer nous allons redimensionner notre volume logique ( LV ) mapartition

Redimensionnement de mapartition ( LV )

lvresize -L9,95g /dev/MONGROUP/mapartition

warning.png Attention à mettre une taille valide, elle ne doit en aucun cas être supérieur à l'espace disponible ( risque de pertes ).

Enfin, le volume logique redimensionné, reste à redimensionner notre système de fichiers ext4

Redimensionnement du système de fichiers ext4

resize2fs /dev/MONGROUP/mapartition

Et voilà mon espace disque vient d'augmenter de 5Go . Cette opération peut être répété autant de fois que nécessaire .

lvm2.png

Ch.

14 sept. 2010

Git pour une petite équipe

header.gif Un billet sans prétention , qui explique comment mettre en place GIT sur un serveur pour partager les sources entres développeurs afin de permettre le travail en équipe sans risquer de se marcher dessus .

Installation

Cette étape est la même sur les postes clients et sur le serveur .

L'installation est très simple , dans un premier temps vérifier que les paquets suivants sont bien installé :

apt-get install curl-devel expat-devel gettext-devel openssl-devel zlib-devel

Une fois fait ,

apt-get install git-core

Votre identité

Il vous faut ( sur chaque poste client ) définir au moins deux paramètres qui permettrons de vous identifier à chaque commit , il est donc important de les initialiser .

cd ~
git config --global user.name "Mon nom"
git config --global user.email [email protected]

Nous voilà maintenant prêt à utiliser git .

Créer l'utilisateur git

Pour simplifier les étapes suivantes ( connexion ssh ) nous allons créer tout de suite l'utilisateur **git**

sudo adduser git

Nous allons limiter les possibilités de ce nouvel utilisateur sur le serveur , pour celà , nous allons lui attribuer un autre interpréteur de commande .

sudo vim /etc/passwd

Remplacer /bin/bash à la ligne ( selon l'interpréteur par défaut )

git:x:1002:1003:,,,:/home/git:/bin/bash

par

git:x:1002:1003:,,,:/home/git:/usr/bin/git-shell

Créer un Dépôt vierge sur le serveur

Voilà une étape importante et indispensable pour ce que nous souhaitons faire .
Rendez-vous sur votre serveur de développement , dans le répertoire qui contiendra les dépôts .

su git
cd /var/www/depotsGit
mkdir monProjet.git
git --bare init 

Et voilà votre dépôt est bien créé.

Accès ssh

Afin de na pas avoir à rentrer le mot de passe de git à chaque "push" nous allons mettre en place l'authentification ssh par certificats .
Suivez les étapes suivantes :

Sur votre poste utilisateur

Génération des clef

N'entrer ni passphrase ni mot de passe , passer les étapes en tapant "enter" ...

cd ~
ssh-keygen -t rsa 

Copie de la clef public

Copier le contenu de se fichier

vim ~/.ssh/id_rsa.pub

Sur le serveur

Nous allons ajouter la clef public au compte git .

su git
cd ~
mkdir .ssh
vim authorized_keys

Copier la clef public dans de fichier , enregistrez et quittez .

Répéter cette étape ( copier-coller de clef publique ) pour chaque poste qui doit avoir un accès aux dépôt GIT .

Premier git push

Retournez sur votre machine ( poste utilisateur ) , vérifiez tout de même que vous avez un accès ssh sans mot de passe

ssh [email protected]

Vous devriez avoir un message de ce type :

fatal: What do you think I am? A shell?
Connection to golum closed.

Si c'est la cas bravo tout va bien , sinon, revoyez le passage clef ssh/public.

Nous allons maintenant nous occuper de nos fichiers sources , rendez-vous dans le répertoire qui va contenir vous sources .

mkdir /var/www/monSite
cd /var/www/monSite

Le répertoire est pour le moment vide , nous allons donc créer un premier fichier , **.giignore** qui vous servira peut être plus tard ( vous pouvez créer ce que vous voulez comme fichier , j'utilise .gitignore car quite à faire un test , autant faire quelque chose qui me servira :) )

Initialisation du dépôt local

Il nous faut initialiser notre dépôt local , afin que **git** gère les fichiers de ce répertoire .

touch .gitignore
git init
git add .
git commit -a -m "Initialisation Dépôt local"

Et voilà , vous avez désormais un dépôt local sur lequel vous pouvez gérer vos versions , vos branches ect .. bref utiliser toute la puissance de GIT.

Synchronisation avec le serveur de dépôts

Étape importante maintenant puisque nous souhaitons rendre nos sources public ( enfin public pour les postes qui auront copié leur clef public sur le serveur )

cd /var/www/monSite
git remote add origin [email protected]:/var/www/depotsGit/monProjet.git
git push origin master

Cette dernière ligne aura pour effet d'envoyer les modifications dans le dépôt sur le serveur sur a branche "master".

Chaque développeur déclaré dans authorized_keys peut maintenant cloner le dépôt à partir du serveur , mais aussi envoyer leurs modifications .
Par exemple , si je veux cloner le dépôt actuel et donc récupérer le fichier **.gitignore** que vous avez posté .

cd /var/www/
git clone [email protected]:/var/www/depotsGit/monProjet.git

Fin

Je vous laisse lire les nombreux tutoriaus concernant les commandes de bases de GIT , pour ajouter supprimer renommer les fichiers branches ect ...

www.deimos.fr
www.alexgirard.com
www.siteduzero.com
www.unixgarden.com

23 mar. 2010

PHP et Clamav

PHP + Clamav = PHP ClamAV Lib

php-clamav_logo.png Passer les fichiers uploadés par un anti-virus , n'est plus marginal de nos jours . Même sur des systèmes linux , il faut se protéger ...

Etat des lieux

Nous allons donc utiliser un serveur web , avec apache et php5.x d'installé , évidemment clamav sera lui aussi installé et fonctionnel , si ce n'est pas le cas, vous pouvez vous reporter à ce tuto pour son installation .

Dans mon cas , je souhaitai vérifier les fichiers uploadés via un serveur FTP , comme j'ai mis en place un script PHP qui épluche les logs et averti les utilisateurs finaux de l'arrivée d'un nouveau fichier à traiter .

N'ayant finalement pas envi de mettre en place un serveur mandataire FTP transparent pour intégrer l'antivirus , j'ai décider d'utiliser le script de surveillance pour en plus d'avertir les personnes concernés , vérifier les fichiers et les supprimer en cas de détection positive .

PHP ClamAV Lib

Nous allons donc récupérer et décompresser l'archive , sur le site de ClamAV

wget http://sourceforge.net/projects/php-clamav/files/0.15/php-clamav_0.15.2.tar.gz/download
tar xzf php-clamav_0.15.2.tar.gz
rm php-clamav_0.15.2.tar.gz
cd php-clamav_0.15.2/

Compilation

phpize
./configure --with-clamav
make 
make install

PHP.ini

Nous allons donc changer un ou deux petits paramètres dans le php.ini
A commencer par le paramètre extension_dir si ce n'est pas encore fait .
A la fin de la compilation , le chemin à définir vous est indiqué , pour moi , ce sera :

extension_dir = "/usr/lib/php5/20060613/"

Ensuite , il nous faut lier l'extension clamav à php , pour celà nous allons ajouter à la fin du fichier php.ini ces quelques lignes :

extension=clamav.so
[clamav]
clamav.dbpath=/var/lib/clamav
clamav.maxreclevel=0
clamav.maxfiles=0
clamav.archivememlim=0
clamav.maxfilesize=0
clamav.maxratio=0

Enregistrez les fichier et redémarrez apache pour prendre en compte les derniers changements .
Pour vérifier que le module soit bien activé , vous pouvez entrer cette ligne de commande :

php -m | grep clamav

Qui doit normalement vous retourner clamav



Ou alors faire le grand standard echo phpinfo();

Utilisation

Ca y est vous avez fait le plus dur ... avouez que c'était simple !
Bon , ne nous reste plus qu'à utiliser ce module fraichement installé .

Dans les sources , vous avez peut être remarqué la présence d'un fichier php nommé phpclamav_test.php
N'hésitez pas à le tester , et l'ouvrir pour voir les fonctionnalités du module .

Voici son résultat :

test-clamav.jpeg

La fonction la plus utile est bien évidemment cl_scanfile qui prend deux arguments ,

  1. Le chemin vers le fichier à analyser
  2. La variable qui se verra attribué le nom du virus en cas de détection d'infection

La valeur de retour a deux valeur possibles :

  • 1 : détection de virus
  • 0 : pas de détection de virus

Ce qui vous donne donc un script du style , ( à adapter à votre utilisation )

$file = "/var/www/monfichier.zip";

$retcode = cl_scanfile($file, $virusname);
    if ($retcode == CL_VIRUS) {
        echo "<b>File path : </b>".$file."<b>Return code : </b> Virus found name : ".$virusname; 
    } else {
        echo "<b>File path : </b>".$file."<b>Return code : </b> Le fichier est sain"; 
    }

Faites vos test

Il ne vous reste plus qu'à tester vos scripts avec eicar , disponible sur son site.

Ch.

22 mar. 2010

Un antiVirus sous linux

Mon but est d'installer une solution anti-virus efficace sur mon serveur FTP.
virus.gif La solution retenu sera ClamAv qui je pense est largement assez puissante pour mon objectif .
Voilà la situation , serveur Linux sous débian lenny , avec VsfTP comme serveur FTP

L'installation

Commençons par le commencement ...

Prérequis

Voici les paquets qui doivent être installé avant la mise en place de ClamAv

#apt-get install zlib1g zlib1g-dev gcc bzip2 libbz2-dev build-essential ncurses-dev

Il nous faut ensuite créer l'utilisateur qui sera utilisé par ClamAv

groupadd clamav
useradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav

Récupération des sources et décompression

A vous de vérifier qu'il n'y a pas de nouvelle version depuis l'écriture de ce billet , ici nous allons installer la version 0.95.3

wget http://downloads.sourceforge.net/project/clamav/clamav/0.95.3/clamav-0.95.3.tar.gz?use_mirror=heanet

Ne reste plus qu'à décompresser ...

zcat clamav-0.95.3.tar.gz | tar xvf -
cd clamav-0.95.3

Compilation

Pour la compilation , vous avec de nombreuses option , pour les lister , voici la commande

$./configure --help | less

Pour une utilisation standard , voilà les commandes à utiliser

$./configure --sysconfdir=/etc --with-user=clamav --with-group=clamav --with-dbdir=/var/lib/clamav
$make
#make install

N'oubliez pas la mise à jour des liens des libs

#ldconfig

Les Chemins

Pour une bonne utilisation , il nous faut maintenant créer les répertoires suivants :

mkdir /var/lib/clamav /var/run/clamav /var/log/clamav
chown -R clamav:clamav /var/lib/clamav /var/log/clamav /var/run/clamav

Les fichiers de configuration

Ils se trouvent dans /etc et sont :

  • freshclam.conf
  • clamd.conf

Comparez et commentez/dé-commentez ce qu'il faut ( n'oubliez pas de commenter la ligne "exemple" au début de chacun de ces fichiers )

Voici les fichiers tel que vous devriez les avoir avec la configuration

clamd.conf
freshclam.conf

Mises à jours automatique

Pour mettre en place la mise à jour automatique des signatures de virus , nous allons créer une tâche CRON

#vim /etc/cron.d/freshclam

Voici le contenu de ce fichier

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

0 0,6,12,18 * * * clamav /usr/local/bin/freshclam --log-verbose
@reboot amavis /usr/local/bin/freshclam

MAILTO permet de définir l'utilisateur qui recevra les resultats/erreurs par courrier
Pour la périodicité , nous avons mis ici l'exécution du script chaque jour à 6h00 12h00 et 18h00 .Ainsi qu'au reboot éventuel de la machine .

Démarrer le démon au démarrage

Et oui dans la configuration actuelle , le mode daemon est activé , ce qui a pour avantage de charger une fois pour toute les signatures en mémoire à son démarrage , plutot qu'à chaque scan

Nous allons ajouter le petit script de start dans init.d

#vim /etc/init.d/clamd

voici le contenu

#!/bin/sh
# clamd

case "$1" in
'start')
	/usr/local/sbin/clamd
	;;
'stop')
/usr/bin/killall clamd > /dev/null 2>&1 && echo -n 'Clamd stopped'
	;;
*)
	echo "Usage: $0 { start | stop }"
	;;
esac
exit 0

Ajoutons ce script aux runlevels

chmod 777 /etc/init.d/clamd
update-rc.d clamd defaults

Il ne nous reste plus qu'à faire la première mise à jours des signatures

#freshclam -v

Une fois le téléchargement terminé , l'on peu démarrer le démon

/etc/init.d/clamd start

Mais .. la suite

Ne reste plus qu'à créer un serveur mandataire transparent , pour filtrer les flux FTP .. je travail actuellement sur FROX .. la suite bientot .

01 fév. 2010

couchDB par la pratique

C'est quoi couchDB

couchDB.png

CouchDB est un serveur de base de données orienté Document et accessible via une API REST HTTP/JSON.
Sans schéma, sans tables, ce qui offre une flexibilité sans limite de vos documents.

Comment , simplement car couchDB est une base qui n'est pas relationnel , il n'y a donc pas de structure qui fige les documents .

Comment l'utiliser

CouchDB utilise le protocole HTTP , avec des entêtes en GET , PUT , POST , DELETE , COPY.

Avec une possibilité d'activer l'authentification HTTP pour restreindre les accès selon vos souhaits
Pour vous simplifier la vie , j'ai développé une librairie qui réuni les méthodes indispensables pour utiliser une base couchDB , cette librairie vous permettra les action suivantes :

 * Création / suppression de bases
 * insertions de documents
 * suppressions .. 
 * copie
 * déplacements
 * réplication 
 * lecture
 * etc ..


Pour la documentation complète , voir le wiki .

oscar_couchDB

Nous allons quand même ici expliquer l'utilisation basic d'une base couchDB avec cette librairie

initialisation

Comme le précise la doc , il nous suffit d'inclure simplement la lib :

require_once 'Oscar_couchDB.php';

Nous allons ensuite récupérer une instance de la classe :

$Ocdb   =   Oscar_couchDB::getInstance();

Commençons par configurer l'accès au serveur principal , qui a comme adresse ip 10.0.0.220:

$Ocdb->set_host('10.0.0.220');
$Ocdb->set_port(5999);

Nous voilà fin prêt à attaquer ....

Commençons par créer notre table

if( ! $Ocdb->add("mabase") ){
   echo "Échec à la création de la base de données";
}

Une fois notre base crée , nous allons pouvoir la remplir avec des documents , pour créer un document , il faut de nouveau faire appel à la méthode add().

$doc = array("NOM"=>"Document A","TYPE"=>"texte");
 
$retour = $Ocdb->add("mabase","0001",$doc);
if(  $retour == false ){
    echo "Erreur à la création du document , erreur : $retour";
}else{
    echo "Document crée avec succès , <br>ID: ".$retour['id']."<br>REVISION: ".$retour['rev'].";
}

Comme vous l'aurez remarqué un document possède à sa création une révision , cela permet par exemple lors d'une modification non volontaire , de revenir en arrière .
Cependant , cela reste limité en temps , car si l'on compacte la base , seule la dernière révision est disponible .

Pour connaitre les révisions d'un document , vous pouvez faire appel à cette méthode :

$Ocdb->all_revs("mabase", "0001");

0001 étant l'id du document qui se doit d'être unique .

Et pour compacter la base pour un gain de place :

$Ocdb->compact_database('mabase');

Maintenant , comment récupérer notre enregistrement ?
Nous allons simplement utiliser la méthode get()

$mondocument = $Ocdb->get("mabase","0001");

Vous voilà avec un tableau $mondocument qui contient toutes les données que vous y avez entrées ainsi que son id et sa révision .

Pour lire une révision spécifique , il est possible de préciser celle-ci comme-ceci :

$mondocument = $Ocdb->get("mabase","0001",$revision);

Dans l'ordre des choses , nous allons supprimer ce document , voici la méthode :

$database = 'mabase';
$iddocument = '0001';
$revdoc = '1-872c3e4693b3e608148fb85b3f64df74';

$Ocdb->delete($database, $iddocument, $revdoc);

Ici la révision du document est obligatoire .



Voilà pour ces quelques exemples , il y a encore de nombreuses autres méthodes aussi simples les unes que les autres à utiliser , je vous laisse les découvrir via la documentation ici

replication

Il y a un point important , car c'est un avantage non négligeable de couchDB , la replication , qui est d'une simplicité étonnante .

Dans la librairie , il y a donc une méthode qui vous permet de répliquer vos données , de façon manuelle , mais aussi automatique , voici sa mise en place .

Commençons par paramétrer les coordonées des serveur A et B

$Ocdb->set_replication('10.0.0.220','10.0.0.221','5984','mabase','mabase_Repli');

Nous avons donc ici spécifié l'adresse du serveur source , suivi de celle du serveur cible , le port du serveur cible , la base de données source , et pour finir la base de données cible , qui n'est pas obligatoirement du même nom.

De plus si les base source/cible n'héxiste(s) pas , la librairie tentera de la/les créer .
Le réplication paramétrée , activons l'automatisme pour être certains que chaque action faite sur le serveur source soit immédiatement faite sur le serveur cible.

$Ocdb->auto_replique(TRUE);

Et voilà , plutôt simple non ?

Si le serveur cible n'est pas disponible , ce n'est pas grave , la réplication se faisant sur les logs binaire , il rattrapera automatiquement son retard lorsqu'il sera de nouveau disponible .
De plus , si le serveur source , tombe , vous pouvez attaquer directement sa réplication , en changeant les paramètres via set_replication , et lorsque le serveur sera de nouveau disponible , il se mettra automatiquement à jour , toujours grâce au logs binaires .

utile

Nous avons vue ici l'utilisation de quelques méthodes de la librairie Oscar_couchDB , mais il faut savoir que vous pouvez creer des vues en javascript qui vous permettent de faire des requêtes , filtres ect sur les documents en base , je vous donne un lien complet pour apprivoiser celà .
unixGarden

La librairie est disponible à plusieurs endroits :

 *  phpClasses
 *  dans les libs de mon fw fw-oscar.fr

- page 1 de 2