The following 963 words could not be found in the dictionary of 1275 words (including 1275 LocalSpellingWords) and are highlighted below:
0a   128k   2a   64k   99a633f6f0e7efdb14adf460c2bfe392   abbastanza   abbia   abbiamo   abbiate   accedere   accendere   action   adatto   admin   administrative   af3c467f7e61c854817f9cf6eddf1551985b8df4   agevolmente   aggiornamenti   aggiornamento   aggiornare   aggiornata   aggiornati   aggiornato   aggiungendo   aggiungeremo   aggiungergli   aggiungono   aggiuntive   aggiuntivi   aggiunto   agli   albero   alcuna   alla   Alla   almeno   altri   altrimenti   altro   ambienti   ammazzare   ancora   andare   andremo   announce   appena   applicativi   appoggia   apportare   apporterete   apprezzare   Approach   architettura   args   assicurandoci   assicuriamoci   assolutamente   assumo   at   At   ath0   Atheros   atheros   atm   attachment   attraverso   attuale   Authentication   automatizzare   automatizzati   autonomamente   autori   avanti   aver   avere   avete   avremmo   avremo   basata   based   Basic   basterà   batman   batmand   be   bel   bella   belle   berlios   Better   bin   bisogna   bisognerà   bisogno   Bla   blaxwan   blocco   boh   Boot   bridge   Build   buona   busybox   Byte   bzcat   ca   call   cambiato   caricarle   cartella   cartelle   cat   Catalan   catella   causati   cd   cercarvi   cercherà   changeset   Checked   checkout   Checkout   checksum   chiamato   chip   chmod   cifs   cioè   class   clean   co   codice   col   collaborativo   Collecting   colpo   comandabili   cominciare   coming   Common   compilabili   Compilando   Compilare   compilare   compilarli   compilarsi   compilata   compilati   compilato   compilatore   Compilazione   compilazione   Compile   compile   compiler   compileremo   compiling   completa   complete   completo   compongono   comprendere   compresa   comunità   Concurrent   conf   config   configurare   Configurare   configurato   Configure   configure   confrontando   connessione   consentirà   considerarsi   consiglio   consiste   console   contenente   contengono   Contents   contenute   contenuto   continued   contrario   control   controllarne   converrà   conviene   copia   corredare   corso   cosa   cose   cosi   costruire   così   Così   crea   creandoci   creare   creata   creato   creazione   creeremo   creiamo   Croatian   crociate   cronanca   cross   cvs   cz   Czech   D5   d5ac8329633590ed072a6b7ecccacf0b   daemon   dall   Danish   danni   dare   davvero   de   definire   definito   dell   dentro   desiderata   dettagli   dev   devo   Dicevo   didattico   differente   difficile   difficoltoso   direttamente   Disclaimer   disco   disponibili   disposizione   distr   distribuizone   distribuzione   diventa   diverse   diverso   dk   dnsmasq   dobbiamo   Document   documentazione   documents   done   doneage   doneet   dopo   dot   dotarsi   dove   dovete   dovrebbero   dovremo   dovrà   download   Download   downloads   draw   dropbear   drwxr   durante   Dutch   dyn   e25ca808fce3309d204b4444471a84bc   ecco   echo   ed   Ed   ee   effetti   ehm   elf   eliminato   eliminerà   embed   embedded   Enable   endef   Entriamo   errore   esempio   Estonian   estrarre   etc   ev1   eval   eviteremo   exit   ext2   fa   fabbblns   fabbblnx   facciamo   faccio   facto   fantastico   fare   faremo   farina   farlo   farne   farà   Feb   febbraio   fi   fianco   file   filedamodificare   files   Files   film   finalmente   Finita   finito   fino   firm   Firmware   firmware   flag   flags   flash   Fonera   Fonti   for   formattare   fornito   fortemente   forum   fr   French   frettolosi   funzioanlità   funzionante   funzionanti   g3   gateway   Gateway   general   gestione   get   gia   giusti   global   gpio   grafica   guida   Guide   gw   gz   hacking   Happy   haserl   head   Hello   help   hint   Hint   ho   hoc   home   host   hostap   hostname   hr   httpd   httpinfo   https   hu   Hungarian   hup   ieri   if   If   illustrati   image   immagine   immagini   immensamente   imparare   implementato   impostarne   Impostati   impostazioni   includa   include   includere   incolla   incollare   index   indica   indicata   infatti   informativo   init   iniziare   inizieremo   inizio   inserire   inserito   Insomma   installabili   installati   installato   instead   integrazioni   integrità   intenderci   Interface   interface   interno   intero   interpreter   interval   intuitivo   ipkg   iproute2   iptables   istruito   Italian   jffs2   Kamikaze   kamikaze   kernel   keystrokes   killall   kmod   lah   lanciare   lang   language   lasciare   Lascio   least   led   lettura   lib   libero   libpthread   libreria   librerie   libro   limitato   lineare   linee   List   lista   ln   Lo   lo   load   local   lpthread   ls   lzma   madwifi   magari   Maggio   maggior   Main   make   Makefile   makefile   mano   mantenere   Manual   marzo   md5sum   meganetwork   menu   menuconfig   mesh   metter   mettere   metterà   mezza   mi   mia   miei   milione   mini   minime   mio   mips   mk   mkdir   Mobile   mod   modifica   modificate   modificato   modifiche   Modified   modo   momento   mondo   monit   mount   msg195   mtd   multimedia   multipiattaforma   nameservice   ne   necessari   necessarie   necessario   necessitare   necessità   nei   nell   nello   net   netsukuku   Network   network   Networking   networking   nfs   niente   nl   nomefile   nongnu   Norwegian   nostra   nostre   nostri   nostro   null   nuove   nè   O0   occasione   occorrono   ogni   old   olsr   olsrd   on   only   opensource   openssl   openvpn   openwrt   opportune   opt   opzioni   ora   Original   originali   originator   ospita   ottengono   otterremo   ottima   out   Overview   ovvero   Ovviamente   ovviamente   Package   package   packages   pagine   palantir   palmare   paragrafo   parametri   parametro   parole   partire   partizioni   passaggio   passati   passi   passo   pat   patch   patches   patching   patto   peercast   perchè   perdere   pericolo   perlomeno   permessi   permette   permettono   persone   però   php   piattaforme   piccola   pigri   pl   please   png   po   poche   pochi   pochino   poi   Polish   pomeriggio   porre   portati   portatile   porteremo   Portuguese   posizioniamoci   possa   possediate   possessori   possiamo   possibilità   post   postinst   potente   poter   poterlo   potete   potranno   potrebbe   potremo   power   pratica   praticamente   precedentemente   preconfezionato   preferenze   preferiamo   preferred   premere   preparare   prepare   presente   presume   primaditutto   primo   principale   proc   procedere   procederà   procedete   processi   procurarsi   produca   produrre   progetto   programma   programmi   progress   Project   projects   pronte   pronti   proposito   propria   proprie   protocolli   protocollo   proviamo   pt   pulsante   punti   puntino   pure   pò   qemu   qualche   qualcosa   qualora   quantità   quelli   quest   Questi   questi   Qui   qui   raccogliere   ragazzi   ramdisk   rappresenta   realtà   Red   reloading   rendono   repos   repository   reset   responsabilità   restanti   restart   rev   revision   rf   riconfigurare   riesca   riga   righe   riguardo   rilevare   rimanda   ringrazia   Ringraziamenti   ringrazio   ripetizione   riportato   riporto   rischio   risolvere   rispettivamente   rispetto   risultano   rm   robette   root   router   routing   ru   rudimenti   rules   running   Russian   rw   rwxr   sacco   Sal   salvando   salvare   sappiate   savannah   sbin   scaricando   scaricare   scaricarvi   scaricato   Scatola   scelto   schemini   scoprire   scripts   scritto   scrivo   scusate   secondo   secure   segue   seguendo   seguente   selezionando   selezionare   selezionato   sembra   Semplice   semplice   semplicità   sempre   sentiremmo   senza   separato   serie   servlets   sezione   sforzi   sh   shell   show   siano   sicuramente   signal   significa   simile   simili   single   sistemi   sleep   soltanto   Soltanto   soon   sorgenti   sottocartella   sottocartelle   sottodirectory   sottomenù   source   sourcetree   sovrascrivere   Spanish   spazi   spazio   specificandolo   specify   sperimentali   sperimentare   squashfs   srv   sta   stable   standard   startare   stati   static   stato   stdint   stop   stregua   studio   sua   Subversion   subversion   successivamente   Successivamente   sufficienti   sui   suoi   supplicant   Support   support   supportato   supporto   sv   sviluppare   sviluppati   sviluppatori   svn   svnroot   Swedish   System   Table   tabs   tags   tal   tarball   target   Target   targets   tas   tbz2   team   tempo   tenebroso   tenere   testo   tgz   theme   then   through   tigris   tipo   to   To   tonnellata   tool   toolchain   tools   topic   total   traccia   traduzione   trarre   tratta   tree   troppi   trovate   troveremo   troverà   true   trunk   tun   tutorial   uci   ufficiale   ulteriori   ultima   ultime   ultimi   Ultimo   ultimo   uname   unexpand   up   update   usa   usarsi   usate   uscire   user   users   using   uso   usr   utile   utilities   Utilities   utility   utilità   utilizzarla   utilizzarle   utilizzata   utilizzo   utils   vari   variano   varie   vedendo   vedere   Vediamone   vedremo   veloce   venga   venire   versioni   Versioning   versioning   vi   via   vim   visto   visualisation   visualizzare   vivamente   vmlinux   voce   voci   voglia   vogliamo   Volendo   volessimo   volete   volo   vostri   vostro   Wall   webif   wireless   with   wlan   Work   World   wpa   wrapper   Wrt   wrt   wx200d   x86   xr   Xwan   xwrt   Zephyr   zephyr   zlib   zlib11nvantantrelay  

