OpenWRT Linux Simple

Un article de Toulouse Sans Fil, un réseau wifi libre sur Toulouse.

Accueil | Technique | Réalisations simplifiées | OpenWrt

Image:Travaux.gif Cette page est actuellement en travaux.
Merci de ne pas l'éditer pour le moment.

voici un petit guide qui va vous permetre de réaliser votre propre firmware préconfiguré pour réaliser un réseau maillé à base de routeur sans fil et avec le protocole OLSR. Ceci a été mis en oeuvre par plusieurs structures. Les réseaux maillés sont devenus une réalité tout particulièrement grâce aux logiciels libres :

  • Openwrt qui est le coeur du systèmes embarqué sur les routeurs. Il s'agit d'un mini système linux dit embarqué à cause de la taille mémoire du système mais aussi parce qu'il n'y pas de clavier de commande ni d'interface graphique. C'est pour cette raison que la manipulation des systèmes embarqués est parfois délicate.
  • OLSR qui est le protocole de routage et maillage.

Pour réaliser ce firmware vous avez besoin d'un système Linux avec un peu moins de 100Mo d'espace disque. Il n'est pas nécessaire de disposer de compilateur. Le kit est fourni avec des paquets logiciels précompilés. Vous avez besoin de la commande make, tout le reste est intégré à Image Builder. Pour les anglophones, il y a un joli howto (http://wiki.openwrt.org/ImageBuilderHowTo) qui contient des informations intéressantes sans couvrir l'ensemble des éléments d'un firmware.

Ce document n'a pas pour objectif de montrer le meilleur de la technologie en matière de réseau sans fil, mais c'est plutot une introduction-démonstration de ce qu'il est possible de faire sans vraiment de difficultés en suivant un guide pas à pas. C'est aussi une façon de montrer l'intéret du logiciel libre et la façon dont on assemble les briques logicielles un peu à la manière d'un lego.

Vous en rêviez, accrochez-vous bien, vous allez le faire !

Sommaire

pré-requis

Pour mener à bien cette expérience, vous devez disposer d'un PC sous Linux, peu importe la distribution et d'un minimum de compétances dans le monde Unix pour passer des commandes en ligne dans un terminal. Cependant, ce ne sera pas très compliqué dans la mesure ou toutes les commandes sont fournies. Vous devez en outre savoir éditer des fichiers de configuration, le plus pratique étant d'utiliser soit un éditeur graphique, soit "vi".

