Logo PJ
Home
Arcade
Musica
Bicicletta
FabLab
Linux
DreamBox
Giochi
 
   Introduzione   Studio   Shell   DivX   Motore   DVR   USB   Varie 

Studio del DreamBox

In questa pagina voglio documentare tutti gli studi che condurrò sul DreamBox, gli esperimenti e le scoperte fatte smanettando su questo meraviglioso sistema. Il contenuto sarà principalmente materiale elaborato direttamente da me, eventualmente integrato con suggerimenti di altre persone.

Clock di sistema

Il DreamBox non possiede un circuito di clock che mantenga aggiornato l'orologio di sistema quando la macchina è spenta. Una volta acceso il sistema infatti se ci colleghiamo via shell al suo interno possiamo notare che la data è impostata al 1 gennaio 1970. Ho provato tramite il comando rdate a sincronizzare l'orologio di sistema, ed effettivamente la cosa funziona, ma solo fino a quando non viene nuovamente spento. Se si possiede una connessione permanente su Internet (ADSL o linea dedicata) è possibile inserire nello script di init il seguente comando:

rtime -r time.ien.it

in modo tale che al momento del boot il sistema sincronizzi automaticamente l'ora con l'orologio atomico dello IEN di Torino. Un buon posto dove piazzarlo può essere il file /var/etc/premount, che viene eseguito subito prima di montare l'hard disk.

SAMBA sulla Traveller

Dalle immagini della traveller è stato eliminato il server Samba. È comunque possibile reintegrarlo copiando i due eseguibili smbd e nmbd, presenti nell'archivio del firmware, all'interno della directory /var/bin/, mentre dobbiamo recuperare la libreria libnsl-2.2.5.so da un firmware originale (io la ho estratta con il programma TuxBoxFlashTools.exe) e copiarla nella directory /var/lib/. A questo punto dalla shell diamo i seguanti comandi:

cd /var/lib/ ln -s libnsl-2.2.5.so libnsl.so ln -s libnsl-2.2.5.so libnsl.so.1

per creare i link simbolici alla libreria. Occorre infine creare il file /var/etc/init contenente le seguenti righe:

#!/bin/sh /var/bin/smbd -D /vat/etc/smb.conf /var/bin/nmbd -D /vat/etc/smb.conf

Questo script, che deve essere eseguibile, all'avvio del sistema si preoccupa di caricare i due demoni facendogli leggere un file di configurazione memorizzato nella parte scrivibile della FlashROM (e quindi modificabile). Per renderlo eseguibile diamo il comando:

chmod 744 /var/etc/init

Il filesystem

Il DreamBox viene gestito da un sistema operativo Linux per processori PowerPC, installato in una FlashROM. La memoria in tale chip è stata partizionata in diverse aree, come si può evincere dal file /proc/mtd ricavato da una versione del firmware precedente la 1.06:

~ > cat /proc/mtd dev: size erasesize name mtd0: 00600000 00020000 "DreamBOX cramfs" mtd1: 001c0000 00020000 "DreamBOX jffs2" mtd2: 00040000 00020000 "DreamBOX OpenBIOS" mtd3: 007c0000 00020000 "DreamBOX (w/o bootloader)" mtd4: 00800000 00020000 "DreamBOX (w/ bootloader)"

A questo punto diamo un occhio anche ai dispositivi montati dal sistema e vediamo di fare un quadro della situazione:

~ > mount rootfs on / type rootfs (rw) /dev/root on / type cramfs (ro) none on /dev type devfs (rw) /proc on /proc type proc (rw) /dev/mtdblock/1 on /var type jffs2 (rw) none on /var/tmp type ramfs (rw) /dev/ide/host0/bus0/target0/lun0/part1 on /hdd type reiserfs (rw)

La prima partizione è quella dove viene memorizzato il firmware, salvato in un formato compresso di sola lettura, chiamato CramFS (Compressed ROM File System), che contiene tutto il filesystem del sistema. Questo file non è modificabile ma è direttamente leggibile al momento del boot: è infatti la partizione che viene utilizzata come root dal bootloader all'avvio del sistema.