Clear message
Italiano English
Edit History Actions

OpenWRTCompile

''' LE INFORMAZIONI CONTENUTE IN QUESTA PAGINA SONO OBSOLETE ''' - CONSULTARE FirmwareNinux

...::: Compilare OpenWRT :::...
a cura di BlaXwan

Ultimo aggiornamento: 11/04/2007 13:02
(le immagini Kamikaze per Fonera belle e pronte le trovate al paragrafo "Il risultato")

WORK IN PROGRESS!!!



1. Disclaimer

Il presente tutorial rappresenta un'occasione di studio per imparare a compilare delle immagini di firmware linux-based per router wireless e per iniziare a scoprire il mondo di linux embedded e del cross-compiling.

Le informazioni contenute in questo tutorial, non sono tutte farina del mio sacco. Per la maggior parte mi sono limitato a raccogliere le informazioni disponibili su Internet per preparare un'immagine OpenWrt. Il tutorial (come tutti) è ancora da considerarsi Work in progress, quindi verrà aggiornato man mano con nuove informazioni/integrazioni.

Questo tutorial è da considerarsi a solo scopo informativo e ogni tipo di modifica che apporterete ai vostri router sono a vostro rischio, pericolo e responsabilità. Così come gli autori originali delle informazioni che qui riporto e ringrazio, non mi assumo alcuna responsabilità riguardo a danni causati a cose e persone per quanto riportato in queste pagine.

