Italiano English
Modifica History Actions

Differenze per "OpenWRTCompile"

Differenze tra le versioni 1 e 22 (in 21 versioni)
Versione 1 del 2007-02-05 11:18:55
Dimensione: 564
Autore: blaxwan
Commento:
Versione 22 del 2007-03-04 17:09:47
Dimensione: 19899
Autore: blaxwan
Commento:
Le cancellazioni sono segnalate in questo modo. Le aggiunte sono segnalate in questo modo.
Linea 12: Linea 12:
Ultimo aggiornamento: 05/02/2007 12:14 Ultimo aggiornamento: 01/03/2007 19:10

'''WORK IN PROGRESS!!!'''
Linea 19: Linea 20:


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 [http://openwrt.org 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

Linea 20: Linea 38:

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 [http://openwrt.org 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 nè un firmware e nè 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.


Linea 21: Linea 47:

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 [http://subversion.tigris.org/ Subversion] (SVN) come piattaforma di versioning. Si tratta di una piattaforma molto potente, più semplice da usarsi rispetto al precedente standard-de-facto [http://savannah.nongnu.org/projects/cvs/ 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 [http://subversion.tigris.org/servlets/ProjectDocumentList 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!

Linea 22: Linea 141:

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
}}}

attachment: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!):

{{{
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.

Linea 23: Linea 198:
= Ed ora? =
La prima volta che compileremo !OpenWrt converrà dotarsi di un libro, un film, parole crociate o quanto altro preferiamo per ammazzare un pò 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 pò 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 $
}}}


= 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:
 * attachment:openwrt-atheros-2.6-root.jffs2-64k (md5sum 1c4ff56b19ee6823785502c4b36d44a3 )
 * attachment:openwrt-atheros-2.6-vmlinux.lzma (md5sum 2b219b6e9db3bc2999aa2a8d0a7f8b0d )
Si tratta di !OpenWrt Kamikaze (rev. 6447) con:
 * hostap, wpa-supplicant, openvpn, supporto cifs e nfs
 * !WebIf (rev. 2765)
 * olsrd 4.10-1 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 [http://wiki.ninux.org/moin.cgi/LaFoneraDallaScatolaAOpenWrt?action=show#head-af3c467f7e61c854817f9cf6eddf1551985b8df4 questo tutorial], ovviamente eviteremo di formattare prima la flash.
Linea 25: Linea 307:

...coming soon...
Linea 27: Linea 312:
 * [http://forum.x-wrt.org/index.php/topic,52.msg195.html#msg195 Guide to compiling kamikaze with the webif]
 * [http://wiki.openwrt.org/ OpenWrt Manual]
 * [http://wiki.x-wrt.org/index.php/Main_Page Wiki di X-Wrt]
Linea 28: Linea 317:

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 [http://openwrt.org OpenWrt]
 * la comunità di sviluppo di [http://www.x-wrt.org/ X-Wrt]

----

(BlaXwan) to be continued...

...::: Compilare OpenWRT :::... BR a cura di BlaXwanBR

Ultimo aggiornamento: 01/03/2007 19:10

WORK IN PROGRESS!!!


TableOfContents


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 [http://openwrt.org 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 [http://openwrt.org 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 nè un firmware e nè 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 [http://subversion.tigris.org/ Subversion] (SVN) come piattaforma di versioning. Si tratta di una piattaforma molto potente, più semplice da usarsi rispetto al precedente standard-de-facto [http://savannah.nongnu.org/projects/cvs/ 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 [http://subversion.tigris.org/servlets/ProjectDocumentList 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!

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   

attachment: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!):

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. Compilazione

La prima volta che compileremo OpenWrt converrà dotarsi di un libro, un film, parole crociate o quanto altro preferiamo per ammazzare un pò 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 pò 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 $

6. 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:

  • attachment:openwrt-atheros-2.6-root.jffs2-64k (md5sum 1c4ff56b19ee6823785502c4b36d44a3 )
  • attachment:openwrt-atheros-2.6-vmlinux.lzma (md5sum 2b219b6e9db3bc2999aa2a8d0a7f8b0d )

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

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

  • olsrd 4.10-1 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 [http://wiki.ninux.org/moin.cgi/LaFoneraDallaScatolaAOpenWrt?action=show#head-af3c467f7e61c854817f9cf6eddf1551985b8df4 questo tutorial], ovviamente eviteremo di formattare prima la flash.

7. Hint per lo sviluppo

...coming soon...


8. Fonti

9. Ringraziamenti

Si ringrazia immensamente:


(BlaXwan) to be continued...