Info16.fr

Le blog de B@rtounet

Gnu/Linux

#Gnu/Linux

Expérimentation de NBD (Network Block device), ou comment exporter un périphérique type bloc par le réseau

Il y a quelque temps, j'ai fait un petit article sur le protocole isci et l'export de périphérique bloc via ce protocole... J'ai toutefois découvert il y a peu de temps une facon encore plus simple d'exporter un Block device par le réseau : NBD ou network block device

Je vous laisse installer le nbd-server et le nbd-client sur votre distribution préférée... Pour ma part j'ai fait les tests sur une OpenSuse 11 pour le serveur et une Ubuntu Hardy pour le client... Que se soit avec yast ou a coup d'apt-get vous installerez facilement les paquets nbd.

Bref...

Si vous avez lu mon blog en entier, vous savez comment mettre en place LVM2, dont je me suis servi pour faire mes test, c'est tellement pratique de disposer d'un périphérique block avec une simple commande...

Sur le Serveur: Commencons par créer un block device avec LVM2

xenserver:~ # lvcreate -L1G -ndisk vg0 Logical volume "disk" created

Exportons le directement via nbd

xenserver:~ # nbd-server 3000 /dev/vg0/disk

La commande est simple, on demande à nbd-server d'exporter le block-device /dev/vg0/disk via le port 3000

Nous pouvons vérifier que nbd-server écoute bien sur le port 3000 et n'attend plus que la connexion de son client

xenserver:~ # netstat -anp | grep 3000 tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 16358/nbd-server

Passons maintenant au client: Sur Ubuntu j'ai dut installer lvm2, (noter que lvm2 n'est pas du tout indispensable, c'est juste que je le trouve très souple à utiliser pour mes tests, mais rien ne vous empêche de créer des periphérique via losetup et les periphérique /dev/loop) Il a fallut bien sur installer nbd-client et dans la foulée j'ai installé mdadm pour gerer le raid...

Bref, commencons par se connecter au serveur et importons notre block device...

root@bartounet:/media# nbd-client 192.168.1.115 3000 /dev/nbd2 Negotiation: ..size = 1048576KB bs=1024, sz=1048576

Ici on se connecte sur le port 3000 du serveur et on importe le nbd en local sur /deb/nbd2

Voila le tour est joué notre device /dev/nbd2 est vu comme un simple device local de notre systeme, mais est en réalité exporté par le réseau...

Comme j'aime faire quelques petits tests, nous allons pas nous arreter là, je vais tester la vitesse de ce block-device.

Pour cela rien de plus simple, un petit dd va nous permettre de voir la vitesse...

root@bartounet:/media# dd if=/dev/nbd2 of=/dev/zero bs=1M 1024+0 records in 1024+0 records out 1073741824 bytes (1,1 GB) copied, 13,3121 s, 80,7 MB/s

C'est pas mal, je sature presque mon lien réseau, puisque mes deux postes sont réliés via un réseau gigabits donc en théorie pouvant atteindre les 120Mo/s Ceci est un test en lecture sur /dev/nbd2

Pour nous en convaincre un petit iperf entre les deux machines:

root@bartounet:/media# iperf -cxenserver ------------------------------------------------------------ Client connecting to xenserver, TCP port 5001 TCP window size: 16.0 KByte (default) ------------------------------------------------------------ [ 3] local 192.168.1.100 port 35157 connected with 192.168.1.115 port 5001 [ 3] 0.0-10.0 sec 1.09 GBytes 936 Mbits/sec

En effet on a bien un lien gigabit entre les deux.. ;-)

Pour être transparent je souhaite donner les performances disques disponibles pour les deux machines:

Les configs:

Xenserver: AMD Athlon 64 X2 5000+ Black edition à 2600Mhz 2Go DDR2 2 disques sata WDC WD1600YS (raid edition 160Go) en RAID0 logiciel

xenserver:~ # dd if=/dev/md0 of=/dev/zero bs=2M 1260388352 bytes (1.3 GB) copied, 10.4169 s, 121 MB/s

Bartounet: Intel Quad Core Q6600 G0 à 2400Mhz 2Go DDR2 2 disques sata Hitachi T7K500 250Go Raid0 matériel (puce raid Asus P5WDh deluxe)

root@bartounet:/media# dd if=/dev/sda of=/dev/zero bs=2M 616562688 bytes (617 MB) copied, 4,90903 s, 126 MB/s

Pour finir je me suis dit mais pourquoi pas faire un raid entre un block-device local sur BARTOUNET et un block-device nbd.

Pour cela je crée un block-device local sur bartounet toujours à l'aide de lvm2

root@bartounet:/media# lvcreate -L1G -nraid vgxen Logical volume "raid" created

Maintenant nous pouvons creer le périphérique raid avec mdadm

root@bartounet:/media# modprobe raid0 root@bartounet:/media# mdadm --create /dev/md1 --level=0 --raid-device=2 /dev/vgxen/raid /dev/nbd2 mdadm: array /dev/md1 started.

Notre raid est bien monté

root@bartounet:/media# mdadm --detail /dev/md1 /dev/md1: Version : 00.90.03 Creation Time : Sun Jun 22 19:36:35 2008 Raid Level : raid0 Array Size : 2097024 (2048.22 MiB 2147.35 MB) Raid Devices : 2 Total Devices : 2 Preferred Minor : 1 Persistence : Superblock is persistent Update Time : Sun Jun 22 19:36:35 2008 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Chunk Size : 64K UUID : 6b2edcd4:b994fefd:20bc8809:0761db64 (local to host bartounet) Events : 0.1 Number Major Minor RaidDevice State 0 254 1 0 active sync /dev/vgxen/raid 1 43 2 1 active sync /dev/nbd2

testons tout de suite la vitesse en lecture sur ce raid0 qui je vous rappelle est un raid0 entre un periphérique local /dev/vgxen/raid et un network block device /dev/nbd2 (exporté de Xenserver)

root@bartounet:/media# dd if=/dev/md1 of=/dev/zero 4194048+0 records in 4194048+0 records out 2147352576 bytes (2,1 GB) copied, 12,8236 s, 167 MB/s

Et voila on obtient un périphérique exploitant la vitesse des deux block device ( un local et un réseau) Marrant non ?

Bon la je me suis attaché aux performances mais rien ne vous empeche de faire du mode sécurisé en raid1 ou plus...

27 juillet 2011 Aucun commentaire

#Gnu/Linux

Mise en place du protocole iscsi (Target Linux/OpenSuse-10.3, Initiator Windows XP Sp2)

Sous le vocable iSCSI (à prononcer i-skeuzi, i-skozi, aïe-skeuzi ou aïe-skozi selon que vous adoptez une prononciation française ou anglophone), se cache un protocole réseau qui encapsule le protocole SCSI dans des paquets TCP. TCP/IP est alors utilisé comme protocole de transport ce qui permet à une machine d’accéder à des périphériques distants connectés à l’infrastructure réseau existante. Le protocole iSCSI (voir RFCA) utilise l’architecture client/serveur, mais possède sa propre terminologie : le client est appelé « initiator » le serveur est appelé « target » Je vais essayer dans ce billet de monter une petite Archi entre une Target Linux et un initiator Windows Xp L’initiator peut être une carte Ethernet spécialisée, munie d’un composant supplémentaire qui va gérer le protocole iSCSI. Cette carte sera appelée un « iSCSI-HBA ». Mais, on peut aussi déployer une solution logicielle pure qui nécessite seulement un driver spécifique dont le rôle sera de traduire les ordres SCSI en paquets réseau. C’est cette solution que nous allons mettre en œuvre dans cet article. La target (cible) est normalement un périphérique de stockage doté d’une interface iSCSI. Qu’est-ce-qu’une interface iSCSI ? Eh bien en fait, les constructeurs proposent, outre la connectivité Fibre Channel, un ou plusieurs ports Ethernet avec support au niveau de l’OS et éventuellement des cartes réseau, du protocole iSCSI. Mais pour ceux qui ne disposent pas d’un tel matériel, nous verrons comme émuler une target avec Linux ! Initiator et target sont considérés comme les nœuds d’un réseau iSCSI. Le driver iSCSI transporte les commandes SCSI sur le réseau plutôt que d’utiliser un bus SCSI directement connecté ou bien une connexion en FC. ISCSI Mon protocole de test: Serveur 1: La target iscsi (opensuse 10.3) AMD Athlon(tm) 64 X2 Dual Core Processor 5000+ Black Edition (2600Mhz) 2Go ddr2 Crucial Balistic (4-4-4-12) Carte Mère Asus M3A 1 HDD SAMSUNG HD160JJ pour le systeme 2 HDD Western digital WDC WD1600YS (raid edition) en Raid 0 ----> pour stockage LVM Lan intégré à la carte Mère chipset Atlansic Gigabit Serveur 2: L'initiator Intel Q6600 Quad Core (2400Mhz) 2Go ddr2 Crucial Balistic Carte mère P5WDH Deluxe 2 HDD hitachi 7200Tpm 250Go T7K500 en Raid0 matériel Lan Marvell Yukon 88E8053 PCI-E Gigabit Ethernet Controller Bref, c'etait juste pour être précis sur le protocole de test.... Lorsque l’initiator souhaite établir une session TCP avec la target, il a besoin de connaître le port TCP de la target. L’association (adresse IP, port TCP) est appelé un « portal ». Il y a donc un portal sur l’initiator et la target. Le port par défaut sur la target est le 3260. Notons qu’un initiator peut établir plusieurs connexions TCP avec la même cible. L’ensemble de ces connexions définit une « session iSCSI ». Pour l'installation j'ai été cherché les sources de l'application iscsi-target qui au moment ou j'écris ces lignes est en version 0.4.16 [http://sourceforge.net/project/showfiles.php?group_id=108475&package_id=117141&release_id=585138|http://sourceforge.net/project/showfiles.php?group_id=108475&package_id=117141&release_id=585138|fr] Après avoir téléchargé iscsi target on l'extrait
xenserver:~ # tar xvfz iscsitarget-0.4.16 xenserver:~ # cd iscsitarget-0.4.16/
Il va maintenant falloir compiler et installer le logiciel... Il y a tout de même des prérequis: La target doit avoir un kernel linux au minimum 2.6.16 On doit disposer d'un compilateur gcc, des entetes de notre noyeau et des fichiers d’en-têtes de la bibliothèque OpenSSL. Après ces petites verification on compile et on installe:
xenserver:~/iscsitarget-0.4.16 # make xenserver:~/iscsitarget-0.4.16 # make install
On a donc maintenant: # iscsi_trgt.ko : un module noyau qui émule une cible iSCSI et implémente le protocole ; # un démon ietd (IET = iSCSI Enterprise Target) ; # une commande de contrôle ietadm ; # quelques fichiers de configuration On peut tout de suite crée une target iscsi... Pour cela rien de plus simple: Il faut savoir que les adresses iscsi peut vent avoir 2 formes: Les adresses iSCSI peuvent avoir deux formats (voir [RFCB]) : * Le format iqn (iSCSI Qualified Name) : c’est une chaîne préfixée par « iqn. » et suivie d’une date (au format AAAA-MM), du nom de l’autorité qui a attribué le nom (c’est le nom de domaine à l’envers), puis une chaîne unique qui identifie le nœud. Par exemple : iqn.2007-07.org.zereso:serveur1:123456789ABCDEF.12345. * Le format eui (Enterprise Unique Identifier) : c’est une chaîne préfixée par « eui. » et suivie de 16 chiffres hexadécimaux. Par exemple : eui.00803A4B887A8D05. On va donc aller éditer le fichier ietd.conf
xenserver:~/iscsitarget-0.4.16 # vi /etc/ietd.conf
# iqn.yyyy-mm.[:identifier] # # "yyyy-mm" is the date at which the domain is valid and the identifier # is freely selectable. For further details please check the iSCSI spec. Target iqn.2008-04.lan.appart:storage.disk # Users, who can access this target. The same rules as for discovery # users apply here. # Leave them alone if you don't want to use authentication. #IncomingUser joe secret #OutgoingUser jim 12charpasswd # Logical Unit definition # You must define one logical unit at least. # Block devices, regular files, LVM, and RAID can be offered # to the initiators as a block device. Lun 0 Path=/dev/vg0/luniscsi,Type=blockio # Alias name for this target # Alias Test # various iSCSI parameters # (not all are used right now, see also iSCSI spec for details) #MaxConnections 1 #InitialR2T Yes #ImmediateData No #MaxRecvDataSegmentLength 8192 #MaxXmitDataSegmentLength 8192 #MaxBurstLength 262144 #FirstBurstLength 65536 #DefaultTime2Wait 2 #DefaultTime2Retain 20 #MaxOutstandingR2T 8 #DataPDUInOrder Yes #DataSequenceInOrder Yes #ErrorRecoveryLevel 0 #HeaderDigest CRC32C,None #DataDigest CRC32C,None # various target parameters #Wthreads 8
Le fichier parle de lui même j'ai déclaré une cible qui est Target iqn.2008-04.lan.appart:storage.disk et un périhpérique cible en mode bloc appelé une LUN qui est /dev/vg0/luniscsi,Type=blockio Avant de démarrer le demon iscsi-target, je vais quand même créer mon disque puisqu'il n'existe pas encore ;-) Pour cela j'utilise l'excellent systèmes LVM2 Le système de LVM insère des sous-couches entre la partition de disque et votre système de fichier (là où sont vos données). Ces sous-couches vont vous permettre de modifier dynamiquement la taille des systèmes de fichier, sans mettre en péril vos données. Ainsi vous pourrez ajouter, enlever de l'espace disque d'un filesystem à la volée, rajouter un système de fichier... sans modification de la table des partitions. crééons notre disque:
xenserver:~/iscsitarget-0.4.16 # lvcreate -L5G -nluniscsi vg0 Logical volume "luniscsi" created
(il faut bien sur avoir préalabement configurer son système disque pour fonctionner avec le systeme lvm2 et creee les volume groups) J'ai donc un volume logique de 5G qui n'est autre que ma LUN qui va pouvoir être exportée sur le réseau vers l'initiator. démarrons alors le demon target iscsi
xenserver:~/iscsitarget-0.4.16 # /etc/init.d/iscsi-target start
à partir de là on va pouvoir aller s'occuper de l'initiator... Mais comme on est sérieux on va aller quand même vérifier que nos cilbe sont biens exportées pour cela on va directement regarder dans:
xenserver:~/iscsitarget-0.4.16 # cat /proc/net/iet/volume tid:1 name:iqn.2008-04.lan.appart:storage.disk lun:0 state:0 iotype:blockio iomode:wt path:/dev/vg0/luniscsi
Ouf on retrouve bien notre target associé à notre lun... Maintenant passons sous Windows... Je mettrais à jour plus tard ce post, pour monter aussi l'initiator sous Gnu/Linux, mais ce n'est pour l'instant pas ma priorité, puisque pour ma part j'utilise que des clients Windows, qui se connectent sur du serveur Gnu/Linux... Sous Windows Xp Sp2 l'initiator isci n'est pas installé par défaut, j'ai installé pour ma part Initiator-2.06 [http://www.microsoft.com/Downloads/details.aspx?familyid=12CB3C1A-15D6-4585-B385-BEFD1319F825&displaylang=en|http://www.microsoft.com/Downloads/details.aspx?familyid=12CB3C1A-15D6-4585-B385-BEFD1319F825&displaylang=en|fr] Uns fois installé on lance l'initiateur iscsi. On ajoute l'ip de notre target iscsi1 iscsi2 On va voir dans le gestionnaire des disques Et miracle notre lun est apparu comme un disque à part entière iscsi3 Après une creation de partition et un formatage en ntfs iscsi4 Notre LUN iscsi est bien monté sur notre initiator... On peut maintenant l'utiliser comme les autres disques... Pour finir mon test, j'ai voulu quand même vérifier le débit de cette lun. Comme nous l'avons vu plus haut, la lun est basé sur un logical volume crée sur mon raid0 (raid0 logiciel Linux) de deux disques Western Digital WD1600YS Pour savoir quelles sont les performances de départ, voici un petit dd sur le raid en question
xenserver:~ # dd if=/dev/md0 of=/dev/zero bs=16M 125+0 records in 124+0 records out 2080374784 bytes (2.1 GB) copied, 19.9423 s, 104 MB/s
C'est un raid0 sur deux disques qui vont chacun à 63Mo/s en vitesse séquentielle... Cela dépend des tests, en raid0 la vitesse varie entre 100 et 126Mo/s Faisons le test de vitesse sur la lun sous Windows... speed On peut voir qu'on monte à environ 60Mo/s sur la Lun, ce qui n'est pas mal mais qui pourrait etre mieux... En effet le lien réseau entre les deux n'est pas limité... La preuve avec iperf entre l'initiator et la target
C:\>iperf.exe -w512k -c192.168.1.115 ------------------------------------------------------------ Client connecting to 192.168.1.115, TCP port 5001 TCP window size: 512 KByte ------------------------------------------------------------ [1916] local 192.168.1.100 port 2500 connected with 192.168.1.115 port 5001 [ ID] Interval Transfer Bandwidth [1916] 0.0-10.3 sec 1.10 GBytes 922 Mbits/sec
On pourrait tunner notre pile tcp/ip pour atteindre de bien meilleurs résultats, notemment en activant les jumbo Frames (Paquets géants) mais la carte nic intégré à l'asus M3A ne semble pas le supporter... Elle ne supporte pas non plus le TCP Checksum offloader (toe)... les réglages sont donc assez restreints....
27 juillet 2011 Aucun commentaire

#Gnu/Linux

Petit exemple de création de tunnel SSH

Quand on surf en dehors de chez soi, dans un cyber café, ou à partir d'un réseau qu'on ne controle pas, on en oublie aussi souvent la sécurité. Ce post me sert d'aide mémoire pour creer des tunnels SSH en local et en remote afin de pouvoir acceder de facon sécurisé à des services qui ne le sont pas forcément (smtp, pop, imap, ftp, http)...

Si on se met en situation, imaginez vous avez votre pc portable, vous etes sur une connexion que vous ne controlez pas (hotels, cyber café) vous voulez relevez vos mails en imap ou en pop. L'utilisateur lambda se connecterai à son serveur de messagerie directement sans se soucier de la sécurité. Le probleme est que dans un tel réseau vous n'etes jamais sur que quelqun ne "sniff" pas les connexions, il est très facile de sniffer tout ce qui passe sur son réseau pour un admin réseau ou même un petit bricolo... il faut donc savoir que

lorsque vous utilisez des protocoles non sécurisés, vos login et mots de passe circulent en clair sur le réseau... Ce n'est pas très grave quand vous surfez sur le web mais ca l'ai plus si vous rapatriez vos mails, si vous transferer des fichiers sur des ftp etc...

Bref tout cela pour dire que quand les connexions sont assez sensibles, mieux vaut ajouter un peu de sécurité... C'est pourquoi mon but va être de faire passer ces connexions non sécure dans un tunnel sécurisé... pour cela SSH est assez performant...

prenons un exemple simple

La manipulation est simple il faut creer un tunnel ssh entre votre poste client et votre serveur... pour cela vous devez bien sur avoir la main sur votre serveur externe et avoir le serveur SSH lancé et configuré. imaginons que je veuille acceder à mon webmail qui est hebergé sur mon serveur dédié, mais que je ne veux absolument pas qu'on puisse intercepter mes identifiants... sur mon poste client qui est bien sur sous Gnu/Linux je tappe

root@ubuntu:~# ssh -L 3333:localhost:80 info16.fr

Cela signifie qu'un tunnel SSH à été établie en moi et mon serveur info16.fr et que toutes les connexion qui auront lieux sur localhost:3333 de mon poste client sera redirigé PAR LE TUNNEL SSH sur le port 80 de info16.fr

on test:

root@ubuntu:~# ssh -L 3333:localhost:80 info16.fr root@info16.fr's password: Last login: Fri Mar 28 14:59:15 2008 from lmontsouris-152-61-27-191.w80-13.abo.wanadoo.fr Ubuntu 6.06.2 LTS Linux serveur.info16.fr 2.6.24.2-xxxx-std-ipv4-32 #4 SMP Wed Feb 13 16:50:04 CET 2008 i686 GNU/Linux server : 11178 ip : 91.121.31.206 hostname : serveur.info16.fr

sur le poste client il suffit alors de se connecter avec un navigateur sur son adresse de loopback et sur le port 3333 et on passe à travers le tunnel jusque sur le port 80 du serveur info16.fr On vérifie cela avec le fabuleux navigateur lynx

root@ubuntu:~# lynx http://localhost:3333

On obtient alors:

www.info16.fr www.info16.fr FTP Free FTP dedi Blog Webmail appart Webmail info16.fr Decelect%20158.jpg Contact:B@rtounet

On est bien sur le webmail de info16.fr a partir de localhost:3333 et ceci de manière totalement sécurisée

Maintenant je vais vous montrer un exemple encore plus interessant... Utiliser le tunnel SSH avec le mode remote.... Le tunnel sera toujours initié entre mon poste client et mon serveur dédié, mais cette fois l'écoute se fera sur le serveur....

Ceci peut etre très utile... imaginé que vous etes en train de developper un site web en local... sur votre poste... vous souhaitez que des personnes externes puisse y acceder de la toile, mais vous ne voulez pas ou ne pouvez pas ouvrir les ports 80 sur votre firewall et les rediriger sur l'ip de votre poste...

Qu'a cela ne tienne, le tunnel ssh est là pour ca...

je vais initier un tunnel entre mon poste client et mon serveur dédié en mode remote...

ATTENTION, j'ai cherché un moment avant que cette manip fonctionne... par défaut votre serveur dédié se mettra à l'écoute sur 127.0.0.1 ors si onveut que des personnes externes puisse se connecter dessus, il faut que le socket initié par le tunnel ssh sur le serveur dédié soit à l'écoute pour toutes les adresses c'est à dire soit à l'écoute sous 0.0.0.0

Après avoir longtemps parcouru le man de ssh j'ai enfin trouvé la solution. il faut rajouter une option dans le /etc/ssh/sshd_config

il faut donc rajouter

GatewayPorts yes

après cela le serveur écoutera bien sur toutes les adresses...

la commande magique:

root@ubuntu:~# ssh -R 3333:localhost:80 info16.fr

En langage peut etre plus clair... cette commande signifie je veux initier un tunnel ssh tel que quand on se connecte sur le port 3333 de info16.fr on soit automatiquement redirigé ver le port 80 de mon poste (localhost)

on peut vérifier que sur info16.fr l'ecoute se fait bien:

root@serveur:~# netstat -anp | grep 3333 tcp 0 0 0.0.0.0:3333 0.0.0.0:* LISTEN 16075/1

à partir de là n'importe quel personne externe (du moment qu'il n 'y ai pas de regle de pare feu qui bloque le port 3333 de info16.fr) peut se connecter sur http://info16.fr:3333 il sera automatiquement redirigé par le tunnel SSH sur le port 80 de votre poste client qui heberge votre site en construction...

on peut bien sur le faire pour tous les protocole...

Vous voulez que quelqun prenne la main en ssh sur votre poste gnu/linux mais vous ne voulez pas ouvrir de port sur votre pare feu...

la commande est la même...

ssh -R 3333:localhost:22 info16.fr

Je veux initier un tunnel ssh tel que quand on se connecte sur le port 3333 de info16.fr on soit automatiquement redirigé ver le port 22 de mon poste (localhost)

comme je dis pas de betise on test tout de suite si ca marche à partir d'un poste externe n'importe ou sur la toile...

xenserver:~ # ssh -p3333 info16.fr root@info16.fr's password: Last login: Fri Mar 28 16:45:32 2008 from localhost Linux ubuntu 2.6.22-14-generic #1 SMP Tue Feb 12 07:42:25 UTC 2008 i686 The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@ubuntu:~#

on voit bien ici qu'a partir d'un client externe en se connectant au port 3333 de info16.fr on est automatiquement redirigé vers le port 22 du client (ubuntu)

27 juillet 2011 1 commentaire

#Gnu/Linux

Compression sous Gnu/Linux en environnement multi-CPU

Si il y a bien quelque chose qui manque sous Linux, c'est le fait de pouvoir profiter d'un vrai outil de compression qui utilise au mieux les nouveaux environnements SMP actuels. Gzip est un excellent outil de compression, mais vous avez dut remarquer qu'il ne fonctionne que sur un CPU... c'est très embetant dans des environnements serveurs ou on a besoin de creer des fichiers compréssés assez rapidement...

En cherchant un petit peu je suis tombé sur l'outil mgzip. Ce projet semble dater un peu mais il à le mérite d'exister...

vous pouvez voir ce projet au http://lemley.net/mgzip.html

Les sources sont disponibles sur http://lemley.net/smp_mgzip_1.2c.tar.gz

Il suffit de le télécharger et de le décompresser dans le dossier de votre choix...

root@serveur:~# tar xvfz smp_mgzip_1.2c.tar.gz smp_mgzip_1.2c/ smp_mgzip_1.2c/README smp_mgzip_1.2c/COPYING smp_mgzip_1.2c/Makefile.in smp_mgzip_1.2c/config.h.in smp_mgzip_1.2c/configure.in smp_mgzip_1.2c/die.c smp_mgzip_1.2c/die.h smp_mgzip_1.2c/get_options.c smp_mgzip_1.2c/mgzip.h smp_mgzip_1.2c/queue.c smp_mgzip_1.2c/queue.h smp_mgzip_1.2c/version.awk smp_mgzip_1.2c/test_suite.sh smp_mgzip_1.2c/configure smp_mgzip_1.2c/Makefile.AIX smp_mgzip_1.2c/Makefile.ALPHA smp_mgzip_1.2c/Makefile.Linux smp_mgzip_1.2c/4g-patch.tar smp_mgzip_1.2c/concat.patch smp_mgzip_1.2c/ChangeLog smp_mgzip_1.2c/mgzip.c

Après cela il faut le compiler.

root@serveur:~/smp_mgzip_1.2c# ./configure --with-zlib=/root/zlib-1.2.3 && make loading cache ./config.cache checking how to run the C preprocessor... (cached) cc -E checking for AIX... no checking for gawk... (cached) gawk checking for gcc... (cached) gcc checking whether the C compiler (gcc ) works... yes checking whether the C compiler (gcc ) is a cross-compiler... no checking whether we are using GNU C... (cached) yes checking whether gcc accepts -g... (cached) yes checking whether make sets ${MAKE}... (cached) yes checking for library containing __pthread_create... (cached) no checking for library containing pthread_join... (cached) -lpthread checking for ANSI C header files... (cached) yes checking for unistd.h... (cached) yes checking for zlib.h... (cached) yes checking for gzdopen in -lz... (cached) yes checking whether byte ordering is bigendian... (cached) no checking for working const... (cached) yes checking for vprintf... (cached) yes checking for pthread_delay_np... (cached) no creating ./config.status creating Makefile creating config.h config.h is unchanged gcc -I/root/zlib-1.2.3 -g -O2 -I/root/zlib-1.2.3 -c -o mgzip.o mgzip.c mgzip.c:40: error: 'gz_header' redeclared as different kind of symbol /root/zlib-1.2.3/zlib.h:124: error: previous declaration of 'gz_header' was here mgzip.c: In function 'gzip_worker_thread': mgzip.c:219: warning: pointer targets in passing argument 2 of 'crc32' differ in signedness make: *** mgzip.o Error 1

On remarque tout de suite une erreur qui peut etre corrigé en modifiant le fichier mgzip.c

Editez ce fichier et modifier tous les gz_header de cette maniere : pouet_gz_header (rajout indicatif mettez ce que vous voulez) (faite une recherche de toutes les occurences de gz_header ca ira plus vite) ou encore mieux avec un sed pour remplacer l'occurence gz_header par pouet_gz_header

cat mgzip.c | sed 's/gz_header/pouet_gz_header/' > mgzip2.c && mv mgzip2.c mgzip.c

Une fois le fichier modifié ca devrait mieux compiler...

en effet:

root@serveur:~/smp_mgzip_1.2c# ./configure --with-zlib=/root/zlib-1.2.3 && make loading cache ./config.cache checking how to run the C preprocessor... cc -E checking for AIX... no checking for gawk... gawk checking for gcc... gcc checking whether the C compiler (gcc ) works... yes checking whether the C compiler (gcc ) is a cross-compiler... no checking whether we are using GNU C... yes checking whether gcc accepts -g... yes checking whether make sets ${MAKE}... yes checking for library containing __pthread_create... no checking for library containing pthread_join... -lpthread checking for ANSI C header files... yes checking for unistd.h... yes checking for zlib.h... yes checking for gzdopen in -lz... yes checking whether byte ordering is bigendian... no checking for working const... yes checking for vprintf... yes checking for pthread_delay_np... no updating cache ./config.cache creating ./config.status creating Makefile creating config.h gcc -I/root/zlib-1.2.3 -g -O2 -I/root/zlib-1.2.3 -c -o mgzip.o mgzip.c mgzip.c: In function 'gzip_worker_thread': mgzip.c:219: warning: pointer targets in passing argument 2 of 'crc32' differ in signedness gcc -I/root/zlib-1.2.3 -g -O2 -I/root/zlib-1.2.3 -c -o queue.o queue.c gcc -I/root/zlib-1.2.3 -g -O2 -I/root/zlib-1.2.3 -c -o die.o die.c gcc -I/root/zlib-1.2.3 -g -O2 -I/root/zlib-1.2.3 -c -o get_options.o get_options.c gcc -o mgzip mgzip.o queue.o die.o get_options.o -lz -lpthread -L/root/zlib-1.2.3

On obtient maintenant dans ce dossier le fameux programe mgzip, pour bien faire placer le dans /usr/sbin pour qu'il soit directmeent disponible

Comme j'aime bien finir les billet par un petit test on va quand même verifier l'efficacité de cette commande...

Pour cela ma machine de test sera compsé de: Athlon X2 5000+ Black edition à 2600MHZ 2Go de DDR2 800 Crucial en 44412 MSI K9N Platinum 2 Disk hitachi sata 2 Raid edition 160Go en Raid0 Logiciel

Mon protocle de test est assez simple... Je pars d'un disque de type LVM formaté en ext3 qui contient 2go de données. et je vais compréssé avec gzip et avec mgzip et calculé le temps necessaire à cette compréssion...

Voici le résultat

xenserver:~/testcpu # dd if=/dev/vg0/gziptest bs=16M | gzip -c --fast | dd of=/gziptest.gz bs=16M 128+0 records in 128+0 records out 2147483648 bytes (2.1 GB) copied, 33.7023 s, 63.7 MB/s 0+500 records in 0+500 records out 9401822 bytes (9.4 MB) copied, 33.6445 s, 279 kB/s xenserver:~/testcpu # dd if=/dev/vg0/gziptest bs=16M | mgzip -c -1 -t 64 | dd of=/gziptest.gz bs=16M 128+0 records in 128+0 records out 2147483648 bytes (2.1 GB) copied, 26.2779 s, 81.7 MB/s 0+794 records in 0+794 records out 10075503 bytes (10 MB) copied, 26.314 s, 383 kB/s

on remarque que le mgzip à été un peu plus rapide mais sans aller deux fois plus vite... ce qui théoriquement devrait être le cas... Je cherche encore un outils qui serait plus performant... mailez moi si vous en trouvez un

27 juillet 2011 Aucun commentaire

#Gnu/Linux

Mise en place de virtualHosts sous opensuse 10.3

Quand on installe apache2 de base, on peut bien sur heberger son site à la racine de l'arborescence, mais on est très vite bloqué si on veut creer plusieurs sites avec plusieurs sous domaines...

Ce billet me sert juste d'aide mémoire pour mettre en place les virtualshosts sous suse. Ayant l'habitude de monter des sites sous Ubuntu / Debian la configuration sous suse est légèrement différente.

Pour la mise en place de virtualhosts sous Ubuntu, je vous renvoie vers l'excellent documentation du forum ubuntu-fr http://doc.ubuntu-fr.org/tutoriel/virtualhosts_avec_apache2 Le principe est assez simple grace aux modules sites-available

Après avoir longtemps évolué sous ubuntu/debian quand on passe sous suse on est un peu perdu...

En effet ne cherchez pas l'arborescence du site dans /var/www, elle n'y est pas... dans cette distribution tout se trouve sous /srv/www/htdocs

Je pars du principe que je souhaite 3 hotes virtuels... le tout sur une ip locale 192.168.1.250 1- La racine de mon site qui sera www.appart.lan 2- L'accès à mon webmail qui sera webmail.appart.lan 3- L'accès à un site de test en developpement test1.appart.lan

tout d'abord verifier que les virtual hosts seront biens pris en compte dans /etc/apache2/httpd.conf

### Virtual server configuration ############################################ # # VirtualHost: If you want to maintain multiple domains/hostnames on your # machine you can setup VirtualHost containers for them. Most configurations # use only name-based virtual hosts so the server doesn't need to worry about # IP addresses. This is indicated by the asterisks in the directives below. # # Please see the documentation at # <URL:http://httpd.apache.org/docs-2.2/vhosts/> # for further details before you try to setup virtual hosts. # # You may use the command line option '-S' to verify your virtual host # configuration. # Include /etc/apache2/vhosts.d/*.conf # Note: instead of adding your own configuration here, consider # adding it in your own file (/etc/apache2/httpd.conf.local) # putting its name into APACHE_CONF_INCLUDE_FILES in # /etc/sysconfig/apache2 -- this will make system updates # easier :)

ensuite préciser sur quelle socket (adresse_ip:port) le serveur écoutera dans /etc/apache2/listen.conf definir la derniere ligne comme suit

NameVirtualHost 192.168.1.250:80

Pour finir nous allons définir un dossier de configuration pour tous nos virtualshosts dans /etc/apache2/vhosts.d En effet là ou sous debian on aurait fait un fichier de conf pour chaque virtual hosts, ici sous suse je n'ai réussi à le faire fonctionner qu'en utilisant un seul et unique fichier... C'est peut etre pas plus mal...

j'ai donc créee un fichier mesvirthosts.conf

à l'intérieur tout est explicite:

# ---> Site principal <VirtualHost 192.168.1.250:80> ServerName appart.lan ServerAlias bartounet.no-ip.org DocumentRoot /srv/www/htdocs </VirtualHost> # # ---> Site du sous-domaine "Webmail" <VirtualHost 192.168.1.250:80> ServerName webmail.appart.lan ServerAlias webmail.bartounet.no-ip.org DocumentRoot /srv/www/htdocs/squirrelmail </VirtualHost> # # ---> Site du sous-domaine "test1" <VirtualHost 192.168.1.250:80> ServerName test1.appart.lan ServerAlias test1.bartounet.no-ip.org DocumentRoot /srv/www/htdocs/test1 </VirtualHost>

on définit d'abord sous quel socket sera disponible le virtual host ensuite sous quel domaine local il ser aaccessible, son alias publique et bien sur le chemin dans lequel sera stocké le site en question

bien terminer la configuration par

rcapache2 restart

Vous l'avez compris la racine de mon site sera accessible en passant par www.appart.lan qui pointe vers /srv/www/htdocs mon webmail par webmail.appart.lan qui pointe vers /srv/www/htdocs/squirrelmail mon site test1 par test1.appart.lan /srv/www/htdocs/test1

27 juillet 2011 Aucun commentaire