Prima di iniziare devo specificare che al fine di trarre qualche utilità da questo tutorial si presume ovviamente che sappiate utilizzare abbastanza agevolmente linux, che siano passati qualche milione di keystrokes dalla volta che avete compilato il primo "Hello World!" e che abbiate un router sul quale poter sperimentare senza troppi danni. In caso contrario consiglio vivamente di post-porre la lettura a qualche buona guida sui rudimenti di linux e della compilazione in ambienti opensource.

Happy hacking!

...::..:::BlaXwan:::..::...

8 febbraio 2007

2. Overview

Tra le cose che rendono fantastico il mondo dell'opensource c'è sicuramente la possibilità di compilarsi autonomamente e secondo le proprie preferenze gli applicativi di cui si ha bisogno. Una volta che ci si è compilati tutto lo GNU Linux del proprio PC, magari pure una versione mini per il palmare, che vogliamo lasciare un firmware preconfezionato sul nostro router wireless? Ovviamente no, non lo sentiremmo abbastanza "nostro"! Ed ecco che ci viene in aiuto OpenWrt. Si tratta di una distr...ehm cioè un firm...no, ehm una serie di pat...boh! In realtà con OpenWrt si possono compilare al volo e con pochi sforzi delle immagini complete di firmware per diverse piattaforme, che possono includere praticamente tutti gli applicativi e utility di cui si può aver bisogno. Ma in realtà OpenWrt non si può definire un firmware e una distribuzione. In pratica OpenWrt consiste in una serie di Makefile, script e patch che permettono di automatizzare il download, il patching e la compilazione di un'immagine linux embedded a partire dai sorgenti originali linux. Come vedremo nel tutorial questi processi sono del tutto automatizzati in OpenWrt, dalla compilazione del cross-compiler (compilatore multipiattaforma), al patching e compilazione del kernel linux standard, fino alla creazione di un'immagine jffs2, squashfs, ext2, ramdisk o .tgz contenente il sistema operativo completo. Insomma, niente di più adatto per cominciare! Nel corso del tutorial vedremo come scaricare e tenere aggiornati gli ultimi sorgenti di OpenWrt, dei pacchetti portati sotto OpenWrt e di X-Wrt che è un'interfaccia grafica HTTP per la configurazione dei sistemi OpenWrt. In seguito vedremo le opzioni minime per configurare il source tree (albero dei sorgenti) in modo da produrre un'immagine di firmware funzionante, e come compilare finalmente il nostro firmware.

3. Download e update via SVN

Ovviamente, il primo passo è procurarsi i sorgenti di OpenWrt. A tal proposito inizieremo creandoci una bella cartella in cui mettere tutte le robette che ci occorrono, assicurandoci di avere almeno 2 GByte di spazio libero su disco. In questo esempio creeremo una cartella OpenWrtCompile nella nostra home:

blaxwan@fabbblnx ~ $ mkdir OpenWrtCompile
blaxwan@fabbblnx ~ $ cd OpenWrtCompile

Il team di sviluppo di OpenWrt usa Subversion (SVN) come piattaforma di versioning. Si tratta di una piattaforma molto potente, più semplice da usarsi rispetto al precedente standard-de-facto CVS (Concurrent Versioning System), per lo sviluppo collaborativo attraverso una rete. Consente di mantenere traccia degli aggiornamenti e delle versioni di ogni porzione di codice modificato dai vari sviluppatori in modo molto intuitivo e veloce. Per questo, quindi, se non lo si ha già a disposizione, bisognerà procurarsi SVN per il download dei sorgenti di OpenWrt. Le modalità, ovviamente, variano a seconda della distribuizone utilizzata sul portatile così come per l'installazione di qualsiasi altro programma. Una volta che avremo a disposizione SVN, ci porteremo nella directory creata precedentemente per scaricarvi il codice OpenWrt tramite il comando svn co (svn checkout):

blaxwan@fabbblnx ~/OpenWrtCompile $ svn co https://svn.openwrt.org/openwrt/trunk/  
..................................
...download di tutti i sorgenti...
..................................
A    trunk/package/linux-atm/patches/400-stdint_local_instead_of_host.patch
A    trunk/package/linux-atm/Makefile
A    trunk/Makefile
A    trunk/README
 U   trunk
Checked out revision 6261.
blaxwan@fabbblnx ~/OpenWrtCompile $

Alla fine del processo SVN quindi avrà scaricato l'ultima versione (6261 nell'esempio) del source tree di OpenWrt. A questo punto possiamo procedere nello stesso modo per scaricare anche i pacchetti aggiuntivi:

blaxwan@fabbblnx ~/OpenWrtCompile $ svn co https://svn.openwrt.org/openwrt/packages 
..................................
...download di tutti i sorgenti...
..................................
A    packages/multimedia/peercast/Makefile
A    packages/multimedia/palantir
A    packages/multimedia/palantir/patches
A    packages/multimedia/palantir/patches/01-opt_flags.patch
A    packages/multimedia/palantir/Makefile
Checked out revision 6261.
blaxwan@fabbblnx ~/OpenWrtCompile $               

