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