Pour les autres, tous les incultes des systèmes d'exploitation alternatifs, vous pouvez d'abord aller faire un grand voyage initiatique dans le monde du logiciel libre :

  • Lea-Linux (http://lea-linux.org/) est un très bon départ,
  • LinuxFr (http://linuxfr.org/) est un site pour les plus confirmés. Il est par définition le site des communautés du logiciel libre. Il donne une idée de la vie bouillonante qui anime la comunauté francophone,
  • il en existe beaucoup d'autres, les altermondialistes ne sont pas les seuls, le petit monde de l'informatique vie sa révolution depuis bien des années déja avec en 1992 une étoile ... Mais le mouvement a commencé bien avant.
  • une petite séance d'initiation réseau pourra aussi vous aider.

téléchargement

veuillez télécharger la dernière version de Openwrt. Actuellement (fin mars 2006), c'est la version rc5 qui est disponible. Tout ce tutorial sera adapté à cette version. Il est possible qu'il y ait des différences mineures dans le processus en fonction de la version que vous aurez téléchargée.

wget http://downloads.openwrt.org/whiterussian/rc5/OpenWrt-ImageBuilder-Linux-i686.tar.bz2
bzcat OpenWrt-ImageBuilder-Linux-i686.tar.bz2 | tar -xvf -
cd OpenWrt-ImageBuilder-Linux-i686/

gardons une trace du répertoire courant qui nous servira à aller dans le bon repertoire avant de passer les commandes. Par la suite, "cd $builddir" signifie de retourner vers ce répertoire "racine" de l'extraction de Image Builder :

builddir=`pwd`

vous avez maintenant en face de vous un environnement pour fabriquer un firmware Openwrt ; vous avez en gras les commandes a saisir (lorsqu'il y a du texte avec représentation les sorties des commandes).

marc@tolomicro-amd:/spare/openwrt/whiterussian-rc5/imageBuilder/tmp/OpenWrt-ImageBuilder-Linux-i686$ \ls -l
total 48
drwxr-xr-x  3 marc marc  4096 2006-03-27 02:07 build_mipsel
drwxr-xr-x  5 marc marc  4096 2006-03-27 02:07 image
-rw-r--r--  1 marc marc    40 2006-03-27 02:07 kernel.mk
drwxr-xr-x  2 marc marc  4096 2006-03-27 02:07 lists
-rw-r--r--  1 marc marc  1445 2006-03-26 18:39 Makefile
drwxr-xr-x  2 marc marc 16384 2006-03-27 02:07 packages
-rw-r--r--  1 marc marc  3483 2006-03-27 02:07 rules.mk
drwxr-xr-x  2 marc marc  4096 2006-03-27 02:07 scripts
drwxr-xr-x  3 marc marc  4096 2006-03-27 02:07 staging_dir_mipsel

Toutes les directives de fabrication sont localisées dans le fichier Makefile. C'est la commande make qui permet de déclancher la fabrication du firmware.

Nous allons maintenant procéder à la configuration du firmware.

configuration

L'objectif de ce firmware est d'embarquer la fonction de routage-maillage par l'adjonction du protocole OLSR. Nous allons aussi incorporer à ce firmware des fonctions utiles : filtrage de trafic réseau, enregistrements de logs, maillage réseau. Le firmware openwrt est modulaire et extensible à volonté par l'adjonction de nouveau logiciels gérés sous formet de paquets (packets en anglais) au format .ipk. Dans Image Builder, ces paquets sont précompilés et ce ne sont pas moins de 306 paquets qui sont disponibles pour l'intégration au firmware.

C'est dans le répertoire list que se situe le principal fichier de configuration. Il comprend plusieurs fichiers contenant la liste des paquets que nous souhaitons intégrer au firmware. Par défaut, il contient 3 fichiers destiné a fabriquer 3 firmware différents. Nous allons d'abord faire un peu de ménage en supprimant les fichiers qui ne nous intéressent pas et qui allongeraient le processus de fabrication :

cd $builddir/lists
mkdir tmp
mv micro.brcm-2.4 pptp.brcm-2.4 tmp
mv default.brcm-2.4 tsf.brcm-2.4

Le fichier tsf.brcm-2.4 permettra de générer un firware adapté à notre besoin. En voici le contenu original :

marc@tolomicro-amd:/spare/openwrt/whiterussian-rc5/imageBuilder/tmp/OpenWrt-ImageBuilder-Linux-i686/lists$ cat $builddir/lists/tsf.brcm-2.4
base-files
base-files-brcm
bridge
busybox
dnsmasq
dropbear
haserl
ipkg
iptables
iwlib
kmod-brcm-wl
kmod-diag
kmod-ppp
kmod-pppoe
kmod-switch
kmod-wlcompat
mtd
nvram
ppp
ppp-mod-pppoe
uclibc
webif
wificonf
wireless-tools

Il nous manque quelque paquets qu'il faudra ajouter à la fin de cette liste ; il est possible de supprimer certains (kmod-ppp, kmod-pppoe, webif ...) :

cat >> $builddir/lists/tsf.brcm-2.4 <<END
# pour TSF - OLSR, gestion des priorité des flux réseau, iptables, logs
olsrd
olsrd-mod-dot-draw
olsrd-mod-dyn-gw
olsrd-mod-httpinfo
wl
nas
ntpclient
tc
kmod-sched
kmod-ipt-ipopt
kmod-iptables-extra
iptables-mod-ipopt
iptables-mod-ulog
iptables-mod-extra
END

Certains paquets logiciels ne sont pas directement inclus dans Image Builder principalement à cause de la licence. C'est le bon moment pour les ajouter manuellement :

 cd $builddir/packages
 wget http://downloads.openwrt.org/whiterussian/rc5/packages/non-free/nas_3.90.37-17_mipsel.ipk
 wget http://downloads.openwrt.org/whiterussian/rc5/packages/non-free/wl_3.90.37-1_mipsel.ipk

construction

Nous avons maintenant tout le nécessaire pour construire notre premier firware. C'est parti :

cd $builddir
make

voici ce qui devrait s'afficher lors de la construction :

 ### BUILDING IMAGE FROM lists/tsf.brcm-2.4
 
 Unpacking kernel...Done.
 Configuring kernel...Done.
 Unpacking base-files...Done.
 Configuring base-files...Done.
 Unpacking base-files-brcm...Done.
 Configuring base-files-brcm...Done.
 Unpacking bridge...Done.
 Configuring bridge...Done.
 Unpacking busybox...Done.
 Configuring busybox...Done.
 ...
 Unpacking wl...Done.
 Configuring wl...Done.
 Unpacking ntpclient...Done.
 Configuring ntpclient...Done.
 Unpacking tc...Done.
 Configuring tc...Done.
 ... 
 Number of duplicate files found 0
 Number of inodes 421
 Number of files 238
 Number of fragments 19
 Number of symbolic links  136
 Number of device nodes 0
 Number of fifo nodes 0
 Number of socket nodes 0
 Number of directories 47
 Number of uids 1
         root (0)
 Number of gids 0
 mjn3's trx replacement - v0.81.1
 mjn3's addpattern replacement - v0.81
 writing firmware v4.20.6 on 6/3/29 (y/m/d)
 adding 992 bytes of garbage
 mjn3's addpattern replacement - v0.81
 writing firmware v1.5.2 on 6/3/29 (y/m/d)
 adding 992 bytes of garbage
 mjn3's addpattern replacement - v0.81
 writing firmware v1.99.5 on 6/3/29 (y/m/d)
 adding 992 bytes of garbage
 mjn3's addpattern replacement - v0.81
 writing firmware v4.70.6 on 6/3/29 (y/m/d)
 adding 992 bytes of garbage
 mjn3's addpattern replacement - v0.81
 writing firmware v2.0.0 on 6/3/29 (y/m/d)
 adding 992 bytes of garbage

à la fin du processus, vous pouvez regarder le contenu du répertoire contenant les firmwares :


 marc@tolomicro-amd:/spare/openwrt/whiterussian-rc5/imageBuilder/tmp/OpenWrt-ImageBuilder-Linux-i686$ ls -al bin/tsf
 total 41032
    4 drwxr-xr-x  2 marc marc    4096 2006-03-29 21:58 ./
    4 drwxr-xr-x  3 marc marc    4096 2006-03-29 21:58 ../
 2500 -rw-r--r--  1 marc marc 2555904 2006-03-29 21:58 openwrt-brcm-2.4-jffs2-4MB.trx
 2564 -rw-r--r--  1 marc marc 2621440 2006-03-29 21:58 openwrt-brcm-2.4-jffs2-8MB.trx
 1752 -rw-r--r--  1 marc marc 1789952 2006-03-29 21:58 openwrt-brcm-2.4-squashfs.trx
 2504 -rw-r--r--  1 marc marc 2555912 2006-03-29 21:58 openwrt-wa840g-jffs2.bin
 1756 -rw-r--r--  1 marc marc 1789960 2006-03-29 21:58 openwrt-wa840g-squashfs.bin
 2504 -rw-r--r--  1 marc marc 2555912 2006-03-29 21:58 openwrt-we800g-jffs2.bin
 1756 -rw-r--r--  1 marc marc 1789960 2006-03-29 21:58 openwrt-we800g-squashfs.bin
 2504 -rw-r--r--  1 marc marc 2555912 2006-03-29 21:58 openwrt-wr850g-jffs2.bin
 1756 -rw-r--r--  1 marc marc 1789960 2006-03-29 21:58 openwrt-wr850g-squashfs.bin
 2504 -rw-r--r--  1 marc marc 2556928 2006-03-29 21:58 openwrt-wrt54g3g-jffs2.bin
 1756 -rw-r--r--  1 marc marc 1790976 2006-03-29 21:58 openwrt-wrt54g3g-squashfs.bin
 2504 -rw-r--r--  1 marc marc 2556928 2006-03-29 21:58 openwrt-wrt54g-jffs2.bin
 2568 -rw-r--r--  1 marc marc 2622464 2006-03-29 21:58 openwrt-wrt54gs-jffs2.bin
 1756 -rw-r--r--  1 marc marc 1790976 2006-03-29 21:58 openwrt-wrt54g-squashfs.bin
 1756 -rw-r--r--  1 marc marc 1790976 2006-03-29 21:58 openwrt-wrt54gs-squashfs.bin
 2504 -rw-r--r--  1 marc marc 2556928 2006-03-29 21:58 openwrt-wrt54gs_v4-jffs2.bin
 1756 -rw-r--r--  1 marc marc 1790976 2006-03-29 21:58 openwrt-wrt54gs_v4-squashfs.bin
 2568 -rw-r--r--  1 marc marc 2622464 2006-03-29 21:58 openwrt-wrtsl54gs-jffs2.bin
 1756 -rw-r--r--  1 marc marc 1790976 2006-03-29 21:58 openwrt-wrtsl54gs-squashfs.bin

Le fichier qui nous intéresse est openwrt-wrt54g-squashfs.bin si vous avez un Linksys Wrt54g. Ce fichier fait (beaucoup) moins de 3Mo ; il peut donc etre transféré sur le firmware par TSF.

Il existe 2 formats de firmware :

  • squashf : est un format de fichier tres compact (compressé). Il permet de creer des firmwares avec plus de fonctionnalités. Cependant, une grande partie du firmware ne sera pas modifiable puisque inscript dans un zone dont l'ecriture est impossible,
  • jffs2 : est un format de fichier un peu moins compressé ; mais il permet les modifications à la demande de tout le contenu du firmware. Cela peut-etre très pratique en phase de développement.

remarque : il est possible de convertir du squashf en jffs2 après coup.

L'autre information sur le nom du fichier permet de différencier les différentes plateformes matérielles sur lesquelles Openwrt fonctionne. Vous voyez qu'il y a de multiples possibilités. Les fichiers au format .trx sont destinés a être téléchargés sur le routeur et l'ecriture se faisant avec la commande mtd write. Pour le transfert du fichier on utilise généralement scp.

Ce firmware est très bien mais pas encore tres particularisé. Nous verrons par la suite comment lui donner par défaut tous les paramètres du réseau sans fil que nous souhaitons : adresses IP, configuration OLSR et du coup feu, serveur DNS. Tout cela peut se faire très facilement en placant certains fichiers (les bons fichiers) dans le répertoire files et files.tsf.

installation du firmware

Il faut distinger plusieurs opérations qui différencieront la procédure d'installation

  • vous disposez d'un routeur tout neuf avec le firmware d'origine ; il est possible de mettre a jour via un navigateur
  • vous avez changé le firmware, mais disposez d'une interface WEB avec mise a jour du firmware ; il suffit dans ce cas de
  • vous n'avez pas possibilité de faire la mise a jour par interface WEB parce que l' firmware ne le permet pas :
    • il faudra utiliser TFTP si l'option boot_wait est activée,
    • ou copier le firmware sur le routeur et faire la mise a jour via la commande mdt write.

interface WEB

veuillez tout simplement suivre la procedure de mise a jour via l'interface WEB du routeur. C'est un fichier au format .bin que vous devez fournir. Cette procedure peut être dangeureuse. Si vous échouez pendant la mise a jour alors que cette option n'est pas activée, vous n'aurez plus aucun moyen de controler votre routeur. Il est impératif si l'on veut disposer d'une solution de secours d'activer le mode TFTP au démarrage via l'option boot_wait.

Une facon simple de positionner l'option boot_wait est d'utiliser le script takeover.

recopie du fichier

  • généralement on utilise scp a condition de disposer d'un serveur SSH sur le routeur,
  • il est aussi possible de se loger sur le routeur via telnet et de rapatrier via wget sur un serveur (local ou distant) le firmware,
  • le firmware doit etre au format .trx,
  • c'est avec la commande mtd write que vous pourez mettre a jour votre routeur.
  • il existe pluseirs versions de commande mtd qui acceptent des options légérement différentes,
  • il n'est pas très recommandé d'effectuer cette opération a distance, parfois le routeur ne redémarre pas correctement après la commande reboot.

variables NVRAM

Les variables nvram sont des variables de configuratio du routeur. Elles sont situées dans une zone réservée de la mémoire flash. Ces variables ne sont pas affectuées par la mise a jour du firmware, elles sont permanentes. Elles sont modifiables et consultables dans le firmaware grace a la commande nvram :

nvram show | grep lan_ (par exemple),
nvram get boot_wait
nvram set boot_wait=on

L'option boot_wait est la plus importante du système des que l'on veut modifier le firmware et être certain de pouvoir garder le controle sur le routeur, même en cas de difficultés de flashage. A partir de la version rc5 de Openwrt-whiterussian, on peut appuyer sur le bouton reset au démarrage, dès que la LED DMZ s'allume (pas avant). Cela a pour effet :

  • de passer le routeur en mode failsafe (secours),
  • son adresse IP est 192.168.1.1
  • le routeur est joignable via telnet et administrable en ligne de commande,
  • et cerise sur le gateau, si l'option boot_wait n'est pas activée, elle sera forcée et au prochain reboot, il sera possible de modifier le firmware par TFTP (magique).

flashage par TFTP

C'est de loin la solution la plus recommandée. Si cette méthode est possible une fois et que vous la maitrisez, vous pourrez la répéter aussi souvent qu'il vous sera nécessaire. D'autre part il n'est pas nécessaire de disposer d'un firmware fonctionnel pour être en mesure d'effectuer cette opération de flashage. Meme si une mise a jour se termine mal, il n'y aura pas de soucis du moment que vous avez été en mesure de commencer un flashage via TFTP.

Lorsque l'option boot_wait est activée, le routeur se place en attente d'un transfert de fichier via le protocole TFTP. Cet état d'attente est signalé par le clignotement de la LED power. Cette étape dure environ 10 secondes. Le transfert doit se faire sur l'adresse IP 192.168.1.1. Vous devez donc disposer d'une adresse de la meme plage pour atteindre le routeur pendant cette phase de démarrage. Il est très facile de faire un alias ethernet sous Linux

ifconfig eth0:1 192.168.1.2

Apres cela pour pourrez lancer un ping sur le routeur et vérifier que vous pouvez communiquer :

ping 192.168.1.1

Vous pouvez vous aider du script flash_linksys (http://www.toulouse-sans-fil.net/files/vpn/openwrt/image-builder/files/scripts/flash_linksys) disponible sur le site web. Le temps de flashage est d'environ 30 secondes. Pendant tout ce temps un témoin lumineux est visible sur le routeur : la LED power clignote. Durant cette phase, le routeur effectue une écriture en mémoire flash du contenu du fichier. Cela doit se terminer par un reboot du routeur. Au besoin on peut forcer le reboot en eteignant le routeur (sauf en procédure de mise a jour via le WEB).

Voici la procédure d'installation du firware :

cd $builddir/
./scripts/flash_linksys ./bin/tsf/openwrt-wrt54g-jffs2.bin

après le flashage

Apres flashage du firmware, votre routeur doit redémarrer avec l'adresse IP par defaut : 192.168.1.1. Un petit ping permet de le verifier. Avec telnet vous pouvez acceder à la ligne de commande. Vous pouvez mettre un mot de passe (commande passwd).

Normalement l'interface de controle via le serveur WEB est active. Avec votre navigateur allez sur l'adresse http://192.168.1.1/ ; il faut tout simplement que le packet webif soit installé conjointemement au packet haserl ce qui devrait etre le cas si vous avez suivi la procédure.

Spécialisation du firmware

Le firmware que vous avez construit n'est pas très intéressant :

  • il nécessite d'effectuer des changements dans la configuration ce qui n'est pas propice a réaliser des grandes séries.
  • ce n'est pas non plus très adapté à un public non spécialiste des commandes en ligne.

Il serait donc préférable de proceder à une auto-configuration et pré-configuration tant du firmware que des variables nvram. C'est ce que nous allons voir par la suite.

le principe

Il suffit d'intégrer dans à la racine de Image Builder un répertoire files.tsf contenant tous les fichiers de configuration que nous voulons avoir dans le firmware. Pendant la phase finale de la construction du firmware, ces fichiers seront tous intégrés ; ceux du répertoire files.tsf ayant une priorité sur les autres (ceux issus des paquets logiciels) écraseront ces derniers. C'est ce qui nous permettra de prendre le control sur le firware du routeur.

Concernant l'auto-configuration, il suffit d'intégrer au firmware un script de configuration qui sera lancé une fois et une seule au moment du premier démarrage.

téléchargement

tout d'abord, vous devez télécharger un ensemble de fichiers qui va vous servir de matrice pour la configuration de Image Builder :

cd $builddir
wget http://www.toulouse-sans-fil.net/files/vpn/openwrt/image-builder/openwrt-files.tgz
zcat openwrt-files.tgz | tar -xvf -

préconfiguation

voici les principaux fichiers que vous devez adapter ; ces fichiers doivent tenir compte de votre plan d'adressage réseau, de votre configuration réseau locale et éventuellement traiter le cas ou le routeur sans fil est relais internet ou pas.

  • files.tsf/etc/olsrd.conf.tsf
  • files.tsf/etc/dnsmasq.conf
  • files.tsf/etc/resolv.conf
  • files.tsf/home/root/rc-reconfigure

tous ces fichiers sont visibles sur ce site (http:/files/vpn/openwrt/image-builder/files/)

auto-configuration

le principe est injecter juste avant le flashage une ou plusieurs variables NVRAM de configuration du routeur. Juste après le flashage, au premier reboot, un script d'auto-configuration est activé et permet d'avoir automatiquement un routeur fonctionnel.

C'est le script rc-reconfigure (http:/files/vpn/openwrt/image-builder/files/files.tsf/home/root/rc-reconfigure) qui est en charge de cette configuration. Il est activé via le script S99done (http:/files/vpn/openwrt/image-builder/files/files.tsf/etc/init.d/S99done) lors du premier démarrage. Un argument est passé a ce script, le numéro du routeur dans le réseau maillé. Dans un réseau plus grand, ce doit être l'adresse IP qui est passée.

Une connection sur un serveur WEB peut-etre envisagée et à la manière du protocole DHCP récupère les parametres de configuration via un script qui est exécuté a la volée. Un annuaire doit être géré via une base de données.

MBK

Proposition :

  • utiliser le concept MBK (http://www.paris-sansfil.fr/~thus/mbk/mbk.php) pour generer les fichiers de configuration.


bugs connus et limitations du wrt54G

le wrt54G supporte bien le mode repeteur (wl wet 1 ou iwconfig eth1 mode repeater) par contre il supporte tres mal de configurer l'interface wifi si celle ci est incluse dans un bridge , ceci a pour effet de faire fonctionner le wifi au maximum a 1mbits/s

si vous positionnez une variable nvram wl0_txpwr=XXX (1 a 251) , la valeur que vous renverra wl txpwr sera differente de celle lue dans iwconfig . j'ai pu noter sur le terrain que lorsque l'on pousse le wrt a 250mW a l'aide de cette variable, il ne depasse pas en fait les 80 mW. il vaut mieux donc utiliser un script à part pour regler la puissance d'emission.

reglages pour optimiser les liens (longues distances notamment)

pour l'instant ce ne sont que des bribes de trucs trouves sur d'autres forums en gros , les parametres impliqués sont le short retry limit et long retry limit (srl et lrl) les parametres de congenstion window min et max (quand j'aurais pigé a quoi ca sert je l'expliquerai) sur mon wrt : cad parametres par defaut

 wl srl 7
 wl lrl 4
 wl cwmin 15
 wl cwmax 1023
 wl shortslot_override -1 (cela signifie surement automatique)

optimisations conseillées :

 wl lrl 1
 wl srl 2
 wl cwmin 1
 wl cwmax 1024
 wl shortslot_override 0
 nvram set wl0_distance=XXXXX (en metres) nvram commit && reboot

a tester : l'incidence du mode frameburst.


Test sur un lien de 6 Kms des paramètres ci-dessus => le lien décroche. Par tatonnement, les paramètres qui semblent fonctionner sont:

 wl lrl 1
 wl srl 4
 wl cwmin 1
 wl cwmax 1024
 wl shortslot_override 0

Je n'arrive pas a obtenir un debit supérieur a 2Mbits en mode WDS. Il faudrait que je teste sur un mode client/AP.