dimanche, octobre 10, 2010

FreeBSD developer summit 2010, Karlsruhe


Je viens de terminer mon premier FreeBSD developer summit que j'ai vraiment adoré.
La dernière conférence BSD à laquelle j'ai participé était la BSDCan 2007 et je n'avais pas participé au dev summit (d'ailleurs je ne savais même pas que ca existait à cette époque).
Mais qu'est ce qu'un dev summit exactement ?
Il s'agit d'une rencontre se déroulant sur 2 jours juste avant l'EuroBSDCon qui permet de rencontrer physiquement la majorité des personnes qui contribuent au projet FreeBSD (seul les contributeurs et quelques invités y participent).
Chacune des 2 journées du dev summit se décomposent en 3 parties:

  • Le matin, dans le grand amphi: Les personnes présentent l'état de leurs travaux (environ 10 minutes de présentation et 5 minutes de questions).
  • L'après midi a lieu différents ateliers sur des thèmes spécifiques.
  • Le soir: Le resto on l'on essaye de discuter d'autre chose que de «geekerie» (mais c'est très très dur vus le profil de la population présente ).

Le nombre de personne qui viennent de loin pour ces quelques jours (US et Japon en particulier) est impressionnant. On y rencontre bien sur pas mal de personne travaillant pour iXsystems (Warner Losh, Dru Lavigne, Kris Moore, Alexander Motin).

Voici quelques sujets abordés le matin:

  • ringmap : Une autre approche différente de «zero_copy» permettant d'éviter toute recopie interne d'un paquet lors de son traitement. Cette techno à été mise au point pour la capture de paquet à haut débit, mais elle va être très intéressante concernant les améliorations de performance de routage.
  • VPS: C'était LA présentation que j'attendais. Voir des VPS FreeBSD changer de serveur hôte sans impact sur les clients c'est très beaux, tellement que ca fait presque pleurer. Et surout on va pouvoir bientôt leur en foutre pleins sur la gueule à virtuozzo!!!
  • Amélioration de NanoBSD: Synthèse des différents problèmes que j'ai rencontré avec nanoBSD et les solutions proposées
  • FreeNAS: Warner Losh a présenté l'état actuel de la récupération du projet par iXsystems.
  • FreeBSD Virtualbox Image for Port Mainteners, basée sur FreeBSD -current elle inclue une tinder box pré-configurée pour pour valider ses ports FreeBSD (7,8,-current)… Il va falloir que je test ce truc.
  • La documentation: Comment simplifier la contribution à la doc ?
  • PC-BSD: Les utilisateurs de PC-BSD, par leurs usages différents remontent pas mal de bug non détecté par les admins systèmes de FreeBSD. Comment améliorer la synergie entre PC-BSD et FreeBSD ?
  • Et pleins d'autres sujets: la gestion des ports, des trucs concernant le noyau dont je ne comprends rien, etc… La liste est sur le wiki.


Au sujet les ateliers de l'après-midi, par exemple celui sur FreeNAS, on profite de la présence dans la même pièce de plusieurs personnes clés:

  • Warner Losh, qui récupère la responsabilité du projet chez iXsystems
  • Martin Matuska qui contribue à l'import ZFS dans FreeBSD
  • Alexander Motin qui développe entre autre le système CAM ATA… entre autre

Pour discuter «performance, tunning» et autre. Bref le résultat est «vivement FreeNAS 8 car le support du ZFS dans FreeBSD 7 n'est pas terrible du tout» (que soit au niveau des perfs et même de la stabilité).

J'ai aussi profité de la présence de Kris Moore (PC-BSD) pour qu'il me montre sa version de travail du futur PC-BSD (qui supportera plusieurs gestionnaires de bureau comme Gnome et LXDE4 et ne reste plus limité à KDE). Il lui reste à finir l'homogénéisation des différents thèmes et menu. Cela à l'air vraiment prometteur (résultats dans 1 ou 2 mois).

Conclusion: Je vais essayer de me refaire inviter pour celui de l'année prochaine. Car même pour un petit contributeur le dev summit permet d'échanger énormément en seulement 2 jours !
Le seul problème est que les journées se terminent tard (1h du matin), ce qui ne m'a pas laissé le temps d'aller visiter Karlsruhe :-(

vendredi, août 27, 2010

Mise à jour du firmware OBP d'une Sun Blade 100/150 par le réseau

La procédure officielle de mise à jour du firmware OBP nécessite d'installer le firmware (119235-01.zip) sur la partition / du Solaris, puis de lancer la mise à jour en démarrant sur le fichier de firmware.
Oui mais si l'OS installé sur la Sun Blade n'est pas un Solaris, comment je fait ?
Il est heureusement possible de faire cette mise à jour à travers le réseaux en utilisant:
  1. Un serveur rarp qui va donner une IP à la station Sun Blade
  2. Un serveur tftp sur lequel la Sun Blade ira chercher sa mise à jour
Voici comment le faire à partir d'une station FreeBSD…

On commence par noter l'addresse MAC de la Sun Blade, c'est facile, elle est affichée au démarrage:

Sun Blade 150 (UltraSPARC-IIe 650MHz), No Keyboard
Copyright 1998-2003 Sun Microsystems, Inc.  All rights reserved.
OpenBoot 4.10.6, 1024 MB memory installed, Serial #57463918.
Ethernet address 0:3:ba:6c:d4:6e, Host ID: 836cd46e.

On va commencer par configurer notre serveur rarp pour qu'il donne une IP dans la même plage que votre interface Ethernet, exemple avec 192.168.100.49:

echo "0:3:ba:6c:d4:6e 192.168.100.49" > /etc/ethers

Puis on lance le serveur rarpd en précisant l'interface d'écoute, exemple avec bge0:

rarpd bge0

Reste à décompresser l'archive du firmware et mettre le fichier «flash-update-Blade100-Blade150-latest» dans le dossier /tftpboot.
Mais là, il y a une astuce:
Comment la sun blade, à son démarrage, va connaitre le nom du fichier à aller chercher ?
Suite à sa requêtte RARP, elle n'obtiendra qu'une seule information: Son addrresse IP.
Et c'est là qu'est l'astuce: La station va convertir son adresse IP en hexa, et aller chercher un fichier ayant comme nom cette valeur hexa.
Donc, dans mon exemple, j'ai choisi de donner l'IP 192.168.100.49, le nom du fichier que la station ira chercher sera donc:

echo 192.168.100.49 | awk -F . '{ printf "%02X%02X%02X%02X\n", $1, $2, $3, $4 }'

C0A86431

On créer une copie de flash-update-Blade100-Blade150-latest ayant ce nom:
cd /tftpboot
ln flash-update-Blade100-Blade150-latest C0A86431

Ne reste plus qu'a lancer le serveur tftpd en éditant le /etc/inetd.conf et en décommentant la ligne commencant par «tftp    dgram   udp ...»
Une fois modifié, on lance inetd:
/etc/rc.d/inetd onestart

C'est normallement terminé pour le serveur RARP/TFTP, mais on peux lancer un tcpdump pour suivre l'échange:

tcpdump -i bge0

Avant d'allumer la Sun Blade, on l'ouvre pour vérifier que les jumpers de la flash sont bien en position «écriture» (cf le fichier flashprom-jumper-diagram.ps inclus dans l'archive pour plus d'info).

Une fois le jumper en bonne position (vous pouvez le laisser définitivement comme ça), on démarre la Sun Blade, un petit break pour se retrouver dans l'OBP, et il suffit de lui demander de booter par le réseau:

boot net

Coté serveur RARP/TFTP, votre écran tcpdump devrais s'activer (c'est bon signe):

02:23:07.113609 ARP, Reverse Request who-is 192.168.100.49 tell 192.168.100.49, length 50
02:23:07.113962 ARP, Reverse Reply 192.168.100.49 at 192.168.100.49, length 28
02:23:07.114294 IP 192.168.100.49.59141 > 192.168.100.2.tftp:  17 RRQ "C0A86431" octet
02:23:07.121913 IP 192.168.100.2.24672 > 192.168.100.49.59141: UDP, length 516
02:23:07.128807 IP 192.168.100.49.59141 > 192.168.100.2.24672: UDP, length 4
02:23:07.128843 IP 192.168.100.2.24672 > 192.168.100.49.59141: UDP, length 516

Et du coté de la Sun Blade, le lancement de la mise à jour:

Standalone Flash PROM Update Utility, Rev. 3.0
            Ultra(tm) 1
            Ultra(tm) 2
            Ultra(tm) 5/10
            Ultra(tm) 30
            Ultra(tm) 60 / E220R / Netra T1120/1125
            Ultra(tm) 80 / E420R / Netra T1400/1405
            Ultra(tm) Enterprise(tm) 250
            Ultra(tm) Enterprise(tm) 450
            Sun Blade(tm) 100
            Sun Blade(tm) 1000
            Sun Blade(tm) 1500
            Sun Blade(tm) 1500 (Silver)
            Sun Blade(tm) 2500
            Sun Blade(tm) 2500 (Silver)
80R             Sun Fire (tm) 2\
            Sun Fire (tm) 480R / Sun Fire V490
            Sun Fire (tm) 880 / Sun Fire V890
            Netra(tm) T4
            Sun Fire (tm) V210/V240,Netra 240
            Sun Fire (tm) V440, Netra 440


This utility allows you to interactively update the firmware
revisions in specific system Flash PROM components.
type h for help, q to quit, Return or Enter to continue: |


Every precaution should be taken to prevent the loss of system
power during the Flash PROM programming process!

type h for help, q to quit, Return or Enter to continue: -


       Firmware Release(s)                Firmware Release(s)
 Currently Existing in the System      Available for Installation  /  Install?
---------------------------------- -------------------------------------------
OBP 4.10.6 2003/06/06 12:30        OBP 4.17.1 2005/04/11 14:31          no
2.0.1 2001/08/23 17:13          no POST |

Type sa if you wish to select all available firmware releases for installation.  Type h for help, quit to exit, or cont to continue: /
sa
=>  You've selected the same revision of POST firmware
=>  as that which is currently installed.
=>  You've selected the same revision of POST firmware
=>  as that which is currently installed.
=>  Do you REALLY want to do that?? (y/[n]) /
y

      Firmware Release(s)                Firmware Release(s)
 Currently Existing in the System      Available for Installation  /  Install?
---------------------------------- -------------------------------------------
OBP 4.10.6 2003/06/06 12:30        OBP 4.17.1 2005/04/11 14:31          YES
POST 2.0.1 2001/08/23 17:13        POST 2.0.1 2001/08/23 17:13          YES

if you wish to select all available firmware releases for 
installation.  Type h for help, quit to exit, or cont to continue: -
cont
The Flash programming process is about to begin.

-ype h for help, q to quit, Return or Enter to continue: \


Erasing the top half of the Flash PROM.
Programming OBP into the top half of the Flash PROM.
Verifying OBP in the top half of the Flash PROM.

Erasing the bottom half of the Flash PROM.
Programming OBP into the bottom half of Flash PROM.
Verifying OBP in the bottom half of the Flash PROM.

Erasing the top half of the Flash PROM.
Programming POST into the top half of Flash PROM.
Verifying POST in the top half of the Flash PROM.

Programming was successful.

Resetting ...

jeudi, août 26, 2010

Installation d'OpenSolaris sur une Sun Blade 150

Jeune propriétaire d'une station Sun Blade 150 (processeur UltraSPARC-IIe 650MHz, 1Go de RAM, 75Go de disque dur IDE et carte graphique additionnelle Sun Graphic VR-500) j'ai essayé de lui installer OpenSolaris pour voir ce que la carte graphique (Sun VR-500) et l'écran Sun de 19' avaient dans le ventre.
L'installation de FreeBSD (par le port série car la carte graphique VR-500 n'est pas supportée) n'a pris que quelques minutes: On démarre sur le CD freebsd-8.1-sparc64, on l'installe, c'est fini... Normal quoi.

Je me dit que cela va être identique pour osol (c'est le petit nom d'OpenSolaris)… Grave erreur.
En effet j'ai téléchargé et gravé l'unique image ISO correspondante à mon matériel sur le site OpenSolaris.org qui est «OpenSolaris 2009.06 SPARC Automated Install Image.iso»… Mais impossible de démarrer le SunBlade sur ce CD!
Après quelques recherches, je découvre que ce CD n'est simplement pas bootable et que pour pouvoir installer la version «Automated Install» il faut obligatoirement passer par un serveur PXE à la sauce Solaris…
L'installation simple d'OpenSolaris à partir d'un CD sur une machine sparc n'est tout simplement pas prévus O_o
Heureusement qu'il y a des gens qui ne sont pas bête et en plus très sympa. Et même que l'une de ces rares personnes a mis au point un live CD d'OpenSolaris pour sparc, et même mieux: Il propose en plus un script d'installation d'OpenSolaris à partir de son liveCD.
Un deuxième joyeux larron a réalisé la capture de l'ensemble du process d'installation (ce qui m'a bien aidé pour mon problème de partition EFI).

Aller, fini pour le blabla, place à l'action:
La galette du liveCD encore chaude est dans le lecteur DVD du SunBlade.
On commence par envoyer un «break» pour appeller l'OBP.
À partir du clavier sun: Stop + A
À partir du port série: Ca dépend de votre émulateur
Une fois dans l'OBP on entre
boot cdrom
On attends que ca ce lance, puis au prompt:
login: root
password: opensolaris
Maintenant il faut activer l'interface réseau. Mais pour cela il faut connaitre son nom:
prtconf -D | grep net
Ca ne me donne «eri», que l'on active par:
ifconfig eri0 plumb
Maintenant il lui faut configurer son IP, soit en statique:
ifconfig eri0 192.168.0.2/24
Soit en dhcp client:
ifconfig eri0 dhcp start
(Attention le DNS n'est pas fonctionnel)
Puis on démarre ssh:
svcadm enable ssh

On va en profiter pour télécharger le script d'install d'osol depuis une autre machine et le transférer par scp sur votre Sun:

[olivier@freebsd]~>fetch http://www.milax.org/files/zfsinstall_sparc
[olivier@freebsd]~>scp zfsinstall_sparc jack@192.168.100.2:/tmp
Password:  jack

Dernière étape avant de lancer l'installation: Connaitre le nom du disque par la commande «format» qui me donne «c4t0d0».
Et vérifier que ce disque utilise le format de partition SMI et non EFI: Comme j'avais déjà installé un FreeBSD qui à créé des partition EFI, j'ai du les supprimer pour créer une seule partition SMI.

root@opensolaris:~# format -e
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c4t0d0
          /pci@1f,0/ide@d/dad@0,0
Specify disk (enter its number): 0
selecting c4t0d0
[disk formatted, no defect list found]
Reading the primary EFI GPT label failed.  Using backup label.
Use the 'backup' command to restore the primary label.
(...)

format> label
[0] SMI Label
[1] EFI Label
Specify Label type[1]: 0
format> partition
(...)

partition> print
Current partition table (unnamed):
Total disk cylinders available: 38307 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders         Size            Blocks
  0 unassigned    wm       0                0         (0/0/0)             0
  1       swap    wu       0                0         (0/0/0)             0
  2     backup    wu       0 - 38306       74.53GB    (38307/0/0) 156292560
  3 unassigned    wm       0                0         (0/0/0)             0
  4 unassigned    wm       0                0         (0/0/0)             0
  5 unassigned    wm       0                0         (0/0/0)             0
  6        usr    wm       0 - 38306       74.53GB    (38307/0/0) 156292560
  7 unassigned    wm       0                0         (0/0/0)             0

partition> 1
Part      Tag    Flag     Cylinders         Size            Blocks
  1       swap    wu       0                0         (0/0/0)             0

Enter partition id tag[swap]:
Enter partition permission flags[wu]:
Enter new starting cyl[0]:
Enter partition size[0b, 0c, 0e, 0.00mb, 0.00gb]:
partition> 2
Part      Tag    Flag     Cylinders         Size            Blocks
  2     backup    wu       0 - 38306       74.53GB    (38307/0/0) 156292560

Enter partition id tag[backup]: unassigned
Enter partition permission flags[wu]: wm
Enter new starting cyl[0]:
Enter partition size[156292560b, 38307c, 38306e, 76314.73mb, 74.53gb]: 0
partition> 6
Part      Tag    Flag     Cylinders         Size            Blocks
  6        usr    wm       0 - 38306       74.53GB    (38307/0/0) 156292560

Enter partition id tag[usr]: unassigned
Enter partition permission flags[wm]:
Enter new starting cyl[0]:
Enter partition size[156292560b, 38307c, 38306e, 76314.73mb, 74.53gb]: 0

partition> 0
Part      Tag    Flag     Cylinders     Size            Blocks
  0 unassigned    wm       0            0         (0/0/0) 0

Enter partition id tag[unassigned]: root
Enter partition permission flags[wm]:
Enter new starting cyl[0]:
Enter partition size[0b, 0c, 0e, 0.00mb, 0.00gb]: 38307c
partition> print
Current partition table (unnamed):
Total disk cylinders available: 38307 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders         Size            Blocks
  0       root    wm       0 - 38306       74.53GB    (38307/0/0) 156292560
  1 unassigned    wu       0                0         (0/0/0)             0
  2 unassigned    wm       0                0         (0/0/0)             0
  3 unassigned    wm       0                0         (0/0/0)             0
  4 unassigned    wm       0                0         (0/0/0)             0
  5 unassigned    wm       0                0         (0/0/0)             0
  6 unassigned    wm       0                0         (0/0/0)             0
  7 unassigned    wm       0                0         (0/0/0)             0

partition> label
[0] SMI Label
[1] EFI Label
Specify Label type[0]:
Ready to label disk, continue? y

partition> q

(...)
format> quit


Maintenant on peux lancer le script d'installation sur le slice s0 du disque dur:
root@opensolaris:~# ksh /tmp/zfsinstall_sparc c4t0d0s0
Starting to copy data from UFS root to /zfsroot - this may take some time.
Updating vfstab
updating /zfsroot//platform/sun4u/boot_archive
Installing zfs bootblk on /dev/rdsk/c4t0d0s0
###################################################

OpenSolaris now installed.

Une fois l'installation terminée, on démonte le zfs et on reboot:
root@opensolaris:~# beadm umount opensolaris
root@opensolaris:~# reboot


et on configure le réseau un minimum:
touch /etc/hostname.eri0
touch /etc/dhcp.eri0

Puis remplacer dans le fichier /etc/nsswitch.conf, la ligne:
hosts:  file
par
hosts: file dns

Un petit reboot pour vérifier que le réseau ce lance tout seul au démarrage.

Vous pouvez ensuite lancer une mise à jour vers la dernière version d'osol (qui utilise nativement les fonctionnalités de clonage zfs pour revenir en arrière):

pkg refresh --full
pkg image-update

Maintenant, ne reste plus qu'a trouver comment lui installer une jolie interface graphique.

lundi, août 23, 2010

Juniper EX-4200 internal PFE routing in stack

During a troubleshooting session on a 10-members Juniper EX-4200 stack, I discovered the use of "show virtual-chassis vc-path source-interface XX destination-interface YY".
This command display the internal path across the EX-4200 PFE chips.
I obtain a result different that the EX-4200 diagram displayed in the O'reilly book "JunOS enterprise Switching" regarding the "Uplink Module".
Here are my results (simplified to a 3-members stack):


The Juniper use an internal routing-protocol for using shortest path between ports (less PFE hop count).
This diagram depends of how you build your stack too: If you use another way for plug your stack-cables, the result will be different.

Here is how to display the path when going from port ge-0/0/0 to ge-2/0/0

user@ex-stack> show virtual-chassis vc-path source-interface ge-0/0/0 destination-interface ge-2/0/0
vc-path from ge-0/0/0 to ge-2/0/0
Hop   Member  PFE-Device  Interface
0       0         1       ge-0/0/0
1       1         4       vcp-1
2       1         5       internal-1/25
3       1         3       internal-2/24
4       2         6       vcp-0
5       2         8       internal-0/24
6       2         7       ge-2/0/0

This means that if only one of the 3 PFE on one of your stack member have a problem, it's all flow that cross this member that will have problem.
You can check internal-PFE communication error with this command:
show virtual-chassis vc-port statistics extensive | match errors

jeudi, août 19, 2010

Réparation des bibliothèques manquantes

Suite à la mise à jour d'une bibliothèque critique sur mon FreeBSD (mise à jour de devel/icu4 qui est passé de 4.3 vers 4.4) et d'une erreur de ma part lors de l'étape de mise à jour:
Je me suis retrouvé avec un FreeBSD dont la base était pleinement fonctionnelle (merci à la séparation de la base et des ports) mais dont la grosse majoritée des applications ne voulaient plus démarrer (dont gnome).
En effet, les applications recherchaient les bibliothèques libicu*.so.43 qui n'existaient plus car remplacées par libicu*.so.44.
Pour retrouver rapidement un système fonctionnel, j'ai en premier lieu ajouté les correspondances «anciennes libs <=> nouvelles libs» dans le fichier /etc/libmap.conf:


libicule.so.43          libicule.so.44
libicui18n.so.43        libicui18n.so.44
libicudata.so.43        libicudata.so.44
libicuuc.so.43          libicuuc.so.44
libicutu.so.43          libicutu.so.44
libiculx.so.43          libiculx.so.44
libicuio.so.43          libicuio.so.44

Ce «bidouillage» ma permis de retrouver un système fonctionnel très rapidement, mais ca ne me plaisait pas d'avoir un système «pas si propre que ça».
Je me suis donc attelé à la rédaction d'un script shell qui
  1. Parcours l'ensemble des dossiers /usr/local/bin, /usr/local/sbin et /usr/local/lib à la recherche de fichier lié à des bibliothèques manquantes
  2. Puis retrouve le port correspondant à ces fichiers (pkg_info)
  3. Puis enfin recompile/réinstalle ces ports (portmaster)
Tout contents de moi, je suis aller le proposer sur #freebsd-fr, pour découvrir que je venais de ré-inventer la roue :-(
Ce script existe déjà en zsh (Reconstruire les paquets cassés) et il existe un port en ruby (sysutils/libchk).
Mais comme la version de mon script:
  1. Est en sh (et donc ni dépendante de zsh ni de ruby… qui sont des ports potentiellement «cassés» au moment ou vous avez besoin de ce script)
  2. Que c'est moi qui l'ai fait tout seul comme un grand, et que ca m'embête de le jeter après les heures (oui c'est très très chiant le sh) passé dessus
Je mes suis décidé à le publier quand même:

#!/bin/sh
# Found file with missing libs, and recompile the related breaked ports
set -e
dirs="/usr/local/lib /usr/local/libexec /usr/local/bin /usr/local/sbin"

portnames_tmp=""
for dir in ${dirs}; do
    for filename in `find -L ${dir} -type f`; do
    if file ${filename} | grep -q ELF; then
        if ldd ${filename} 2>&1 | grep -q "not found"; then
            portnames_tmp=${portnames_tmp}" "`pkg_info -qoW ${filename}`
        fi
    fi
    done
done

if [ "${portnames_tmp}" = "" ];then
    echo "No missing lib found"
    exit 0
fi

# Filtering duplicate name in $portnames_tmp
portnames=`for port in ${portnames_tmp}; do  echo $port; done |  sort -u | xargs echo`

echo "Detecting missing library for theses ports:"
echo ${portnames}

echo "Start upgrading them…"
portmaster -B ${portnames}

PS (1): le port devel/icu4 étant buggué (il oublie d'installer la bibliothèque libicutest.so.44), à chaque lancement de ce script, il détectera que devel/icu4 à une bibliothèque manquante et voudra donc le ré-installer :-)
PS (2): Ne pas oublier de faire le ménage dans /etc/libmap.conf après avoir corrigé vos problèmes.

jeudi, août 12, 2010

TCP flow analysis with tshark, tcptrace and xplot

Troubleshooting bad TCP performance between old Windows 2003 SP1 servers and a Sun Solaris 8, my only goal was to generate some TCP flow graph with Wireshark :
  1. The TCP Stream Graph: Time sequence grap


  2. The flow graph: TCP flow


But my old desktop computer was not able to opening the 1Go cap file onto Wireshark.
I found another solution using tshark, tcptrace and xplot:
  1. tshark, used with a little shell script, is used for extracting the TCP stream
  2. tcptrace is used for generate all graph files in xplot format (throughput, rtt sample time sequence , owin, segsize)
  3. xplot is used for drawing the graph using the xplot file generated in step 2
Here the shell script used for extracting the TCP stream:

#!/bin/sh
set -e
if [ $# -eq 0 ]; then
        echo "usage:"
        echo '$0 tracefile.cap ["tshark filter"]'
        echo ""
        echo "Example:"
        echo '$0 trace.cap "ip.addr==192.168.10.10 && tcp.port==1290 && ip.addr==192.168.20.20 && tcp.port==20'
        exit 0
fi
if [ ! -f $1 ]; then
    echo "No input trace file found!"
    exit 1
fi
echo "Generating the lists of detected TCP stream (can take a very long time depending of your trace size)..."
echo "If the next table didn't give you enough detail, try to generate more details stats with tshark:"
echo "tshark -n -r $1 -q -z conv,tcp"
echo "Stream    IP src TCP port scr IP dst TCP port dst"

if [ $# -eq 2 ]; then
    tshark -n -r $1 -R "$2" -T fields -e tcp.stream -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport | sort -un
else
    tshark -n -r $1 -T fields -e tcp.stream -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport | sort -un
fi

echo "Enter the stream number you want to extract (enter all for all streams):"
read streamid <&1
if [ $streamid != "all" ]; then
    echo "Extracting stream ${streamid} …"
    tshark -r $1 -w stream-${streamid}.cap -R "tcp.stream eq ${streamid}"
    echo "Stream number ${streamid} extracted in file stream-${streamid}.cap"
else
    echo "Extracting All streams"
    for streamid in `tshark -n -r $1 -T fields -e tcp.stream | sort -un`
    do
        echo "Working on stream ${streamid} …"
        tshark -r $1 -w stream-${streamid}.cap -R "tcp.stream eq ${streamid}"
    done
    echo "All streams were extracted in files stream-STREAM-NUMBER.cap"
fi


This script should be run like that:

[[olivier@sparc64]~/>sh extract-stream.sh solaris-slow-TCP.cap
Generating the lists of detected TCP stream (can take a very long time depending of your trace size)...
If the next table didn't give you enough detail, try to generate more details stats with tshark:
tshark -n -r solaris-slow-TCP.cap -q -z conv,tcp
Stream    IP src TCP port scr IP dst TCP port dst
0       10.10.129.254   48001   10.10.142.220   31114
1       10.10.129.254   1004    10.10.142.220   513
2       10.10.142.242   2948    10.10.142.220   1521
3       10.10.142.242   3899    10.10.142.220   1521
4       10.10.142.244   3777    10.10.142.220   1521
5       10.10.142.244   3536    10.10.142.220   1521
6       10.10.142.243   3687    10.10.142.220   1521
7       10.10.142.244   4936    10.10.142.220   1521
8       10.10.142.220   1521    10.10.142.244   3569
9       10.10.142.244   1256    10.10.142.220   21
10      10.10.142.220   20      10.10.142.244   1290
11      10.10.142.158   1433    10.10.142.160   1652
12      10.10.142.245   1591    10.10.142.220   1521
13      10.10.142.158   1433    10.10.142.160   1678
14      10.10.142.244   3732    10.10.142.220   1521
15      10.10.142.158   1433    10.10.142.160   1555
16      10.10.142.158   1433    10.10.142.160   1683
17      10.10.142.158   1433    10.10.142.160   1684
        10.10.142.247           10.10.142.255
Enter the stream number you want to extract (enter all for all streams):
10
Extracting stream 10 …
Stream number 10 extracted in file stream-10.cap



Once you've get the filtered cap file, run tcptrace over it:

tcptrace -n -C -G stream-10.cap

Now, better than with Wireshark (because you can zoom in/out), here are the TCP Time sequence grap:
xplot a2b_tsg.xpl &



 And the TCP flow graph:

 xplot a_b_tline.xpl &


My problem is that packet are lost in the direction Solaris => Windows… I need to found where now :-)

lundi, août 02, 2010

Compilation des ports et proxy HTTP authentifié

Ayant la possibilité de tester un serveur SunFire V480R au bureau, j'en ai profité pour lui installer un FreeBSD 8.1.
Si l'installation n'a posée aucun problème à par la prise en main de l'OpenBoot PROM (OBP pour les intimes), la déclaration du proxy HTTP authentifié qui ma pris plus de temps que prévus.
En effet, il est assez simple de le déclarer le proxy par les commandes suivantes (a adapter dans votre cas):

setenv HTTP_PROXY "10.0.0.10:8080"
setenv HTTP_PROXY_AUTH "basic:*:login:password"
setenv http_proxy 'http://login:password@10.0.0.10:8080/'

On peux désormais faire du «portsnap fetch extract», etc…:

[olivier@sparc64]~>fetch http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html
book.html                                     100% of 5595 kB  370 kBps 00m00s
[olivier@sparc64]~>


Par, contre cela ne suffit pas pour permettre le téléchargement des sources des ports: Le proxy est bien utilisé, mais il ne s'authentifie pas tous seul:

[root@sparc64]/usr/ports/www/shellinabox#make extract
===>  Vulnerability check disabled, database not found
===>  License accepted by the user
=> shellinabox-2.10.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch from http://shellinabox.googlecode.com/files/.
fetch: http://shellinabox.googlecode.com/files/shellinabox-2.10.tar.gz: Proxy Authentication Required


Avant de s'énerver et de remplacer le FreeBSD par un Ubuntu Server :-) faisons un petit tour du coté des barbus français (freebsd-fr@freenode)… C'était la bonne méthode, car le grand bapt@ était présent et ma fait une réponse aux petits ognons:

echo "FETCH_ARGS=-pRr" >> /etc/make.conf

Et cela à résolus mon problème:

[root@sparc64]/usr/ports/www/shellinabox#make extract
===>  Vulnerability check disabled, database not found
===>  License accepted by the user
=> shellinabox-2.10.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch from http://shellinabox.googlecode.com/files/.
shellinabox-2.10.tar.gz                       100% of  501 kB 1087 kBps
===>  Extracting for shellinabox-2.10
=> MD5 Checksum OK for shellinabox-2.10.tar.gz.
=> SHA256 Checksum OK for shellinabox-2.10.tar.gz.

On peux même déclarer le proxy dans le fichier make.conf (mais éviter de déclarer votre proxy partout, car en cas de changement cela fait plusieurs fichiers à modifier et votre mot de passe qui traine partout):

echo "FETCH_ENV=http_proxy='http://login:password@10.0.0.10:8080/'" >> /etc/make.conf

dimanche, juillet 25, 2010

make installworld: «touch: not found» lors d'une mise à jour à distance

FreeBSD 8.1-Release étant de sortie, j'en ai profité pour mettre à jour mon kimsufi 250G.
Si la procédure de mise à jour à distance est en général assez risquée pour un changement de version majeure, elle ne ma jamais posée de problème pour un changement de version mineure.
Sauf que cette fois-ci, le «make installworld» se termine mal par le message d'erreur «touch: not found».

La FAQ officielle explique que ce problème est lié un problème d'horloge qui fait que les dates des fichiers à installer sont incorrect suite au redémarrage en mode «single user». La FAQ conseil d'utiliser la  commande «adjkerntz -i» pour résoudre ce problème. Cette proposition n'est pas adaptée à mon cas car je ne redémarre pas en mode single user.
    Un autre utilisateur, barryp, indique que ce problème est du au fichier /usr/src/sys/conf/newvers.sh qui n'a pas la bonne date et qu'un simple «touch» sur ce fichier pour le mettre à la bonne date résous le problème… Pas chance, cela ne résous pas mon problème :-(
     
    La bonne réponse m'a été donné sur le site de so14k: Il faut utiliser la commande «make installworld PATH=$PATH» pour ne plus avoir ce problème de «touch: not found».

    lundi, juillet 12, 2010

    Installation de FreeBSD «headless» (utilisation du port console comme clavier/écran)

    Je souhaitai installer FreeBSD sur une «vieille» unité centrale qui n'avait plus d'écran: Il me fallait utiliser le port série comme console principale.
    Ce n'est pas très compliqué: Il suffit de modifier l'image ISO de FreeBSD pour forcer l'usage du port série.
    Une fois téléchargé l'image, on la monte (l'ensemble des exemples utilisent tcsh comme shell):

    set MD=`mdconfig -a -t vnode -f FreeBSD-8.1-RC2-amd64-disc1.iso`
    mount -t cd9660 /dev/$MD /mnt/

    Vous obtenez une image montée en lecture seule (normal pour un ISO)… Ne reste plus qu'à la modifier et re-générer un fichier ISO.
    Pour cela, on peux vous conseiller de recopier l'intégralité de l'image disque et ensuite de modifier votre copie comme ceci:

    mkdir /tmp/isotmp
    cd /mnt
    tar cf - * | ( cd /tmp/isotmp; tar xfp - )

    Mais comme cette méthode est lente et consomme de la place sur votre disque, voici une méthode plus intelligente utilisant unionfs:

    mkdir /tmp/isotmp
    mount -t unionfs -o noatime /tmp/isotmp/ /mnt/

    Désormais le point de montage original (/mnt) est accessible en écriture :-)
    Modifions le boot/loader.conf pour forcer l'usage du port série:
    J'utilise une vitesse de 38400 baud pour que ca ne soit pas trop désagréable.
    Attention à l'utilisation de unionfs qui ne gère pas la fusion du contenus de deux fichiers identiques, il faut utiliser une copie pour ne pas écraser l'ancien:

    cat /mnt/boot/loader.conf > /mnt/boot/loader.conf.new
    echo 'comconsole_speed="38400"' >> /mnt/boot/loader.conf.new
    echo 'console="comconsole"' >> /mnt/boot/loader.conf.new
    echo 'boot_serial="-h"' >> /mnt/boot/loader.conf.new
    mv /mnt/boot/loader.conf.new /mnt/boot/loader.conf

    Ne reste plus qu'a régénérer une ISO:

    cd /mnt
    mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/FreeBSD-8.1-headless-.iso .

    Puis à démonter (2 fois) votre image, détruire le md et effacer votre dossier temporaire:

    cd /
    umount /mnt
    umount /mnt
    mdconfig -d -u $MD
    rm -rf /tmp/isotmp

    Mais ne partez pas si vite ! Il reste juste un tout petit détail qui a son importance…
    Une fois l'installation de FreeBSD terminé, et avant de re-démarrer:

    N'oubliez pas de modifier le /etc/ttys en lui déclarant l'usage du port série!
    Dans sysinstall: configure system ttys.
    Il va ouvrir le fichier /etc/ttys dans un éditeur de texte, il faut remplacer la ligne suivante:

    # Serial terminals
    # The 'dialup' keyword identifies dialin lines to login, fingerd etc.
    ttyu0   "/usr/libexec/getty std.9600"   dialup  off secure

    Par ceci:

    # Serial terminals
    # The 'dialup' keyword identifies dialin lines to login, fingerd etc.
    ttyu0   "/usr/libexec/getty std.38400"   vt100  on secure

    Personnellement, avant de graver le CD, je vérifie la procédure par l'excellentissime[1] qemu:

    qemu-img create fbsd-test.img 4G
    kldload kqemu.ko
    kldload aio.ko
    qemu-system-x86_64 -kernel-kqemu -nographic -cdrom FreeBSD-8.1-headless.iso -hda fbsd-test.img -boot d
    qemu-system-x86_64 -kernel-kqemu -nographic -hda fbsd-test.img

    Article original m'ayant fortement inspiré: FreeBSD Headless install
    [1] Essayez d'en faire autant en si peux de lignes de commande avec VirtualBox !

    vendredi, juillet 09, 2010

    Utilisation de nanoBSD sur un WRAP de PC-Engines

    Après avoir passé 2 jours à chercher pourquoi BSDRP (NanoBSD basé sur FreeBSD 8.1-RC2) ne voulais pas démarrer sur mon PC-Engines WRAP.1E-2, voici la liste des pré-requis à respecter…

    Coté WRAP:
    1. Version du BIOS en 1.11
    2. BIOS configuré en mode CHS (et non pas LBA)
    Coté NanoBSD:
      1. Compiler un noyaux i386 avec la ligne "options CPU_GEODE" dans le fichier de configuration
      2. L'image nanoBSD doit utiliser comme console le port série par défaut (cust_comconsole) à la vitesse de 38400 baud si possible (pour respecter la vitesse par défaut du WRAP).
      3. L'image nanoBSD doit absolument utiliser une géométrie disque de 255H 63S/T. Par exemple en utilisant «UsbDevice generic-hdd 256» pour une image finale de 256Mo.
      4. Le bootloader doit être paramétré en mode nopacket, car le mode «packet» par défaut n'est pas compatible avec le BIOS du WRAP

        Si votre séquence de démarrage reste bloqué à l'affichage de nombreux «###» comme ceci:

        PC Engines WRAP.1C/1D/1E v1.11
        640 KB Base Memory
        130048 KB Extended Memory

        01F0 Master 848A SanDisk SDCFB-512                      
        Phys C/H/S 993/16/63 Log C/H/S 993/16/63

        1  FreeBSD
        2  FreeBSD
         
        F6 PXE
        Boot:  1 #############################################################################################################

        Re-vérifiez les point 3 et 4 de vos images nanoBSD.
        Par exemple, une fois la carte flash insérée dans le lecteur CF de votre poste de travail (sous FreeBSD), utilisez la commande «boot0cfg -v /dev/device» pour vérifier le mode:




        [root@d630]#boot0cfg -v /dev/da1
        #   flag     start chs   type       end chs       offset         size
        1   0x80      0:  1: 1   0xa5    111: 63:32           32       229344
        2   0x00    112:  1: 1   0xa5    223: 63:32       229408       229344
        3   0x00    224:  0: 1   0xa5    233: 63:32       458752        20480
        4   0x00    234:  0: 1   0xa5    243: 63:32       479232        20480

        version=2.0  drive=0x80  mask=0x3  ticks=182  bell=# (0x23)
        options=nopacket,update,nosetdrv
        volume serial ID 9090-9090
        default_selection=F1 (Slice 1)

        Puis vérifier que la géométrie de votre image :

        [root@d630]#fdisk /dev/da1
        ******* Working on device /dev/da1 *******
        parameters extracted from in-core disklabel are:
        cylinders=62 heads=255 sectors/track=63 (16065 blks/cyl)

        parameters to be used for BIOS calculations are:
        cylinders=62 heads=255 sectors/track=63 (16065 blks/cyl)

        (etc…)


        lundi, juin 07, 2010

        Online.net : Multiplication par 2,4 de leur tarifs sans prévenir leurs abonnés !!

        En voulant renouveler les noms de domaines que je possède chez online.net, j'ai eu la très mauvaise surprise de découvrir que ma facture avait été plus que doublée !!
        En effet, sans recevoir aucun message de la part d'Online.net, je découvrais qu'ils ont migrés leurs offres.
        Voici les comparaisons tarifaire entre une ancienne et une nouvelle offre:

        • Ancienne offre XS: 5€ HT/an
        • Nouvelle offre pack «basique»: 11,88 € HT/an
        Les tarifs sont multiplié par 2,4 !

        Cela veux dire que si vous aviez 10 noms de domaines chez eux, votre facture passe de 55€ TTC à 131 € pour l'année !!

        Et c'est la même chose pour les offres d'hébergement :
        • Ancienne offre M: 29,90 € HT/an
        • Migré (sans demander mon avis) vers l'offre pack «illimité»: 71,88 € HT/an
        Même ratio pour l'augmentation de tarif: 2,4 !!
        J'ai donc contacté le service client pour, qu'au minimum, ils passent mon hébergement sur l'offre «Pack Pro» (36€/an).
        Leur réponse est désespérante:
        «Pour changer d'offre il faut pour l'instant resilier votre offre d'hebergement actuelle et reprendre une nouvelle offre une fois l effacement terminé»

        Bref, je n'avais jamais eu à me plaindre d'online.net jusqu'à présent, mais là c'est terminé avec eux.
        Après avoir migré mon serveur dédié dedibox v1 vers un Kimsufi 250G d'OVH, je vais donc devoir aussi transférer mes noms de domaine.

        lundi, mars 08, 2010

        Le Trône de Fer: La série TV en préparation !

        Très rare sont les séries TV qui arrivent à justifier une place dans mon emplois du temps (la dernière était Battlestar Galactica). Heureusement il y a du gros en préparation… du très gros même:
        Il ne s'agit ni plus ni moins que de l'adaption de la saga Le Trône de Fer ! (pour ceux qui ne connaisent pas c'est de la fantasy très «réaliste»).

        Les premières diffusions sont prévues pour printemps 2011.

        Plus d'info:


        lundi, janvier 25, 2010

        ACTA: une menace pour Internet !

        Les journalistes ne faisant pas leur boulot, aux internautes de le faire...

        «Les négociations sur l'Accord Commercial Anti-Contrefaçon (ACTA) se tiendront du 26 janvier au 29 janvier à Mexico. Le but de l'ACTA est de contrôler Internet, tout en évitant soigneusement les processus démocratiques. »

        Pour plus d'info: