Avvio del sistema- U-Boot carica il kernel definito come uImage.
- Il kernel cerca /sbin/init, che è un symlink a BusyBox. init legge /etc/inittab.
- /etc/inittab ha un solo riferimento: /etc/rc.sh, che è lo script principale di avvio.
- /etc/rc.sh viene letto ed eseguito.
- Opzionalmente si possono mettere una serie di script che vengano invocati da rc.sh. Consiglio sempre di metterli alla fine, per sicurezza.
Lo script monta alcune partizioni, tra cui MTD1, da cui vengono copiati dei file di configurazione. C'è da dire che ogni volta che il DNS viene spento e/o riavviato i file di configurazione vengono presi dalle partizioni con le configurazioni di default, quindi se fate delle modifiche ai file nel DNS al prossimo avvio senza agire direttamente sul firmware, esse
andranno perdute. A meno che non si usi un piccolo e semplice stratagemma per conservare le modifiche, che spiegherò più avanti.
Lo script
rc.sh è lo script più importante, e per questo merita maggior attenzione e maggiore studio. Esso, tra le cose importanti, attiva la scheda di rete, carica i moduli nel kernel e avvia il webserver.
Però fa anche delle cose che non capisco.
- Attiva delle partizioni di swap che non dovrebbero esistere. Le crea nei dischi rigidi che ospita, e non dovrebbe farlo. Con una oculata gestione del sistema la swap non serve. E poi nei miei dischi non voglio partizioni di swap, ma solo i miei dati.
- Alcuni comandi, non so come mai, vengono eseguiti due volte. Ad esempio, all'inizio viene montato tutto, poi vengono subito smontati /proc e cramfs; poi viene rimontato tutto e viene smontato MTD1, per poi venire rimontato poco dopo.
- chmod 777 /dev/null, quando dovrebbe avere permessi 666; inoltre viene assegnato ad un utente che non è root.
- Una tabella di configurazione RAID viene scritta due volte, senza spiegazione apparente.
Ma la cosa più grave, come ho già accennato, è che lo script non fa cenno su possibili check dei dischi rigidi. Spulciando
dmesg nel DNS si possono vedere diverse righe che recano la scritta
Recovering journal nel caso di filesystem ext3, segno che non sono stati smontati correttamente all'arresto precedente.
FilesystemIl DNS usa quattro filesystem principali.
- minix: è usato nelle partizioni MTD.
- ext2: il ramdisk lo usa, ed è il filesystem di default dei dischi.
- ext3: non è utilizzato per default sui dischi, sebbene il kernel lo supporti, e sia necessario connettersi tramite telnet e formattarli manualmente. La cosa è resa più difficile dal fatto che fun_plug è letto proprio dal primo disco, o dal RAID. Quindi bisogna abilitare il modulo USB ed utilizzare una chiavetta come unità temporanea per caricare utelnetd. Ma su questo torneremo più avanti.
- cifs: è il filesystem di rete, usato da Samba.
Cosa ho fatto fino adessoLo ho studiato. Ho fatto decine e decine di prove prima di flashare qualcosa, memore del fatto che
se viene commesso un errore nel firmware la gravità dello stesso errore può andare da un malfunzionamento di utelnetd (rimediabile con un fun_plug) ad un brick bello e buono, che può essere causato da una miriade di fattori diversi. E' necessario pertanto porre estrema attenzione a quello che si fa.
Comunque esiste un metodo anche per rimediare in situazioni estreme, ma richiede una particolare predisposizione all'elettronica ed al modding hardware spinto, in quanto prevede l'aggiunta fisica di una porta seriale per delle modifiche dirette alla EEPROM.
Quindi il mio consiglio è:
se non siete sicuri di quel che fate e volete usare il vostro DNS per altri scopi oltre a quello del mattone per fare case, non fatelo.
Ho studiato il cross-compiling. Cross-compiling è una tecnica che permette di generare codice oggetto per macchine di architettura differente da quella che ospita il compilatore. In altre parole, ora so (più o meno) creare su un i386 eseguibili che girano su un ARM.
Ho fatto due prove. La prima è stata una formalità: ho scomposto un firmware preesistente, l'ho ricomposto e l'ho flashato sul DNS per vedere se i tool di scomposizione/ricomposizione funzionavano, ed è stato un successo.
Poi ho preso il firmware, l'ho scomposto, ho aggiunto il supporto telnet, l'ho ricomposto e l'ho flashato. E ha funzionato anche questo.
Prima dovevo reggermi su una chiavetta USB che mi supportasse telnet, ora non più, e il procedimento di avvio è molto più snello e veloce, soprattutto per quanto riguarda la connessione via telnet.
I prossimi passi sono numerosi. Uno dei primi è ricompilare BusyBox, per almeno due motivi.
Il primo, ottimizzare il sistema e togliere symlink inutili a cui non corrisponde nessun tipo di applet in BusyBox.
Il secondo, togliere un codice fastidioso che BusyBox chiede in fase di accesso al DNS. L'ho identificato nei sorgenti e so come si toglie, ma BusyBox è l'applicazione principale e ricompilarlo significa un po' camminare alla cieca, quindi devo fare altri controlli e andare con i piedi di piombo.
ObiettivoIl mio obiettivo non è solo quello di rendere il firmware stabile ed affidabile il più possibile (i signori della D-Link non hanno fatto un bel lavoro, c'è da dirlo), ma anche quello di renderlo appetibile sia dai casalinghi che dagli smanettoni, sia da coloro a cui basta loggarsi tramite webserver sia per coloro che vogliono connettersi tramite telnet e lavorare con la tastiera.
La prima volta che avevo messo le mani sul firmware ero rimasto decisamente deluso, per cui proverò a modificarlo in modo da renderlo almeno un po' più decente.
Poi c'è l'Obiettivo Supremo, che consiste nel dare al DNS un firmware 100% Free Software che dia tutte o quasi le funzionalità del firmware originale, ma sinceramente non so se riuscirò mai a farlo. Mi sfuggono alcune cose fondamentali, come l'update del firmware. So solo come si fa da webserver, probabilmente con un programma proprietario.
Link utiliQui di seguito posto dei link utili da andare a leggere se volete approfondire le cose.
La guida non è finita qui, pubblicherò diverse cose, trucchi, stratagemmi, procedure utili per rendere il DNS un luogo più accogliente, e cercherò di documentare i miei progressi.
DNS323Wiki - wiki sul DNS, la mia fonte primaria di informazioni
Guida alla creazione della toolchain ARM per il DNS - il cross-compiling sull'ARM comincia da qui
Come costruire un firmware per il DNS - vengono usati due tool:
mkimage (in U-Boot) e
makeFirmwareDovrebbe anche essere possibile
installare una Debian su DNS-323, ma non l'ho mai provato
Link ai sorgenti della versione 1.05 del software GPL del DNS-323Link alla GNU General Public License versione 2Dimenticavo: tutto ciò che dirò e scriverò sarà riferito alla versione
1.05 del firmware, testata su
hardware B1.
Per ottenere queste due informazioni (versione firmware e versione hardware) basta che rovesciate il vostro DNS-323 e ci guardate sotto: in basso a sinistra, come nell'
esempio preso dalla wiki del DNS, vedete "H/W Ver.:" (Hardware versione) e "F/W Ver.:" (Firmware version).