Fatto questo, nella nostra cartella di lavoro avremo due sottocartelle che contengono, rispettivamente, i sorgenti SVN del trunk OpenWrt e dei suoi pacchetti.

blaxwan@fabbblnx ~/OpenWrtCompile $ ls -l
total 8
drwxr-xr-x 11 blaxwan users 4096 Feb  3 09:33 packages
drwxr-xr-x 10 blaxwan users 4096 Feb  3 09:32 trunk

Il sourcetree principale di OpenWrt, che a questo punto si troverà nella sottodirectory ~/OpenWrtCompile/trunk della nostra directory di lavoro, cercherà nella sua directory ~/OpenWrtCompile/trunk/packages/ i pacchetti compilabili, per questo conviene creare dei link all'interno di questa cartella che puntino ai pacchetti aggiuntivi scaricati invece nella cartella ~/OpenWrtCompile/packages/:

blaxwan@fabbblns ~/ $ cd ~/OpenWrtCompile/trunk/package
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package $ ln -sv ../../packages/*/* .
........
`./monit' -> `../../packages/admin/monit'
........
........
`./vim' -> `../../packages/utils/vim'
`./wx200d' -> `../../packages/utils/wx200d'
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package $     

Fatto questo, possiamo procedere a scaricare anche i sorgenti di X-Wrt che è un progetto separato da OpenWrt e per questo si appoggia ad un repository SVN differente:

blaxwan@fabbblnx ~/ $ cd ~/OpenWrtCompile/trunk/package
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package $ svn co http://svn.berlios.de/svnroot/repos/xwrt/kamikaze/package/webif
.............
.............
.............
A    webif/ipkg/webif-lang-ca.control
A    webif/ipkg/webif.control
A    webif/ipkg/webif-lang-ru.control
A    webif/ipkg/webif.postinst
A    webif/Makefile
Checked out revision 2444.
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package $    

A questo punto, nella nostra cartella ~/OpenWrtCompile avremo le ultime versioni (nell'esempio 6224, 6224 e 2444) rispettivamente di OpenWrt, dei suoi pacchetti aggiuntivi e di X-Wrt. Successivamente, qualora volessimo aggiornare in un solo colpo tutti questi sorgenti basterà soltanto:

blaxwan@fabbblnx ~/OpenWrtCompile $ svn up trunk packages trunk/package/webif
At revision 6261.
At revision 6261.
At revision 2444.
blaxwan@fabbblnx ~/OpenWrtCompile $   

Per la cronanca, la "A" di fianco al nome del file significa "Added", e si tratta quindi di un file aggiunto nella versione che si sta scaricando, una "M" significa "Modified" e si tratta di una versione aggiornata dello stesso file mentre invece una "D" significa che il file è stato eliminato nella nuova versione e per questo SVN lo eliminerà anche dal nostro disco. Per ulteriori informazioni su SVN si rimanda all'ottima documentazione ufficiale. Soltanto vedendo la quantità di sorgenti scaricati da SVN in questa fase possiamo comprendere immediatamente quanto utile e potente possa essere un sistema di versioning ed apprezzare la semplicità di utilizzo di SVN!

3.1. Checkout SVN dello stable tree

cd ~
mkdir OpenWrtCompile
cd OpenWrtCompile
svn co https://svn.openwrt.org/openwrt/tags/kamikaze_7.09/
svn co https://svn.openwrt.org/openwrt/packages
cd kamikaze_7.09/package/
ln -sv ../../packages/*/* .
svn co http://svn.berlios.de/svnroot/repos/xwrt/tags/kamikaze_7.09/package/webif/

4. Configurare il source tree

A questo punto avremo la nostra bella mezza tonnellata di patch e script che compongono OpenWrt; è il momento di configurare il nostro source tree tramite make menuconfig che ci farà accedere ad una utility di configurazione molto simile a quella che si utilizza per configurare il source tree del kernel di linux:

blaxwan@fabbblnx ~/OpenWrtCompile $ cd trunk
blaxwan@fabbblnx ~/OpenWrtCompile/trunk $ make menuconfig   

menuconfig.png

In questa utility dovremo fare qualche modifica per configurare il sourcetree in modo da avere un'immagine di firmware che sia primaditutto compilata per la nostra piattaforma router, e che abbia poi perlomeno i tool di base per iniziare ad utilizzarla, compresa l'interfaccia grafica X-Wrt. Nella lista che segue si fa riferimento ad un firmware da compilare per una Fonera che è basata sul SOC (System on a chip) Atheros, nel caso possediate un router diverso, quella riga è la riga dove specificare la piattaforma di cui si dispone, le restanti impostazioni dovrebbero essere sufficienti per ogni router supportato in OpenWrt (possessori di altri router: please help!):

UPDATE 19 Maggio 2007 -> Il menu è un pochino cambiato nella versione dell'SVN attuale, quindi rispetto agli schemini qui sotto dovete andare a cercarvi un po le cose, che però ci sono tutte ;)

Target System (Atheros [2.6])  ---> 
Base System --->
        busybox --->
                Configuration --->
                        Networking utilities --->
                        [*] hostname
                        [*] httpd
                        [*]   Support reloading the global config file using hup signal
                        [*]   Enable -u <user> option
                        [*]   Enable Basic http Authentication     
                        [*]   Support Common Gateway Interface (CGI)
                        [*]     Enable support for running scripts through an interpreter 
                        
Network --->
        webif --->
                <*> webif........................ An HTTP administrative console for OpenWrt.
                < > webif-lang-ca........................... Catalan language file for webif.
                < > webif-lang-cz............................. Czech language file for webif.
                < > webif-lang-de............................ German language file for webif.
                < > webif-lang-dk............................ Danish language file for webif.   
                < > webif-lang-ee.......................... Estonian language file for webif.
                < > webif-lang-es........................... Spanish language file for webif.
                < > webif-lang-fr............................ French language file for webif.
                < > webif-lang-hr.......................... Croatian language file for webif.
                < > webif-lang-hu......................... Hungarian language file for webif.
                <*> webif-lang-it.......................... wItalian language file for webif.
                < > webif-lang-nl............................. Dutch language file for webif.
                < > webif-lang-no......................... Norwegian language file for webif.
                < > webif-lang-pl............................ Polish language file for webif.
                < > webif-lang-pt........................ Portuguese language file for webif.
                < > webif-lang-ru........................... Russian language file for webif.
                < > webif-lang-se........................... Swedish language file for webif.
                <*> webif-theme-xwrt............................. Original theme for webif^2.
                <*> webif-theme-zephyr............................. Zephyr theme for webif^2.
Utilities --->
                --- haserl............ A CGI wrapper to embed shell scripts in HTML documents

In questa utility, selezionando una voce (<*>) faremo in modo da includere il pacchetto relativo nell'immagine che andremo a creare, selezionando con "M" la stessa voce (<M>) faremo in modo che la compilazione non includa il pacchetto nell'immagine ma ne produca il pacchetto ipkg per poterlo installare successivamente nel router.

Impostati questi pochi flag potremo quindi uscire salvando la configurazione eseguita. A questo punto i nostri sorgenti sono pronti per essere compilati.

5. Files di configurazione

Se volete inserire/sovrascrivere files nell'immagine da creare procedete cosi

cd ~/OpenWrtCompile
mkdir -p kamikaze_7.09/files/etc
vi kamikaze_7.09/files/etc/filedamodificare.conf

Se avete gia compilato modificate i files e solo

make

vi crea le nuove immagini con le modifiche che avete fatto ai files, in pratica non c'è bisogno di perdere tempo col make clean

6. Compilazione

La prima volta che compileremo OpenWrt converrà dotarsi di un libro, un film, parole crociate o quanto altro preferiamo per ammazzare un di tempo. Alla prima compilazione infatti OpenWrt procederà prima a compilare la propria toolchain ovvero l'insieme di compilatore, librerie necessarie per la compilazione (scusate la ripetizione...) e utility varie come ad esempio i programmi necessari a costruire l'immagine del firmware. Oltre questo, alla prima compilazione OpenWrt dovrà anche scaricare i sorgenti dei vari programmi che dovrà compilare per il nostro router. Per questo assicuriamoci di avere la connessione ad Internet disponibile anche durante la compilazione. L'intero processo si completa con il semplice comando "make" e un di tempo:

blaxwan@fabbblnx ~/OpenWrtCompile/trunk $ make
Collecting package info: doneage/zlib11nvantantrelay
Collecting target info: doneet/linux/x86-2.62.6.6
 make[2] tools/install
 make[3] -C tools install
 make[4] -C tools install-targets
 make[2] toolchain/install
 make[3] -C toolchain install
 make[2] target/compile
 make[3] -C target compile
 make[4] -C target/linux prepare
 make[5] -C target/linux/atheros-2.6 prepare
 make[4] -C target/linux compile
 make[5] -C target/linux/atheros-2.6 compile
 make[4] -C target/linux/atheros-2.6/image compile
 make[2] package/compile
 make[3] -C package compile
 make[4] -C package compile-targets
 make[5] -C package/base-files compile
 make[5] -C package/bridge compile
 make[5] -C package/busybox compile
 make[5] -C package/dnsmasq compile
 make[5] -C package/dropbear compile
 make[5] -C package/haserl compile
 make[5] -C package/iproute2 compile
 make[5] -C package/iptables compile
 make[5] -C package/kernel compile
 make[5] -C package/wireless-tools compile
 make[5] -C package/madwifi compile
 make[5] -C package/zlib compile
 make[5] -C package/openssl compile
 make[5] -C package/mtd compile
 make[5] -C package/webif compile
 make[2] package/install
 make[3] -C package install
 make[4] -C package install-targets
 make[5] -C package/base-files install
 make[5] -C package/bridge install
 make[5] -C package/busybox install
 make[5] -C package/dnsmasq install
 make[5] -C package/dropbear install
 make[5] -C package/haserl install
 make[5] -C package/iproute2 install
 make[5] -C package/iptables install
 make[5] -C package/kernel install
 make[5] -C package/madwifi install
 make[5] -C package/openssl install
 make[5] -C package/mtd install
 make[5] -C package/webif install
 make[5] -C package/wireless-tools install
 make[5] -C package/wpa_supplicant install
 make[5] -C package/zlib install
 make[2] target/install
 make[3] -C target install
 make[4] -C target/linux/atheros-2.6/image clean
 make[4] -C target/linux prepare
 make[5] -C target/linux/atheros-2.6 prepare
 make[4] -C target/linux compile
 make[5] -C target/linux/atheros-2.6 compile
 make[4] -C target/linux install
 make[5] -C target/linux/atheros-2.6 install
 make[4] -C target/linux/atheros-2.6/image compile
 make[4] -C target/linux/atheros-2.6/image install
 make[2] package/index
 make[3] -C package index
blaxwan@fabbblnx ~/OpenWrtCompile/trunk $

7. Il risultato

Finita la compilazione la nostra immagine si troverà nella sottocartella bin (l'esempio fa sempre riferimento ad un'immagine jffs2 compilata per La Fonera):

blaxwan@fabbblnx ~/OpenWrtCompile/trunk/bin $ ls -lah
total 27M
drwxr-xr-x  3 blaxwan users 4.0K Feb  3 09:09 .
drwxr-xr-x 17 blaxwan users 4.0K Feb  8 22:03 ..
-rw-r--r--  1 blaxwan users  16M Feb  3 09:09 openwrt-atheros-2.6-root.ext2
-rw-r--r--  1 blaxwan users 3.0M Feb  3 09:09 openwrt-atheros-2.6-root.jffs2-128k
-rw-r--r--  1 blaxwan users 2.9M Feb  3 09:09 openwrt-atheros-2.6-root.jffs2-64k
-rwxr-xr-x  1 blaxwan users 2.9M Feb  3 09:09 openwrt-atheros-2.6-vmlinux.elf
-rw-r--r--  1 blaxwan users 1.0M Feb  3 09:09 openwrt-atheros-2.6-vmlinux.gz
-rw-r--r--  1 blaxwan users 704K Feb  3 09:09 openwrt-atheros-2.6-vmlinux.lzma
drwxr-xr-x  2 blaxwan users 4.0K Feb  3 09:13 packages
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/bin $

Quindi, a seconda anche del tipo di immagine scelto, avremo l'immagine di un kernel (openwrt-atheros-2.6-vmlinux.lzma), l'immagine della root del sistema (openwrt-atheros-2.6-root.jffs2-64k) e una cartella (packages) con i pacchetti ipkg installabili successivamente. Per utilizzare questi pacchetti sarà sufficiente startare un web server che punti alla cartella "packages" ed impostarne il link relativo nella repository di ipkg del router, specificandolo nel file /etc/ipkg.conf .

I più pigri o frettolosi potranno utilizzare direttamente il risultato della mia compilazione scaricando questi due files:

Si tratta di OpenWrt Kamikaze (rev. 6935) con:

  • hostap, wpa-supplicant, openvpn, supporto cifs e nfs
  • WebIf (rev. 3118)

  • olsrd 5.0 con mod dot-draw, dyn-gw, httpinfo, nameservice, power, secure, mod-tas
  • batman-III 0.2a
  • kmod-gpio (proc_gpio), modulo sperimentale che permette di avere le linee gpio comandabili sotto /proc/gpio (utile per accendere il led della wlan o rilevare il pulsante di reset della Fonera)

Ovviamente, non mi assumo alcuna responsabilità per l'uso di questi files.

Per installare le immagini che si ottengono dalla compilazione (o dal download) basterà caricarle da RedBoot ed utilizzarle per sovrascrivere le relative partizioni della flash, i passi necessari sono illustrati anche in questo tutorial, ovviamente eviteremo di formattare prima la flash.

8. Aggiungere altri pacchetti

A questo punto ci potrebbe anche venire la voglia di metter dentro qualcosa in più alle nostre belle immagini Kamikaze. Aggiungere pacchetti in OpenWrt è davvero molto semplice a patto che si riesca a compilarli per l'architettura desiderata al primo colpo, altrimenti il tutto diventa un più difficile per la necessità di apportare qualche modifica ai sorgenti e creare le opportune patch.

8.1. B.A.T.M.A.N.

AGGIORNAMENTO: questi miei files per aggiungere batman alle immagini Kamikaze sono stati appena inseriti nel tree ufficiale di Kamikaze, per questo, seguendo questo tutorial dopo il 18 marzo 2007, non c'è più bisogno di inserire a mano il pacchetto. Lascio comunque queste istruzioni a scopo didattico.

Come primo esempio aggiungeremo al nostro trunk il pacchetto batman che ci metterà a disposizione il daemon per il protocollo B.A.T.M.A.N.
Entriamo nella nostra directory trunk/package/ e creiamo la cartella "batman":

blaxwan@fabbblnx ~/ $ cd ~/OpenWrtCompile/trunk/package
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package $ mkdir batman
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package $ cd batman
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman $

Nella cartella batman creiamo il Makefile con il contenuto seguente:

#
# Copyright (C) 2006 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

include $(TOPDIR)/rules.mk

PKG_NAME:=batman-III
PKG_VERSION:=0.2.0a
PKG_RELEASE:=1

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tbz2
PKG_SOURCE_URL:=http://downloads.open-mesh.net/batman
PKG_MD5SUM:=d5ac8329633590ed072a6b7ecccacf0b
PKG_CAT:=bzcat

PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install

include $(INCLUDE_DIR)/package.mk

define Package/batman
  SECTION:=net
  CATEGORY:=Network
  DEPENDS:=+libpthread +kmod-tun
  TITLE:=B.A.T.M.A.N. Better Approach To Mobile Ad-hoc Networking
  URL:=https://www.open-mesh.net/
endef

define Build/Configure
endef

define Build/Compile
        rm -rf $(PKG_INSTALL_DIR)
        mkdir -p $(PKG_INSTALL_DIR)
        $(MAKE) -C "$(PKG_BUILD_DIR)" \
                $(TARGET_CONFIGURE_OPTS) \
                NODEBUG=1 \
                OFLAGS="$(TARGET_CFLAGS)" \
                OS="linux" \
                INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
                STRIP="/bin/true" \
                batmand install
endef

define Package/batman/install
        $(INSTALL_DIR) $(1)/usr/sbin
        $(CP) $(PKG_INSTALL_DIR)/usr/sbin/batmand $(1)/usr/sbin/
endef


$(eval $(call BuildPackage,batman))

Se usate direttamente vim o simili da shell, il copia & incolla sarà un difficoltoso per via della traduzione da tabs a spazi. Per risolvere potete dare unexpand --first-only - | cat > nomefile incollare il testo, premere ENTER e poi premere CTRL-D per salvare il file.

Il Makefile che abbiamo appena creato sembra lungo e tenebroso ma in realtà è assolutamente lineare. Vediamone qualche passaggio:

PKG_NAME:=batman-III
PKG_VERSION:=0.2.0a
PKG_RELEASE:=1

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tbz2
PKG_SOURCE_URL:=http://downloads.open-mesh.net/batman
PKG_MD5SUM:=d5ac8329633590ed072a6b7ecccacf0b
PKG_CAT:=bzcat

Con queste poche righe abbiamo istruito il sistema di compilazione di OpenWrt a:

  • scaricare il pacchetto PKG_SOURCE (batman-III-0.2.0a.tbz2) dall'indirizzo PKG_SOURCE_URL (http://downloads.open-mesh.net/batman)

  • controllarne l'integrità confrontando il suo checksum con quello fornito in PKG_MD5SUM
  • estrarre il contenuto del pacchetto con bzcat

Semplice, no?

define Package/batman
  SECTION:=net
  CATEGORY:=Network
  DEPENDS:=+libpthread +kmod-tun
  TITLE:=B.A.T.M.A.N. Better Approach To Mobile Ad-hoc Networking
  URL:=https://www.open-mesh.net/
endef

Qui invece abbiamo specificato i dettagli del pacchetto, quelli che poi vedremo nei menu dell'utility di configurazione del source tree (il make menuconfig per intenderci). Il parametro DEPENDS indica che per poter vedere la voce batman è necessario aver già selezionato libpthread e kmod-tun.

define Build/Configure
endef

define Build/Compile
        rm -rf $(PKG_INSTALL_DIR)
        mkdir -p $(PKG_INSTALL_DIR)
        $(MAKE) -C "$(PKG_BUILD_DIR)" \
                $(TARGET_CONFIGURE_OPTS) \
                NODEBUG=1 \
                OFLAGS="$(TARGET_CFLAGS)" \
                OS="linux" \
                INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
                STRIP="/bin/true" \
                batmand install
endef

Qui invece abbiamo definito come il pacchetto deve essere configurato e compilato. La versione indicata di batman non prevede configurazione, altrimenti avremmo inserito un bel configure. Nella compilazione abbiamo inserito anche un "batman install", vedremo più avanti il perchè

define Package/batman/install
        $(INSTALL_DIR) $(1)/usr/sbin
        $(CP) $(PKG_INSTALL_DIR)/usr/sbin/batmand $(1)/usr/sbin/
endef

In quest'ultimo blocco abbiamo invece specificato cosa bisogna fare per installare il pacchetto. Se proviamo a compilare dopo aver aggiunto il solo Makefile otterremo un errore. In effetti è da aggiungere una piccola patch che modifica il Makefile di batman (del pacchetto, non il Makefile che abbiamo appena scritto) per aggiungergli la funzioanlità di "install" che abbiamo chiamato alla fine del Build/Compile inserito nel Makefile precedente. Quindi posizioniamoci nella cartella package/batman e creiamo una cartella patches:

blaxwan@fabbblnx ~/ $ cd ~/OpenWrtCompile/trunk/package/batman
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman $ mkdir patches
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman $ cd patches
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman/patches $ 

In questa cartella creiamo il file "001-makefile.patch" con il contenuto seguente:

--- batman-III-0.2.0a.old/Makefile      2007-02-28 15:41:11.000000000 +0100
+++ batman-III-0.2.0a/Makefile  2007-02-28 15:42:02.000000000 +0100
@@ -27,6 +27,7 @@
 CFLAGS =               -Wall -O0 -g3
 LDFLAGS =              -lpthread
 #LDFLAGS =             -static -lpthread
+SBINDIR =      $(INSTALL_PREFIX)/usr/sbin

 UNAME=$(shell uname)

@@ -67,3 +68,7 @@

 clean:
                rm -f batmand batmand-mips* *.o *~
+
+install:
+               mkdir -p $(SBINDIR)
+               install -m 755 batmand $(SBINDIR)

In questo modo la compilazione di batman stesso farà si che il daemon "batmand" venga installato nella cartella "/usr/sbin" con i giusti permessi. A questo punto potremo riconfigurare il source tree selezionando anche batman, ovviamente per poter avere questa voce tra le opzioni di "Network" dovremo prima selezionare la libreria libpthread e il modulo kernel kmod_tun.
Volendo, possiamo "corredare" il pacchetto batman anche di un file di configurazione ed uno script di start stop. Per farlo, creiamo la cartella "files" in "package/batman/", dentro questa creiamo la cartella "etc" e, dentro questa, creiamo le cartelle "config" e "init.d":

blaxwan@fabbblnx ~/ $ cd ~/OpenWrtCompile/trunk/package/batman
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman $ mkdir files
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman $ cd files
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman/files $ mkdir etc
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman/files $ mkdir etc/config
blaxwan@fabbblnx ~/OpenWrtCompile/trunk/package/batman/files $ mkdir etc/init.d

Fatto questo, creiamo nella cartella "batman/files/etc/config/" un file dal nome "batman" con il seguente contenuto:

config batman general
        option interface                ath0
        option announce
        option gateway_class
        option originator_interval
        option preferred_gateway
        option routing_class
        option visualisation_srv

E, nella cartella "batman/files/etc/init.d/" un file dal nome "batman" con il seguente contenuto:

START=100
. /lib/config/uci.sh
uci_load batman
start () {
        interface=$(uci get batman.general.interface)
        if [ "$interface" = "" ]; then
                echo $1 Error, you must specify at least a network interface
                exit
        fi
        announce=$(uci get batman.general.announce)
        gateway_class=$(uci get batman.general.gateway_class)
        originator_interval=$(uci get batman.general.originator_interval)
        preferred_gateway=$(uci get batman.general.preferred_gateway)
        routing_class=$(uci get batman.general.routing_class)
        visualisation_srv=$(uci get batman.general.visualisation_srv)
        batman_args=""

        if [ $announce ]; then
                batman_args=${batman_args}'-a '$announce' '
        fi

        if [ $gateway_class ]; then
                batman_args=${batman_args}'-g '$gateway_class' '
        fi

        if [ $originator_interval ]; then
                batman_args=${batman_args}'-o '$originator_interval' '
        fi

        if [ $preferred_gateway ]; then
                batman_args=${batman_args}'-p '$preferred_gateway' '
        fi

        if [ $routing_class ]; then
                batman_args=${batman_args}'-r '$routing_class' '
        fi

        if [ $visualisation_srv ]; then
                batman_args=${batman_args}'-v '$visualisation_srv' '
        fi

        batman_args=${batman_args}$interface
        batmand $batman_args >/dev/null 2>&1
}

restart () {
        $0 stop
        sleep 3
        $0 start
}

stop () {
        killall batmand
}

A questo punto, il nostro "batman" avrà anche uno script di start-stop ed un file di configurazione, dobbiamo solo includere questi file nel pacchetto. Lo facciamo aggiungendo due linee alla fine del file "package/batman/Makefile" creato all'inizio, all'interno della sezione "Package/batman/install":

define Package/batman/install
        $(INSTALL_DIR) $(1)/usr/sbin
        $(CP) $(PKG_INSTALL_DIR)/usr/sbin/batmand $(1)/usr/sbin/
        $(CP) -a ./files/* $(1)/
        chmod -R 755 $(1)/etc/init.d/batman
endef

Compilando con queste modifiche avremo quindi un pacchetto batman completo, con il suo script di start-stop.

8.2. X-Wrt-mesh

Ovviamente potremo necessitare di aggiungere un pacchetto che non sia disponibile come tarball di sorgenti, ma, come visto per X-Wrt, sia disponibile tramite un sistema di versioning. In quest'altro esempio, alla stregua di X-Wrt descritto all'inizio del tutorial, aggiungeremo altri pacchetti da svn (fortemente sperimentali) che aggiungono a X-Wrt la possibilità di visualizzare e configurare i parametri dei protocolli di mesh networking installati nel sistema. Si tratta dei pacchetti (per ora):

  • webif-mesh (pacchetto base)
  • webif-olsr (gestione protocollo olsr)
  • webif-batman (gestione protocollo batman)
  • webif-netsukuku (al momento non implementato, consentirà la gestione protocollo netsukuku)

Questi pacchetti sono sviluppati dai ragazzi di [www.meganetwork.org meganetwork.org] (di cui faccio parte). Dicevo che si tratta di pacchetti fortemente sperimentali infatti alla data in cui scrivo (18 marzo) risultano funzionanti solo webif-mesh e webif-batman che ho finito di sviluppare proprio ieri pomeriggio. Per aggiungere questi pacchetti quindi basterà farne il checkout svn dalla nostra catella trunk/package:

blaxwan@fabbblnx ~/ $ cd ~/OpenWrtCompile/trunk/package
blaxwan@fabbblnx ~/package $ svn co http://www.meganetwork.org/svn/trunk/package/webif-mesh
blaxwan@fabbblnx ~/package $ svn co http://www.meganetwork.org/svn/trunk/package/webif-olsr
blaxwan@fabbblnx ~/package $ svn co http://www.meganetwork.org/svn/trunk/package/webif-batman
blaxwan@fabbblnx ~/package $ svn co http://www.meganetwork.org/svn/trunk/package/webif-netsukuku

A questo punto ci basterà lanciare un make menuconfig dalla cartella trunk e, nel sottomenù webif troveremo le voci aggiuntive di webif-mesh che potremo quindi selezionare per compilare ed includere nella nostra immagine Kamikaze.

9. Hint per lo sviluppo

to be done

  • mount cifs
  • compile single package
  • cross compile
  • qemu

...coming soon...


10. Fonti

11. Ringraziamenti

Si ringrazia immensamente:

  • la comunità ninux.org (di cui faccio parte) che ospita questo tutorial

  • Sal per le hint sul toolchain di OpenWrt

  • la comunità di sviluppo di OpenWrt

  • la comunità di sviluppo di X-Wrt


(BlaXwan) to be continued...