Dimensione: 25213
Commento:
|
Dimensione: 33444
Commento:
|
Le cancellazioni sono segnalate in questo modo. | Le aggiunte sono segnalate in questo modo. |
Linea 12: | Linea 12: |
Ultimo aggiornamento: 11/03/2007 21:12 (le immagini belle e pronte le trovate al paragrafo "Il risultato") |
Ultimo aggiornamento: 11/04/2007 13:02[[BR]] (le immagini Kamikaze per Fonera belle e pronte le trovate al paragrafo "Il risultato") |
Linea 41: | Linea 41: |
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. | 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 Open``Wrt 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à Open``Wrt non si può definire nè un firmware e nè una distribuzione. In pratica Open``Wrt 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 Open``Wrt, 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. |
Linea 43: | Linea 43: |
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. | Nel corso del tutorial vedremo come scaricare e tenere aggiornati gli ultimi sorgenti di Open``Wrt, dei pacchetti portati sotto Open``Wrt e di X-Wrt che è un'interfaccia grafica HTTP per la configurazione dei sistemi Open``Wrt. 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 49: | Linea 49: |
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: | Ovviamente, il primo passo è procurarsi i sorgenti di Open``Wrt. 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 '''Open``Wrt``Compile''' nella nostra home: |
Linea 56: | Linea 56: |
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): |
Il team di sviluppo di Open``Wrt 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 Open``Wrt. 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 Open``Wrt tramite il comando '''svn co''' (svn checkout): |
Linea 73: | Linea 73: |
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: | Alla fine del processo SVN quindi avrà scaricato l'ultima versione (6261 nell'esempio) del source tree di Open``Wrt. A questo punto possiamo procedere nello stesso modo per scaricare anche i pacchetti aggiuntivi: |
Linea 89: | Linea 89: |
Fatto questo, nella nostra cartella di lavoro avremo due sottocartelle che contengono, rispettivamente, i sorgenti SVN del trunk !OpenWrt e dei suoi pacchetti. | Fatto questo, nella nostra cartella di lavoro avremo due sottocartelle che contengono, rispettivamente, i sorgenti SVN del trunk Open``Wrt e dei suoi pacchetti. |
Linea 97: | Linea 97: |
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/''': | Il sourcetree principale di Open``Wrt, 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/}}}: |
Linea 111: | Linea 111: |
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: | Fatto questo, possiamo procedere a scaricare anche i sorgenti di X-Wrt che è un progetto separato da Open``Wrt e per questo si appoggia ad un repository SVN differente: |
Linea 128: | Linea 128: |
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: | A questo punto, nella nostra cartella {{{~/OpenWrtCompile}}} avremo le ultime versioni (nell'esempio 6224, 6224 e 2444) rispettivamente di Open``Wrt, dei suoi pacchetti aggiuntivi e di X-Wrt. Successivamente, qualora volessimo aggiornare in un solo colpo tutti questi sorgenti basterà soltanto: |
Linea 140: | Linea 140: |
== 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/ }}} |
|
Linea 143: | Linea 156: |
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: | A questo punto avremo la nostra bella mezza tonnellata di patch e script che compongono Open``Wrt; è 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: |
Linea 152: | Linea 165: |
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!): | 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 Open``Wrt (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 ;) |
Linea 197: | Linea 212: |
= 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 }}} |
|
Linea 200: | Linea 225: |
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. | La prima volta che compileremo Open``Wrt converrà dotarsi di un libro, un film, parole crociate o quanto altro preferiamo per ammazzare un pò di tempo. Alla prima compilazione infatti Open``Wrt 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 Open``Wrt 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. |
Linea 295: | Linea 320: |
* 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: |
* attachment:openwrt-atheros-2.6-root.jffs2-64k (md5sum e25ca808fce3309d204b4444471a84bc ) * attachment:openwrt-atheros-2.6-vmlinux.lzma (md5sum 99a633f6f0e7efdb14adf460c2bfe392 ) Si tratta di Open``Wrt Kamikaze (rev. 6935) con: |
Linea 299: | Linea 324: |
* !WebIf (rev. 2765) * olsrd 4.10-1 con mod dot-draw, dyn-gw, httpinfo, nameservice, power, secure, mod-tas |
* !WebIf (rev. 3118) * olsrd 5.0 con mod dot-draw, dyn-gw, httpinfo, nameservice, power, secure, mod-tas |
Linea 310: | Linea 335: |
Come esempio aggiungeremo al nostro trunk il pacchetto '''batman''' che ci metterà a disposizione il daemon per il protocollo [http://www.open-mesh.net B.A.T.M.A.N].[[BR]] | == B.A.T.M.A.N. == '''AGGIORNAMENTO:''' questi miei files per aggiungere batman alle immagini Kamikaze sono stati appena [https://dev.openwrt.org/changeset/6592 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 [http://www.open-mesh.net B.A.T.M.A.N].[[BR]] |
Linea 393: | Linea 424: |
Con queste poche righe abbiamo istruito il sistema di compilazione di OpenWrt a: | Con queste poche righe abbiamo istruito il sistema di compilazione di Open``Wrt a: |
Linea 437: | Linea 468: |
Se proviamo a compilare dopo aver aggiunto il solo Makefile otterremo un errore. In effetti è da aggiungere una piccola patch ...to be continued (c'ho la pasta sul fuoco!!!) |
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.[[BR]] 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: {{{ #!/bin/sh /etc/rc.common 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. == 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. |
Linea 443: | Linea 616: |
'''to be done''' * mount cifs * compile single package * cross compile * qemu |
|
Linea 457: | Linea 634: |
* '''Sal''' per le hint sul toolchain di !OpenWrt | * '''Sal''' per le hint sul toolchain di Open``Wrt |
...::: Compilare OpenWRT :::... BR a cura di BlaXwanBR
Ultimo aggiornamento: 11/04/2007 13:02BR (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 [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!
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
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!):
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
6. 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 $
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:
- attachment:openwrt-atheros-2.6-root.jffs2-64k (md5sum e25ca808fce3309d204b4444471a84bc )
- attachment:openwrt-atheros-2.6-vmlinux.lzma (md5sum 99a633f6f0e7efdb14adf460c2bfe392 )
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 [http://wiki.ninux.org/moin.cgi/LaFoneraDallaScatolaAOpenWrt?action=show#head-af3c467f7e61c854817f9cf6eddf1551985b8df4 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 pò 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 [https://dev.openwrt.org/changeset/6592 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 [http://www.open-mesh.net B.A.T.M.A.N].BR 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 pò 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.BR 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
[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]
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 [http://openwrt.org OpenWrt]
la comunità di sviluppo di [http://www.x-wrt.org/ X-Wrt]
(BlaXwan) to be continued...