La seconda partizione invece, montata in jffs2 (Second Journaling Flash Filesystem), è quella che gestisce un filesystem riscrivibile all'interno della FlashROM e che contiene la directory /var.

La quarta permette invece di lavorare contemporaneamente su entrambe le partizioni viste in precedenza: in pratica con il comando

cat /dev/mtd/3 > /hdd/backup.img

è possibile effettuare un backup completo del firmware e delle impostazioni del ricevitore, ripristinabile effettuando il comando inverso, ovvero la redirezione del file nell'hard disk all'interno del dispositivo. Al di là di questa già comoda possibilità, l'utilizzo di questa partizione permette a chi realizza firmware per il DreamBox di eliminare la cartella /var_init e l'operazione iniziale di pulizia della partizione delle impostazioni tramite Flash erase preparando la directory /var con la configurazione preimpostata e distribuendo direttamente l'immagine completa di entrambe le partizioni. Tale file è utilizzabile anche dal programma DreamUp, che lavora direttamente su tale partizione e quindi permette un ripristino da seriale in caso di firmware accidentalmente cancellato.

La partizione etichettata DreamBOX OpenBIOS, sicuramente protetta in scrittura, credo contenga il BIOS responsabile dell'avvio del sistema. Si tratta di un bootloader creato appositamente per il DreamBox, al cui menù è possibile accedere collegando un terminale alla seriale e premendo due volte il tasto Invio quando compare il messaggio Dreambox DM7000: appariranno le seguenti righe:

DM7000 BIOS v.2.0 (Sep-22-2002) RAM: 48 MB, LCD: OK, CPU 252 MHz, BUS 63 MHz --- Device Configuration --- Power-On Test Devices: 000 Disabled System Memory [RAM] 002 Disabled Ethernet [ENET] ---------------------------- Boot Sources: 001 Enabled Application in Flash [FLASH] 002 Enabled Ethernet [ENET] local=0.0.0.0 remote=255.255.255.255 hwaddr=0009340023aa 003 Enabled Serial Port 1 [S1] Baud = 9600 ---------------------------- Update Flash : Disabled Automatic Boot: Enabled ---------------------------- 1 - Toggle Power-On Tests 2 - Change a Boot Device 3 - Change IP Addresses 4 - Ping test 5 - Change Baud Rate for S1 Boot D - Display Configuration 0 - Exit Menu and Boot Application ->

Come si può intuire, da tale menù è possibile impostare i parametri di boot per fare in modo che, anziché partire dalla FlashROM, il ricevitore possa utilizzare la seriale oppure la rete. È in questa parte dell'avvio del sistema che il programma DreamUP si collega per sparare un nuovo firmware nel caso il DreamBox sia bloccato a causa di una cattiva compilazione della FlashROM. Il normale avvio prosegue caricando il bootloader da un'altra partizione della FlashROM; tale bootloader contiene del codice in grado di trovare il kernel all'interno del filesystem CramFS e caricarlo in memoria; il resto del boot è analogo a quello di un normale sistema linux, come potete verificare in questo file di log.

All'interno della directory /var è presente poi la directory /var/tmp, che viene invece gestita direttamente in RAM per aumentare la velocità (gli accessi alla RAM sono ovviamente più veloci rispetto agli accessi alla FlashROM) e per ridurre l'utilizzo della FlashROM (che comunque anche se elevato ha un periodo di vita basato su un numero di accessi limitato). La dimensione di tale area è stata impostata a 4MB.

Per finire abbiamo l'hard disk, formattato in ReiserFS, di cui se presente viene montata la prima partizione nella directory /hdd. Se ci occorre fare delle prove possiamo quindi collegare un disco già partizionato ed utilizzato, eventualmente montare a mano la partizione che intendiamo utilizzare purché sia formattata in ext2, ext3 oppure raiserfs. È importante che all'interno di questa partizione esista una directory movie, dove il ricevitore memorizzerà tutte le registrazioni dei programmi desiderati.

Riassumendo quindi, al termine del boot abbiamo il filesystem del sistema così costituito:

/   Directory in sola lettura
/var   Directory in lettura/scrittura che resiste al boot
/var/tmp   Directory temporanea che non resiste al boot
/hdd   Hard disk

A partire dalla versione 1.06 del firmware è stata introdotta all'interno della FlashROM una nuova partizione formattata in SquashFS, più efficiente e meno avido di memoria del CramFS. La mappatura delle partizioni è stata modificata, come si può notare da questo output:

~ > cat /proc/mtd dev: size erasesize name mtd0: 00600000 00020000 "DreamBOX cramfs" mtd1: 001c0000 00020000 "DreamBOX jffs2" mtd2: 00040000 00020000 "DreamBOX OpenBIOS" mtd3: 007c0000 00020000 "DreamBOX (w/o bootloader)" mtd4: 00800000 00020000 "DreamBOX (w/ bootloader)" mtd5: 004e0000 00020000 "DreamBOX SquashedFS"

Nella partizione in CramFS sono rimasti in pratica solo il kernel e l'immagine che viene visualizzata all'accensione del ricevitore, mentre tutto il resto del sistema è stato inserito all'interno della nuova partizione.

Per utilizzare le nuove immagini è necessario realizzare un aggiornamento via seriale tramite DreamUp, unico metodo che consente la programmazione dell'intera FlashROM, a differenza di DreamUpLan o dell'aggiornamento manuale che invece lavorano solo sulla partizione del firmware. Una alternativa realizzabile da shell è quella di inviare il file contenente l'immagine direttamente al dispositivo /dev/mtd/3, ovvero alla partizione logica che comprende tutte le partizioni di sistema.

Ho realizzato per l'occasione due semplici script: uno che realizza il backup (tipo sconosciuto, 233 byte) dell'intera FlashROM (quindi sia il firmware che le impostazioni) su di un file, l'altro che ripristina (tipo sconosciuto, 374 byte) tali file di backup (oppure una nuova immagine realizzata con questo sistema) all'interno della FlashROM. L'uso è molto semplice in quanto basta specificare come parametro il file da utilizzare, altrimenti ne verrà utilizzato uno di default; per il corretto funzionamento viene richiesto il programma eraseall che comunque è presente in tutte le immagini rilasciate poiché è quello che si occupa della corretta cancellazione della FlashROM prima della scrittura.

Risulta evidente quindi come la mappatura delle partizioni della FlashROM sia effettuata dal kernel a livello logico, e non a livello fisico sul chip, cosa che avviene invece con gli hard disk. Copiando in maniera diretta l'immagine della memoria all'interno del chip permettiamo al sistema di partire con il nuovo kernel, che gestisce il partizionamento differente, e di riconoscere immediatamente le nuove partizioni. Utilizzando il medesimo sistema possiamo pensare di realizzare un ambiente di sviluppo direttamente all'interno del Dreambox, senza utilizzare una directory esterna da montare in NFS. creando una immagine CramFS unicamente per il kernel e l'immagine di avvio e lasciando tutto il resto in una immagine jffs2, quindi modificabile,

Procedura di aggiornamento del firmware

L'aggiornamento del firmware consiste nella cancellazione della prima partizione della FlashROM e nella successiva scrittura del file .img al suo interno. Al boot successivo il sistema leggerà quindi il nuovo filesystem, ma utilizzerà ancora la vecchia directory /var. In caso di installazione di un nuovo firmware è consigliata quindi la procedura Flash erase, per inizializzare correttamente i file di configurazione del nuovo ambiente.

Procedura Flash erase

La procedura Flash erase, attivata premendo il tasto UP all'avvio del DreamBox, effettua una cancellazione della seconda partizione della FlashRom (quella contenente la directory /var) e vi copierà all'interno tutti i file contenuti nella directory /var_init. Poiché in tale directory sono presenti tutti i file di configurazione del sistema è chiaro perché una volta aggiornato il firmware è importante effettuare anche questa procedura.

RIFERIMENTI

  • Lo script che realizza un backup (tipo sconosciuto, 233 byte) delle partizioni di sistema del DreamBox in un file.
  • Lo script che ripristina (tipo sconosciuto, 374 byte) all'interno della FlashROM un backup realizzato in precedenza oppure un firmware preparato con le recenti metodologie (partizioni miste).