DarkForge Forum

Forum principali => Software => Linux, Open Source e compilazione => Topic started by: MsZ on Sun 24 May 2009, 18:30

Title: DNS-323
Post by: MsZ on Sun 24 May 2009, 18:30
Premessa

Recentemente ho acquistato un D-Link DNS-323 (http://www.dlink.com/products/?pid=509). E' un NAS (http://en.wikipedia.org/wiki/Network-attached_storage) con delle funzionalità interessanti, tra cui la creazione e la cura di alcuni tipi di array RAID (RAID0 (http://en.wikipedia.org/wiki/RAID_0#RAID_0), RAID1 (http://en.wikipedia.org/wiki/RAID_1#RAID_1) o  JBOD (http://en.wikipedia.org/wiki/JBOD#Concatenation_.28SPAN.29)). Ma la caratteristica più interessante è che il DNS è un computer vero e proprio, un sistema embedded (http://en.wikipedia.org/wiki/Embedded_system) che gestisce delle unità di immagazzinamento dati via LAN. E' un computer particolare, con delle specifiche descritte qui (http://wiki.dns323.info/), che ospita un sistema Linux (o meglio, un sistema U-Boot (http://www.denx.de/wiki/U-Boot/WebHome) + Linux (http://en.wikipedia.org/wiki/Linux) + uClibc (http://en.wikipedia.org/wiki/Uclibc)), altamente modificabile.

Ed è qui che arriva il bello. Ma prima, alcune spiegazioni.

Caratteristiche principali
Hardware:

Software:
(tutti modificati da D-Link)

Ci sono poi molti altri eseguibili qua e là, scritti e compilati da D-Link, di cui non esistono sorgenti. Questi sono i più ambigui e difficili da analizzare, ma ci tornerò più avanti.

fun_plug (http://wiki.dns323.info/howto:fun_plug)

Il DNS-323, visto da fuori, non è che sia 'sto granchè modificabile. Però fin dall'inizio c'è uno spiraglio di possibilità.
Per default, il sistema cerca, all'avvio, in uno dei dischi montati al suo interno, uno script per /bin/sh chiamato fun_plug, che abbia flag 0755, e lo esegue. La cosa più interessante è che in fun_plug si può mettere teoricamente qualunque cosa che passi per la testa.

Ma questo può non bastare. Se uno vuole un qualche cosa direttamente all'interno del DNS-323 deve andarsi a modificare il firmware (http://en.wikipedia.org/wiki/Firmware).

Il firmware

Se devo dire la verità, il firmware del DNS non è un granchè. E' ottimizzato per il DNS, ma mancano alcune cose fondamentali come il check dei filesystem all'avvio del sistema, che è una grave mancanza per un sistema Linux. Inoltre, non c'è un vero smontaggio pulito dei dischi all'arresto del sistema, che può causare delle corruzioni nei filesystem.
Queste sono le cose più rilevanti. Ci sono delle cose che non capisco, prima tra tutte l'insieme degli errori di sintassi, la sovrabbondanza di commenti e la presenza di righe echo che in un sistema embedded, che non ha monitor, non servono ad altro che aumentare lo spazio occupato. Forse per un eventuale debug, ma gli unici messaggi che contano per me sono quelli del kernel, e in ogni caso si può sempre redirigere l'output in un file.

Ma andiamo con ordine.

Il firmware del DNS è organizzato in tre parti principali, poi suddivise in cinque parti nella ROM. Nel sito della D-Link trovate dei firmware per l'aggiornamento del sistema. Splittando il firmware trovate tre file:

All'interno della ROM il firmware è diviso in cinque partizioni, qui espresse in offset di memoria:


Le dimensioni espresse in byte fanno riferimento alle dimensioni massime ospitabili dalle partizioni. Ad esempio, un kernel Linux (uImage) può avere una dimensione massima di 1572864 byte.
Title: Re: DNS-323
Post by: MsZ on Sun 24 May 2009, 18:37
Avvio del sistema


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.


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.

Filesystem

Il DNS usa quattro filesystem principali.

Cosa ho fatto fino adesso

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

Obiettivo

Il 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 utili

Qui 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 (http://wiki.dns323.info/) - wiki sul DNS, la mia fonte primaria di informazioni
Guida alla creazione della toolchain ARM per il DNS (http://wiki.dns323.info/howto:crosscompile) - il cross-compiling sull'ARM comincia da qui
Come costruire un firmware per il DNS (http://curvedbrain.org/2008/06/09/building-firmware-binary-image-d-link-dns-323/) - vengono usati due tool: mkimage (in U-Boot) e makeFirmware (http://hg.leschinsky.in.ua/makeFirmware/archive/795934923d15.tar.bz2)
Dovrebbe anche essere possibile installare una Debian su DNS-323 (http://curvedbrain.org/2008/06/09/building-firmware-binary-image-d-link-dns-323/), ma non l'ho mai provato

Link ai sorgenti della versione 1.05 del software GPL del DNS-323 (http://ftp://ftp.dlink.com/GPL/DNS-323/105/)
Link alla GNU General Public License versione 2 (http://www.gnu.org/licenses/gpl-2.0.html)

Dimenticavo: 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 (http://wiki.dns323.info/_media/4diff.jpg?cache=cache), vedete "H/W Ver.:" (Hardware versione) e "F/W Ver.:" (Firmware version).
Title: Re: DNS-323
Post by: franz1789 on Tue 26 May 2009, 00:58
Mi stupisci sempre di più, sei il mio dio personale...
Title: Re: DNS-323
Post by: MsZ on Wed 27 May 2009, 19:45
Di seguito i primi tre firmware che ho costruito. Nell'archivio ZIP trovate il firmware ed un changelog. Per i sorgenti fate riferimento ai link in fondo al secondo post.

Per aggiornare il firmware non dovete fare altro che upparlo dal webserver del DNS.

1.05-custom-0.1
Quote
--- Version 0.1 : Start
(ADD) Added telnet support
Title: Re: DNS-323
Post by: MsZ on Wed 27 May 2009, 19:51
1.05-custom-0.2

Quote
--- Version 0.2 : Warmin' Up
(FIX) Removed several comments and echo lines from rc.sh
(REM) Removed non-existent symlink applets:
   -- cut
   -- mesg
   -- stty
   -- tty
   -- md5sum
   -- usleep
Title: Re: DNS-323
Post by: MsZ on Wed 27 May 2009, 19:58
1.05-custom-0.3
Quote
--- Version 0.3 : Let Us Hack BusyBox
(FIX) Direct login into sh: no more '5784468' required
(REM) Removed useless '/busybox' app
(REM) Removed 'modprobe' support from BusyBox
(REM) Removed redundant '/sbin/dumpleases' symlink
(REM) Removed non-existent symlink applet: getty
(REM) Removed 'tinylogin' app
(ADD) Added 'awk' support in BusyBox
(ADD) Added 'halt' support in BusyBox
(ADD) Added 'dd' support in BusyBox
(ADD) Added 'du' support in BusyBox
(ADD) Added 'adduser' support in BusyBox
(ADD) Added 'deluser' support in BusyBox
(ADD) Added 'addgroup' support in BusyBox
(ADD) Added 'delgroup' support in BusyBox
(ADD) Added 'passwd' support in BusyBox
(ADD) Added 'login' support in BusyBox
(CHG) BusyBox is now statically linked
Title: Re: DNS-323
Post by: MsZ on Thu 28 May 2009, 09:30
--- Nota tecnica 1 ---

Forse qualcuno smaliziato si chiederà "perchè aggiungere awk ad un sistema embedded?"
La risposta è in alcuni (molti) script di sistema e nel seguente costrutto ash/bash/sh:
Code: [Select]
expr substr <stringa> <partenza> <offset>
Ne ho visti diversi, ed ogni volta che ne ho visto uno, puntualmente mi è venuto il latte alle ginocchia. Essenzialmente è l'estrazione di un token in una stringa tramite il comando bash expr substr. La shell prende la stringa <stringa>, viaggia fino alla <partenza> (numero intero) ed estrae tutti i caratteri dalla <partenza> all' <offset>. Le cose che mi stanno antipatiche sono due.


Tre righe qua, tre righe là, gli script sono più piccoli, compatti e leggibili, e ovviamente debuggabili. awk si usa con un semplice pipe. L'unico contro è la struttura.

Sostituisco
Code: [Select]
START=9
OFFSET=5
STRING="stringa molto lunga e con spazi"

EXAMPLE=$(expr substr "$STRING" $START $OFFSET)

# in EXAMPLE c'è la parola "molto"

con

Code: [Select]
STRING="stringa molto lunga e con spazi"
EXAMPLE=$(echo $STRING | awk '{ print $2 }')
# il risultato è lo stesso, anche più semplice

come esempio generale. Ma molto spesso gli script del DNS fanno riferimento a output di programmi come ifconfig, e allora se uno deve andarsi a cercare il MAC Address di una periferica capite bene che un salto da così

Code: [Select]
MACAddrStart=28
MACAddrLength=17

MACAddrLine=$(ifconfig | grep egiga0)
MACAddr=$(expr substr "$MACAddrLine" $MACAddrStart $MACAddrLength)

a così

Code: [Select]
MACAddr=$(ifconfig | grep egiga0 | awk '{ print $5 }')

è un bel salto di qualità.

Ovviamente poi bisogna modificare gli script in modo che utilizzino awk, sennò è come soffiare controvento.
Title: Re: DNS-323
Post by: MsZ on Thu 28 May 2009, 13:22
--- Modifiche ---


Oltre al firmware sto lavorando ad uno script che riesca a manutenere un firmware per DNS.
Dovrebbe essere relativamente semplice, si parte dal firmware binario e alcuni tool esterni.




Per scaricarlo basta che facciate clic sul "bz2" minuscolo in alto:

Quote
makeFirmware / summary
summary | shortlog | changelog | tags | files | bz2 (http://hg.leschinsky.in.ua/makeFirmware/archive/tip.tar.bz2)

Questo per l'estrazione dei file principali dal firmware. Nell'archivio trovate un file che si chiama parseFirmware.py, scritto in Python (http://en.wikipedia.org/wiki/Python_(programming_language)) (quindi dovrete avere Python installato), che tirerà fuori i file descritti sopra:


Lo script che sto scrivendo dovrà rendere disponibile l'albero del firmware per l'utente, così strutturato:
Code: [Select]
<versione>
    |
    - root
    - image.cfs
    - default
    - firmware


Poi metto il file CHANGELOG che riporta tutti i cambiamenti fatti, dalla 0.1 in poi. In pratica, riporta tutte le differenze dal firmware originale, ordinate per versione.




firmware, quando è completa, contiene i seguenti file:

L'archivio goahead.tgz è reso disponibile da D-Link tra i sorgenti del firmware. Tra le varie directory di goahead trovate custom.h nella directory LINUX (goahead/LINUX/custom.h), come spiegato qui (http://curvedbrain.org/2008/06/09/building-firmware-binary-image-d-link-dns-323/).

mkimage è un tool di U-Boot. Il problema è che, per compilarlo servono:

I sorgenti si trovano sempre sul sito della D-Link. La toolchain va costruita. E per costruire al toolchain servono i tool di compilazione. Per una spiegazione abbastanza esaustiva (seguendola ho realizzato la toolchain al primo tentativo) andate qui (http://wiki.dns323.info/howto:crosscompile) e seguite la costruzione della toolchain fino alla creazione di crosstools-env.sh, compreso. Se la compilazione non ha avuto errori la toolchain dovrebbe essere corretta. Per far leggere lo script di configurazione dell'ambiente cross basta questo:
Code: [Select]
source ccrosstools-env.sho
Code: [Select]
. crosstools-env.shLa variabile $CWD nello script deve corrispondere al percorso assoluto in cui avete messo la toolchain. Oppure potete modificare lo script in questo modo:

invece di
Code: [Select]
#CWD=$(pwd)
#CWD=/opt/dns323/fw103-0.3
CWD=/home/dns323_GPL/dns323_GPL/uclibc-toolchain-src-20040609/gcc-3.3.x
potete mettere
Code: [Select]
CWD=$1
e poi inserire il percorso in fase di lettura dell'ambiente:
Code: [Select]
./crosstools-env.sh /percorso/assoluto/per/toolchain

Poi potete provare con un programma dummy.

Ricordate due cose:

Per compilare in fretta i sorgenti di U-Boot potete fare come ho fatto io.
Prendere l'archivio u-boot_1_7_3_5182.tgz, scompattatelo, entrate nella radice dei sorgenti e comandate queste due cose:
Code: [Select]
find . -name ".depend" -exec rm -rf {} \;
make
ovviamente dopo aver fatto leggere la configurazione della toolchain.

Alla fine della compilazione il binario mkimage sarà disponibile nella directory tools dalla radice dei sorgenti di U-Boot, compilato per i386, o per architettura locale.

mkimage è un programmino simpatico che aggiunge un header U-Boot a cose tipo kernel o ramdisk. La riga di comando usata per creare uRamdisk è la seguente:

Code: [Select]
mkimage -a 0x800000 -e 0x800000 -n 'boot ramdisk' -A arm -O linux -T ramdisk -C gzip -d <gzipped_ramdisk> uRamdiskcome descritto qui (http://curvedbrain.org/2008/06/09/building-firmware-binary-image-d-link-dns-323/).
Il ramdisk però deve essere con filesystem ext2. E deve essere un file e non un blocco. Quindi:
Code: [Select]
dd if=/dev/zero of=Ramdisk bs=1k count=8k
mke2fs -m0 -F Ramdisk
(-m0 l'ho aggiunto io. Serve a non riservare alcuno spazio per il superuser. Così vengono risparmiati alcuni KB di filesystem per cose più importanti.)
Il ramdisk è creato; bisogna poi trasferire tutti i dati dalla root spiegata sopra al ramdisk. Compreso image.cfs.

Questo bel filesystem cram non è leggibile se non avete il supporto cramfs nel kernel. Se volete sapere se l'avete basta che facciate
Code: [Select]
cat /proc/filesystems | grep cramfsSe non salta fuori niente potete provare a vedere se ne avete il modulo:
Code: [Select]
find /lib/modules/$(uname -r)/kernel/ -name "cramfs.ko"Se anche adesso non salta fuori niente lo dovete integrare. Ma non disperate, perchè non è necessario ricompilare tutto il kernel per averlo. Spiegherò più avanti come si fa, nella sezione dedicata a image.cfs.

Per concludere, non fidatevi di quello che scrive D-Link.
Quote
Many of the remaining D-LINK sources have not been configured for being cross-compiled. In fact, the “Readme.txt” file they supply with the GPL sources has instruction that are just plain wrong.
Title: Re: DNS-323
Post by: MsZ on Thu 28 May 2009, 19:26
COME MANTENERE LE MODIFICHE AL SISTEMA DOPO IL RIAVVIO

Voi direte "Beh, che ci vuole, basta modificare da webserver e salvere le modifiche".

E io dico "Si, ma come dico io si hanno due pregi."


Il procedimento è molto semplice una volta che si conosce la struttura della EEPROM del DNS, si sa che MTD1 e MTD2 sono caratterizzate rispettivamente da /dev/mtdblock0 e /dev/mtdblock1 e il filesystem di mtdblock0 e mtdblock1 è minix. E per finire sappiamo che i due filesystem minix vengono montati in /sys/mtd1 e /sys/mtd2.

A tutt'oggi non so se /dev/mtdblock1 (MTD2) venga usato per il reset di fabbrica. Per cui consiglio fortemente di testare direttamente in /etc le vostre modifiche prima di salvarle.

Per cui basta loggare tramite telnet e fare:

Code: [Select]
mount -t minix /dev/mtdblock0 /sys/mtd1
mount -t minix /dev/mtdblock1 /sys/mtd2

Fate le vostre modifiche in /etc e copiate (sostituendo) i file che vi interessano in /sys/mtd1 e /sys/mtd2, e al prossimo riavvio avrete la configurazione precedente attiva.

Se non siete sicuri di quel che fate, non fatelo. Usate il DNS responsabilmente. :wink:

Se volete ritornare ad una configurazione precedente potete sempre riflashare una versione precedente del firmware.

Se però volete modificare file come smb.default, mi dispiace, ma non potete. Purtroppo il firmware del DNS ha un'applicazione che si chiama smbcom. Viene chiamata da rc.sh e modifica proprio /etc/smb.default: è una specie di controllo del file, e internamente l'applicazione ha un'impostazione predefinita di smb.default che sovrascrive qualsiasi altra. Devo fare delle prove per vedere se smbcom è davvero necessario. Se non lo è, se ne va una volta per tutte. :tdown:

Come tante altre che non mi vanno giù.
Title: Re: DNS-323
Post by: MsZ on Sat 30 May 2009, 01:34
Supporto telnet con autenticazione

Ora l'autenticazione telnet è disponibile. Potete loggare direttamente come root. La password di default è vuota.

Potete cambiare password quando volete con

Code: [Select]
passwd root
Immettete la password e confermate. Ma, come ho detto più su, se lasciate così e riavviate perderete la password. Quindi per salvare i cambiamenti dovete far riferimento al post precedente, Come mantenere le modifiche al sistema dopo il riavvio (http://www.darkforge.it/board/index.php?topic=1065.msg8591#msg8591).

I file soggetti al cambiamento sono:


Per cambiare la password di un utente esistente:
Code: [Select]
passwd <utente>
Per aggiungere un utente a /etc/passwd:
Code: [Select]
adduser <utente>
Per aggiungere/cambiare la password di un utente per Samba:
Code: [Select]
smbpasswd [-a] <utente>[-a] è tra quadre perchè è l'opzione di aggiunta di un utente al database di Samba. Se l'utente non esiste deve essere aggiunto con -a, e ne stabilite la password.

Valgono le regole che ho scritto sopra: /etc/passwd, /etc/shadow e /etc/samba/smbpasswd vanno in /sys/mtd1 e /sys/mtd2.

Da notare che la semplice struttura di /etc/passwd permette una modifica manuale, così come per /etc/group.

Allego il firmware custom 0.4.

Dimenticavo il changelog.

Quote
--- Version 0.4 : Let's Add Some Security
(ADD) Added authentication support (utelnetd + login + shadow)
(ADD) Added user 'root' in /etc/shadow: default password is null
(FIX) /etc/shadow now is 0666
(FIX) /etc/resolv.conf now is 0644
(FIX) /etc/fstab now is 0644
(FIX) /etc/hosts now is 0644
(FIX) /etc/raidtab now is 0644
(FIX) /etc/raidtab2web now is 0644
(FIX) /etc/pure-ftpd.conf now is 0644
(FIX) /etc/save_udhcpd_config now is 0644
(FIX) /etc/udhcpd.conf now is 0644
(FIX) /etc/udhcpd.conf.def now is 0644
(FIX) /dev/[pt]typ0 now are built-in
(CHG) user 'root' now has its home in /root
(REM) directory '/home/root' has been removed
(REM) directory '/lib/modules/2.6.6-arm1' has been removed
(FIX) now default smbpasswd is null

Al prossimo firmware aggiungo il supporto unità esterne USB. So già come fare, questione di poco.
Title: Re: DNS-323
Post by: MsZ on Sat 30 May 2009, 20:29
Pronta la 0.5. Attivo il supporto Flash USB. Adesso potete montare e leggere le chiavi USB ext2/ext3 che avete direttamente dal DNS. Sto anche studiando awk e vedendo di ottimizzare ulteriormente gli script. L'unico cruccio è che dovete loggarvi tramite telnet e agire manualmente.

Quote
--- Version 0.5 : Some More USB Choice
(ADD) Added USB Storage Capability
(CHG) MACAddress retrievement in rc.sh is now through 'awk'

Avevo fatto altre modifiche ma sono andate perse perchè ho ripristinato un firmware precedente, avevo fatto troppo casino con degli script di automount. Cose che succedono.
Comunque fdisk del DNS non funziona come dovrebbe, e lo cambierò con una versione originale ricompilata.
Title: Re: DNS-323
Post by: MsZ on Mon 01 June 2009, 19:12
Sembra che lo script fscheck.sh all'avvio funzioni.

Sto facendo delle prove con ntp (http://www.ntp.org/) per vedere se riesco a liberarmi di adjtimex (http://gd.tuwien.ac.at/linuxcommand.org/man_pages/adjtimex8.html).

Alla D-Link hanno fatto davvero un lavoro schifoso. Due delle cose rilevanti (di cui  mi sono accorto con mio grande dispiacere) è che l'interfaccia di fdisk è totalmente distrutta e non è possibile invocarlo manualmente, e che wget non ha alcun messaggio in output. Capisco che non serva, ma loro fanno delle cose assolutamente senza senso, come togliere l'output dal codice di wget e mettere dei messaggi di echo negli script di avvio... insieme a mettere dei messaggi con mesg, che tra l'altro non è neppure compilato in busybox...

Ma ditemi voi... :tdown:

Bene, ho scoperto che una piccola applicazione, simile a ntpdate, setta l'ora del DNS. Il problema è che la setta su un server della D-Link, che ha 10 ore di differenza dall'Italia. :whustling:
Title: Re: DNS-323
Post by: MsZ on Sun 09 August 2009, 15:58
Update. Un po' tardi, ma ho avuto tante cose da fare, e non è neanche ideale come update. Se volete provatela, ci sono tante cose interessanti. Fate riferimento alla sezione di Warning per alcuni messaggi importanti. E' una rc1, diventerà una 0.6 quando la renderò ideale per me.

Rimane versione 1.05, comunque.

Changelog:
Quote
--- Version 0.6rc1 : A Little Order In A Sea Of Chaos
(FIX) Modified rc.sh: fake smbcom
(ADD) Introducing fscheck.sh: safe unmounting
(ADD) Introducing usb-share.sh: shared flash USB stick on the net
(ADD) Adding sfdisk to system
(CHG) Changed fdisk: usable version
(CHG) Changed e2fsck (1.41.3): ext3 disks can support new features
(CHG) /etc/samba/smb.conf is now stable
[DEL] Pending for deletion:
   HDDStrCmp
   judge_swap
   smbcom
   write_raidtab
   hd_verify
   chk_mtdaapd_path
   SetTimeZone
   stime
   mfg_search
[DEL] Pending for deletion: the entire D-Link RAID system (raidtab)
->   To be replaced with mdadm + free software array
   script recognition system
(ADD) Introducing 'raider': RAID array assembly/disassembly
(DEL) Deleted: /etc/hotplug/hiddenmount
(DEL) Deleted: /etc/hotplug/satamount
(DEL) Deleted: /etc/hotplug/sataumount
(DEL) Deleted: /sbin/hotplug
[DEL] Pending for deletion: BitTorrent structure
   To be replaced with... I don't know :(
   If I manage to cross compile the entire glibc toolchain
   I may actually use transmission-daemon on ARM :)

(BitTorrent lo voglio cancellare perchè non è più free software. Lo era fino alla versione 5. Dalla 6 in poi è proprietario.)

Adesso due tra le cose più interessanti sono:
-- Una eventuale chiavetta flash USB installata nel DNS si monta automaticamente e diventa disponibile in rete fin da subito. --
Se l'avete formattata in Windows (probabile, ovvero non ha partizioni) la potete montare con il seguente comando:

Code: [Select]
mount -t cifs //192.168.0.32/flash <mountpoint> -o user=root
Se è partizionata il DNS dovrebbe montare tutte le partizioni leggibili dal kernel. Le potete montare con il comando:

Code: [Select]
mount -t cifs //192.168.0.32/flashN <mountpoint> -o user=root
una alla volta, dove N è un numero che parte da 1 e va fino al numero massimo di partizioni all'interno della chiavetta... entro certi limiti, e saltando alcuni numeri, se avete creato delle partizioni logiche nella primaria... :whustling: eccetera eccetera.
Guardatela così, avete una porta USB in più via Ethernet. :sdentato:

-- L'array RAID all'interno del DNS viene assemblato, montato e condiviso automaticamente. --

Lo script che gestisce questo si trova in /sys/crfs/sbin/ e si chiama raider. Potete darci un'occhiata se volete.
Vengono ovviamente fatti dei controlli durante le varie fasi. Se esistono i dischi (e sono due, fisici); se esistono le partizioni (e i dischi ne hanno una sola); se le partizioni e i filesystem all'interno dell partizioni sono sani, ecc.
Il DNS supporta due dischi fisici con una partizione primaria ciascuno. Contravvenendo ad uno solo dei controlli comporta un'interruzione della procedura di montaggio e condivisione.

L'array RAID viene montato nel DNS sotto la directory raid. Per montarla via CIFS fate:

Code: [Select]
mount -t cifs //192.168.0.32/raid <mountpoint> -o user=root
Una volta montati i dischi via CIFS avrete tutti i diritti di lettura e scrittura. Devo ricordarmi di mettere un utente neutrale (con soli diritti di lettura) per evitare errori titanici.



*** BIG FAT WARNING ***

Purtroppo alcune ciambelle vengono senza buco, e questa è una ciambella senza buco. Un krapfen. (Che buoni.)
In sostanza, se accedete all'interfaccia web trovate in basso allo schemino un messaggio di errore (probabilmente un'applicazione non trovata, richiamata da goweb). Non è grave, semplicemente ho involontariamente mutilato l'interfaccia di gestione di formattazione dell'array, che era sostanzialmente quello che volevo. Quello che non volevo è il fatto che i dischi all'avvio si mettono a lavorare per un motivo a me sconosciuto, e non vorrei che succedesse qualcosa al filesystem. Ho riavviato il sistema due volte e non ho riscontrato problemi. E sono disponibili via CIFS durante il lavoro. Mah, indagherò.
A parte il fatto che la prima volta che ho riavviato con il nuovo firmware non ho visto i due pulsantini "Skip" e "Next"... panico.
Poi sono andato a vedere nella struttura dell'interfaccia web e ho tirato fuori il nome della pagina principale. L'ho digitata nella barra degli indirizzi del browser e soo riuscito a raggiungere il menu.

Fiù.

Ho poi modificato leggermente il file /sys/crfs/web_page/formatHD/wizard1.asp in modo che mi mettesse i due pulsantini prima della richiesta della funzione che genera errore, ho ricaricato il firmware e sono ricomparsi. E' una pezza temporanea, rimarrà per il tempo che mi servirà per capire come fare a sistemare la cosa in modo un po' più "classoso".


Questa è una versione di prova. Funziona, ma da risultati a me inaspettati. Provatela a vostro rischio e pericolo.
Title: Re: DNS-323
Post by: MsZ on Mon 10 August 2009, 03:05
Ah si. Ho reso fscheck.sh stabile, ovvero ad ogni avvio fa un controllo dei filesystem, come dovrebbe essere.

Adesso devo fare in modo che all'arresto i filesystem si smontino.
Title: Re: DNS-323
Post by: MsZ on Tue 11 August 2009, 22:35
Sostituirò anche mke2fs, quello fornito da D-Link fa cose strane in fase della creazione di filesystem. Al suo posto metto mke2fs 1.41.3 compilato da me medesimo per ARM. :biggrin:
Title: Re: DNS-323
Post by: MsZ on Wed 12 August 2009, 12:52
Ho trovato la causa del superlavoro dei dischi all'avvio del DNS. E' mt-daapd, ha a che fare con iTunes.

Poco male, avevo già in programma di sradicarlo.
Title: Re: DNS-323
Post by: MsZ on Wed 30 September 2009, 18:24
Con l'ultimo firmware sto rischiando molto. Ho fatto una valanga di cambiamenti e ormai manca pochissimo. Se funziona avrò la conferma che il DNS è relativamente flessibile e tollera cambiamenti piuttosto radicali alla struttura del firmware.

Non so se l'ho già detto, ma è bene ripeterlo, anche come promemoria.
Il firmware del DNS si regge su pochi, importanti aspetti per poter continuare ad essere modificato. Ma quei pochi sono estremamente delicati.

1-Il kernel.
Il kernel è fondamentale, è il nucelo del sistema operativo, poco da fare.
2-Busybox.
Busybox sostituisce init e molte altre applicazioni fondamentali. E, in quanto init, fornisce un supporto (virtuale, il DNS in sè non ha concetto di runlevel) per una serie determinata di script. Dovrebbe essere possibile un primitivo supporto di runlevel, sebbene in Busybox non ci sia traccia di telinit. Ma non esiste solo init, ci sono tutta una serie di applet che devono esistere in Busybox per avere un sistema completo.
3-Lo script di avvio.
Lo script di avvio, /etc/rc.sh, elenca le applicazioni che devono essere avviate all'avvio del sistema. Non è un runlevel: uno script attiva applicazioni; un runlevel attiva script, che attivano variabili o applicazioni.
4-La rete.
Ovviamente, essendo il DNS un NAS (Network Attached Storage) si basa sulla rete per una comunicazione soddisfacente con le altre macchine. Se la rete è giù sono problemi seri e non si può interagire con il webserver.
5-Il webserver.
A tuttora il webserver è l'unico mezzo che conosco per aggiornare il firmware. In poche parole, se il webserver è down, non è possibile (per ora) ne aggiornare il firmware nè interagire con i comandi, la configurazione o i settaggi del DNS. Certo, c'è sempre utelnet e non è fondamentale, però è un aiuto non indifferente.

Trascurare il corretto funzionamento e una corretta configurazione di uno qualsiasi degli elementi sopra elencati significa prendersi un biglietto di sola andata per il negozio di PC a comprare un altro DNS, perchè se non c'è rete, o il kernel non funziona, o il firmware non può essere aggiornato, sono cavoli amari. L'unica alternativa è montare una porta COM seriale, ma ciò significa hackare l'hardware del DNS con equipaggiamenti e manovre un po' pericolose per la salute del NAS. In compenso poi si ha il controllo completo del dispositivo ed è possibile sbagliare quanto si vuole pur non perdendo nulla.

Ma mi sa che comunque per me sarà l'unica scelta. Hackare il DNS via rete è un po' come brancolare nel buio e sperare di non inciampare mai, il che è arduo di per sè -e allora l'unica scelta che hai è di evitare certe strade, come la ricompilazione del kernel.
Title: Re: DNS-323
Post by: franz1789 on Thu 01 October 2009, 20:11
Ma mi sa che comunque per me sarà l'unica scelta. Hackare il DNS via rete è un po' come brancolare nel buio e sperare di non inciampare mai, il che è arduo di per sè -e allora l'unica scelta che hai è di evitare certe strade, come la ricompilazione del kernel.
evitare la ricompilazione del kernel a scapito di una possibile ottimizzazione hardware?
Title: Re: DNS-323
Post by: MsZ on Thu 01 October 2009, 21:27
Mah... il kernel così com'è non è male, mi piacerebbe vedere se si può togliere qualcosa di non necessario. Ora come ora il DNS si avvia in media in 25 secondi, bisognerebbe vedere se si può accorciare 'sto tempo.
Title: Re: DNS-323
Post by: MsZ on Fri 02 October 2009, 11:53
Ho ordinato un cavo FT232R (http://parts.digikey.com/1/parts/1501995-cable-usb-serial-ttl-converter-ttl-232r-3v3-we.html) alla DigiKey, direttamente in America.

Oh, che bene. Ci metterà un po' per arrivare, però poi potrò fare tutti gli smanettamenti che mi verranno in mente :idea:
Title: Re: DNS-323
Post by: roglio on Sat 03 October 2009, 23:55
Ciao MsZ, ho appena comprato il DNS-323 e devo dire che sono veramente soddisfatto dell'acquisto.

Ho installato il fun_plug v0.5 più le estensioni e mi ci trovo molto bene.

Sono riuscito a far fare al piccolo nas praticamente tutto quello che mi interessa tranne l'automount dei dispositivi USB; il mount manuale o al reboot si, ma mi piacerebbe molto riuscire a vedere via rete il contenuto di qualsiasi hd/flash usb collegato in quel momento.

Vista la tua esperienza (hai fatto un lavoro incredibile) mi chiedevo se potevi dirmi come hai realizzato l'automount dei dispositivi usb.
Mi potresti dare qualche informazione?

Title: Re: DNS-323
Post by: MsZ on Sun 04 October 2009, 16:55
Ciao roglio, benvenuto :smile:

Il DNS ha un'architettura firmware relativamente semplice e il sistema operativo che utilizza non comprende udev. Il DNS ha due porte SATA e una porta USB. Ha una seconda USB "nascosta" che può essere resa disponibile solo con un hacking estremo. Comunque parlerò solo della USB installata dalla fabbrica.

Le periferiche di memorizzazione esterne alla RAM o alla FLASH sono solo tre: le due SATA e la USB. Le due SATA sono viste come sda e sdb. La USB è di norma la sdc. Il problema è che se tu hai un "buco" in mezzo, ovvero hai installato solo una drive SATA, la USB diventa automaticamente sdb. E se non hai SATA, la usb diventa sda. In altre parole, uno script ottimizzato dovrebbe tener conto di quale periferica è montata dove. Ti posto uno script sh che ho creato che monta tutte le partizioni della periferica USB e le rende disponibili in rete. Però parte dal presupposto che la USB sia sdc, ovvero che siano installati due drive SATA nel DNS.

(click to show/hide)

Lo script crea un file di log in /tmp, chiamato usb-share.report. Se qualcosa non funziona puoi eventualmente vedere che cosa è andato storto là dentro. Se tutto è andato bene il file dovrebbe comprendere la tabella di partizione dell'unità USB esterna.

Così com'è non è un granchè, ma se hai un po' di dimestichezza con lo scripting bash ci puoi fare tutte le modifiche che ti pare. Ma il bambino si aspetta anche che esista un modulo kernel (usb-storage.ko) indispensabile per accedere all'unità USB esterna. I controlli che fa dovrebbero essere sufficienti e anche se manca il modulo nel percorso scritto te lo dice nel file di log. Comunque se usi fun_plug puoi modificare i path di tutto e fargli vedere i file giusti al posto giusto, così che all'avvio il DNS legga ed esegua fun_plug, che richiama questo script:


Ovviamente il tutto condito con i controlli che decidi di fargli fare.

Poi dovrai riavviare smbd e nmbd per rendere effettive le condivisioni:
Code: [Select]
kill -15 $(pidof smbd)
kill -15 $(pidof nmbd)
smbd -D
nmbd -D


Ultim'ora. Ho brickato il DNS (riavvio infinito, senza dubbio ho pasticciato troppo con rc.sh) e ora mi tocca per forza aspettare che mi arrivi il materiale dall'America. Nel frattempo posso continuare a modificare gli script, ormai mi ricordo come funziona sh nel DNS. :biggrin:
Title: Re: DNS-323
Post by: roglio on Mon 05 October 2009, 00:41
Mitico! Grazie mille.

Ora smanetto e poi ti faccio sapere!

Sto cercando di capire come fa il firmware originale a capire quando viene inserita una stampante... magari riesco ad agganciare li l'automount.

Ma ora nanna. Ci penso domani.
Title: Re: DNS-323
Post by: MsZ on Tue 06 October 2009, 21:58
La porta CON4 incriminata (il rettangolino bianco verso il centro della foto).
(https://www.valeriocipriani.com/board/proxy.php?request=http%3A%2F%2Fwww.freeimagehosting.net%2Fuploads%2Fth.a598c5d7db.jpg&hash=e4e0499055ad511513b23a8d8b8b69eb79771e5b) (http://www.freeimagehosting.net/image.php?a598c5d7db.jpg)

Panoramica della scheda madre del DNS. Come vedete è tutto compreso e le due porte SATA sono all'estremità superiore della foto.
(https://www.valeriocipriani.com/board/proxy.php?request=http%3A%2F%2Fwww.freeimagehosting.net%2Fuploads%2Fth.950ad621f2.jpg&hash=d0c13bde504bf5a9ef50352d4138cc85e500fbc8) (http://www.freeimagehosting.net/image.php?950ad621f2.jpg)

La porta seriale così come sarà dopo la modifica.
(https://www.valeriocipriani.com/board/proxy.php?request=http%3A%2F%2Fwww.freeimagehosting.net%2Fuploads%2Fth.38f89ab38e.jpg&hash=34f2fc6d8df09799524b18454f271ec22c513e15) (http://www.freeimagehosting.net/image.php?38f89ab38e.jpg)
Come potete notare la fascetta di fili "spunta" senza colpo ferire da un'apertura nello chassis del DNS nel progetto originale D-Link. Sospetto che la usino per i loro test. Tx e Rx sono invertiti: TX nella seriale va a Rx del DNS e Rx dalla seriale va a Tx del DNS.

Scusate la scarsa qualità ma la macchinetta ce l'ho da poco e devo ancora imparare a usarla bene.
Title: Re: DNS-323
Post by: roglio on Thu 15 October 2009, 22:26
ciao, a che punto sei con la resurrezione?

io sto studiando hotplug per capire come implementare il mount automatico.

sono a buon punto

appena finisco aggiorno se interessa.
Title: Re: DNS-323
Post by: MsZ on Fri 16 October 2009, 00:49
Proprio in questo momento sto uppando uRamdisk via seriale, oggi mi è arrivato il cavetto della FTDI :biggrin:
Lo ripristino all'ultimo uRamdisk personalizzato sicuramente funzionante, poi vedo il risultato.

Un paio di foto:

Il prodotto finito.
(https://www.valeriocipriani.com/board/proxy.php?request=http%3A%2F%2Fwww.freeimagehosting.net%2Fuploads%2Fth.8c02373b94.jpg&hash=0273882e8a214cd1b041a613a76ff23d7c885857) (http://www.freeimagehosting.net/image.php?1453dc46fb.jpg)

Schermata di upload seriale tramite C-Kermit.
(https://www.valeriocipriani.com/board/proxy.php?request=http%3A%2F%2Fwww.freeimagehosting.net%2Fuploads%2Fth.0eb3608767.jpg&hash=a09646f3be474015aae9c5f71ebd3c0ac33d4f17) (http://www.freeimagehosting.net/image.php?0eb3608767.jpg)



Mh... dura la vedo... fargli vedere le immagini è più dura di quel che pensassi... :annoiato:
Title: Re: DNS-323
Post by: MsZ on Fri 16 October 2009, 16:53
E' vivo! E dire che me la sono complicata bene la vita!

Pare che U-Boot non sia in grado di flashare la NAND in modo soddisfacente (che roba, mi perde i dati :tdown: ) e così mi sono dovuto arrabattare. Ho caricato il kernel e il ramdisk via kermit nella RAM del DNS, li ho copiati da un'altra parte (perchè nel frattempo avevo capito che la RAM del DNS è un po' instabile e potrebbe essere sovrascritta quando meno te lo aspetti) e li ho fatti avviare. Dopo mezza giornata di tentativi sto finalmente flashando il DNS dall'interfaccia Web.

 :gogo8xe:

Mo' vediamo se mi accetta il firmware...



E' andato. Ha accettato il mio firmware e non quello della D-Link... :wub:

A breve posto come ho fatto, adesso ho altro da fare :wink:
Title: Re: DNS-323
Post by: MsZ on Fri 16 October 2009, 19:24
Allora, ricapitoliamo.

Avevo brickato il DNS, e fin qua siamo tutti d'accordo. Poi l'ho dotato di una bella porta seriale esterna di cui sopra. Infine mi è arrivao il cavetto USB->TTL della FTDI comprato dalla Digi-Key in America. Ci ho crimpato uno spinotto del telefono e sono riuscito ad entrare nel DNS in seriale.

Senonchè ho seguito pari pari le guide e ho provato a flashare il ramdisk. Al primo avvio mi da un bel Bad Data CRC, che in sostanza mi dice "Qualcosa non va qui". Mi sembra assurdo, in cento hanno provato e a me non funziona.
Bah.

Poi provo a flashare il kernel. L'avessi mai fatto. Tento di avviare e mi da Bad Data CRC anche per il kernel, e non avvia un bel ciufolo. Oh ragazzi, qua sono nei guai.
E allora non mi resta altro da fare che andare a cercare altre info. Gira che ti gira ad un certo punto mi accorgo, leggendo la memoria del DNS, che U-Boot non porta a termine il flashing della NAND. Si ferma in un punto casuale, ma non copia le immagini interamente. Il bello è che la connessione seriale funziona, ed è stabile.

Eh, allora non devo usare il flashing. Ma come usare la RAM?
Nel manuale di U-Boot c'è un comando (che si chiama loadb) che carica un file binario con il protocollo di kermit. La cosa bella è che lo posso caricare in una zona arbitraria della memoria, sia essa RAM o FLASH. E allora devo prendere la palla al balzo e usare la RAM, saltando il flashing.

Insomma, dolo alcuni tentativi sono riuscito ad avviare sia il kernel che il ramdisk da RAM ed a flashare il DNS con la mia immagine funzionante precedente (new_0.6rc1) via web. :angelnot:


Di seguito il materiale e il procedimento per aggiungere una porta seriale al DNS-323. Potrei tralasciare qualcosa di meno importante; in ogni caso il procedimento potrebbe invalidare la garanzia e, se non ve la sentite, lasciate stare.

Questi sono i software e i componenti utilizzati.

Software:

Componenti:

Io ho montato quella scatoletta perchè non volevo un DNS con "la coda USB", però, dato che come ho fatto io andreste contro a complicazioni, è più semplice montare direttamente il connettore sui fili nudi. Inoltre potete farbi più furbi e montare una bella porta seriale allo chassis del DNS come hanno fatto qui (http://picasaweb.google.com/rastislav.david/DNS323SerialLink#). Ma se usate una porta seriale usbserial e ftdi_sio vengono a cadere e basta che usiate i canonici driver seriali presenti in un qualsiasi kernel Linux là fuori.

Di tutti i fili del convertitore ne bastano quattro, da sinistra a destra:
Rosso (Vcc)
Giallo (Rx)
Arancio (Tx)
Nero (GND)

Ricordate: Vcc va a Vcc, Rxconvertitore va a TxDNS, Txconvertitore va a RxDNS e GND a GND. Quindi, non importa molto se invertite da una parte Rx o Tx, purchè lo invertiate anche dall'altra e ricordiate che Tx va a Rx e Rx va a Tx.
Non so se abbiate mai smontato un connettore come quello che ho linkato sopra, ma non mi dilungherò in spiegazioni, anche perchè il solo pensarci mi fa venire un mal di testa pari a quello che mi è venuto per crimpare e montare il connettore. Poi montate il connettore a CON4 che ho mostrato nelle foto sopra facendo attenzione a farlo passare per il piccolo buco che sta dietro al DNS-323 hardware B1, quello coperto da un tappino di gomma rettangolare. Però se lo fate con la scheda madre del DNS nuda e cruda risparmierete un sacco di grattacapi. :biggrin:


Ed ecco, più o meno passo per passo, il procedimento.

Vedrete subito che, connettendo l'USB al PC la luce del DNS si accende anche se è disconnessa l'alimentazione. E' perfettamente normale e significa che le connessioni sono attive e funzionanti. A questo punto dovreste avere ckermit compilato e installato.

Andate nella home del vostro utente e create il file .kermrc:

Code: [Select]
cat >> ~/.kermrc <<EOF
set line /dev/ttyUSB0
set speed 115200
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5
EOF

A questo punto vi potete già connettere.

Code: [Select]
kermit -c
Verrete messi davanti ad una cosa del genere:
Code: [Select]
Connecting to /dev/ttyS0, speed 115200
 Escape character: Ctrl-\ (ASCII 28, FS): enabled
Type the escape character followed by C to get back,
or followed by ? to see other options.
----------------------------------------------------

Non dovete fare altro che accendere il DNS. Vedrete quindi dei messaggi ed un conto alla rovescia:

Code: [Select]
** LOADER **
 ** MARVELL BOARD: RD-88F5181-POS-NAS LE

U-Boot 1.1.1 (Nov 13 2006 - 14:01:34) Marvell version: 1.4.2

DRAM CS[0] base 0x00000000   size  64MB
DRAM Total size  64MB
[8192kB@ff800000] Flash:  8 MB
Addresses 20M - 0M are saved for the U-Boot usage.
Mem malloc Initialization (20M - 16M): Done
*** Warning - bad CRC, using default environment


Soc: MV88F5181 Rev 3
CPU: ARM926 (Rev 0) running @ 500Mhz
SysClock = 166Mhz , TClock = 166Mhz


 Init usb device.
PCI 0: PCI Express Root Complex Interface
PCI 1: Conventional PCI, speed = 33000000
Hit any key to stop autoboot:  0
Marvell>>
Durante il conto dal 3 nella riga Hit any key to stop autoboot premete spazio e verrete messi di fronte al prompt di U-Boot.

Continua...


Fonti:
http://forum.dsmg600.info/viewtopic.php?id=4656
http://forum.dsmg600.info/viewtopic.php?id=1594
http://wiki.dns323.info/howto:install_debian
http://www.cyrius.com/debian/orion/d-link/dns-323/recovery.html
Title: Re: DNS-323
Post by: MsZ on Mon 19 October 2009, 14:52
Adesso arriva il bello.

Da tutte le altre parti ho visto che la gente riusciva a fare l'upload di kernel e ramdisk senza problemi direttamente nella flash. Però, non so perchè, a me il flashing si interrompe in posizioni casuali senza motivo particolare. So solo che il flashing tramite web funziona egregiamente e se provo a scrivere nella MTD tramite dd funziona altrettanto bene. Quindi mi verrebbe da pensare che il problema risieda in U-Boot.

A me il flashing tramite U-Boot non funziona. Quindi non posso usare U-Boot per flashare.

E allora ho dovuto pensare ad un'alternativa. Pensa che ti pensa la soluzione è stata abbastanza semplice: caricare un'immagine alla volta nell'indirizzo di memoria predefinito di loadb (0x00100000) e poi spostarle in un indirizzo di memoria più alta. Per esempio, per prima cosa carico il kernel:

loadb 00100000 [Invio]
Ctrl+\ - c
send <pathname>/uImage [Invio]


***Una piccola parentesi per loadb***

loadb carica in una porzione di memoria dei dati in arrivo tramite il protocollo kermit. Toh, che bello.
Il comando usa degli indirizzi di default. Se è usato senza argomento (o se l'argomento è un qualsiasi indirizzo di memoria) carica per default in 0x00100000. Se l'argomento è k carica per default in 0xFF820000. Se l'argomento è r carica per default in 0xFF9A0000.

Code: [Select]
loadb <argomento>
***Chiusa parentesi***

Attendo il caricamento via seriale e poi torno nel menu di U-Boot per spostare l'immagine del kernel. Uso il comando cp per copiare i dati da una zona di memoria all'altra.

c [Invio]
cp 00100000 02000000 <dimensione del kernel> [Invio]


La sintassi di cp:
Code: [Select]
cp [da] [a] [dimensione]Ogni indirizzo e dimensione di memoria deve essere espresso in base esadecimale.

Trovo la dimensione dell'immagine caricata appena mi riconnetto con kermit, in alto a destra, tra la dicitura "Total Size" e la dimensione in Bytes decimale. Poi ripeto il procedimento con il ramdisk.

loadb 00100000 [Invio]
Ctrl+\ - c (ovvero: tenere premuto Ctrl, premere backslash e poi premere 'c')
send <pathname>/uRamdisk [Invio]
c [Invio]
cp 00100000 03000000 <dimensione del ramdisk> [Invio]


Di solito uso sempre indirizzi abbastanza distanti tra loro, mai troppo in alto nella memoria. Ricordate che tutta la memoria da FF800000 a FF7FFFFF è riservata alla NAND del DNS, e se volete lavorare in RAM come vi suggerisco di fare, NON usate MAI la memoria della NAND da U-Boot.



Quando ho caricato il kernel e il ramdisk li posso avviare con il comando bootm.
Code: [Select]
Sintassi di bootm:
bootm [addr0] [addr1]
[addr0] è l'indirizzo di memoria dove sta il kernel. [addr1] è la locazione del ramdisk. E' molto semplice: U-Boot legge le regioni di memoria dove risiedono il kernel e il ramdisk, esegue il kernel, apre il ramdisk e trasferisce il controllo al kernel, che poi legge init, se c'è... e il firmware si avvia.

Nel mio caso:
bootm 02000000 03000000

Se tutto è andato bene il DNS si avvierà ed entrerà nella shell. Se avete ancora il vecchio BusyBox non corretto (quello che non vi fa entrare nella shell, non importa che cosa facciate) basta che inseriate il codice 5784468.



A questo punto non vi resta che vedere se il firmware che avete modificato vi va bene così com'è. Se non vi va bene basta che torniate in U-Boot con un semplice reboot (ricordatevi di premere spazio al conto alla rovescia) e ripetiate il procedimento di caricamento delle immagini. Se comincia a lamentersi di immagini corrotte o memoria insufficiente spegnete brutalmente il DNS staccandone l'alimentazione e riattaccatela. Cancellerete la RAM e potrete ricominciare a cuor leggero. Solo per la RAM non succede nulla.

Se vi vanno bene vi conviene usare una chiavetta USB per trasferire manualmente le immagini dal PC al DNS (formattatela con ext2 o ext3), accedete tramite seriale e montate la chiavetta. Poi usate il buon vecchio dd per trasferire i dati. Prima è più prudente cancellare le partizioni flash dove risiedevano i vecchi dati.

Code: [Select]
dd if=/dev/zero of=/dev/mtdblock2 bs=1k count=1536
dd if=/dev/zero of=/dev/mtdblock3 bs=1k count=6016
dd if=<path>/uImage of=/dev/mtdblock2 bs=1k
dd if=<path>/uRamdisk of=/dev/mtdblock3 bs=1k

Flashate le immagini SOLO se siete assolutamente sicuri che funzionino e che vogliate effettivamente flashare le nuove funzionalità che avete implementato, o che vogliate cancellare delle cose che non vi vanno bene.



Creare le immagini U-Boot
Sia che vogliate inserire uImage o uRamdisk avete bisogno di mkimage. Lo trovate nei sorgenti del DNS, nella directory di u-boot. Troverete le istruzioni di compilazione nei sorgenti, dovrebbe essere abbastanza semplice.
mkimage si troverà nella directory tools dell'albero dei sorgenti di U-Boot. Copiatelo da root in /usr/sbin (o dovunque voi vogliate, basta che compaia nella variabile di ambiente PATH).

Per creare uImage è abbastanza semplice, sempre nei sorgenti del DNS troverete i sorgenti modificati del kernel Linux dove potrete compilare una variante ARM. Dopo averlo configurato con make menuconfig potrete generare direttamente uImage:

Code: [Select]
make uImage
Dategli da fare anche un make modules se avete creato dei moduli, ma vi consiglierei di tenere tutto built-in, sarà più facile e non dovrete poi dire al DNS di caricare moduli che magari non userete nemmeno. Un'eccezione si può fare per moduli particolarmente voluminosi come xfs.ko, e allora li separate e li mettete nel ramdisk caricandoli poi durante l'avvio con una riga in rc.sh.

Per installare i moduli in una directory interna all'albero dei sorgenti (come consiglio) create la directory di destinazione dei moduli e usate la variabile INSTALL_MOD_PATH con la directory appena creata:

Code: [Select]
make INSTALL_MOD_PATH=<directory> modules_install
e dovrebbe installare tutti i moduli nella directory. E anche se dice che "non esiste la directory /lib/modules" eccetera voi potete strafregarvene perchè l'unica cosa che vi interessa è strappare i moduli e metterli dove volete, perchè poi tanto li caricherete a mano.
uImage sta in arch/arm/boot nella directory dei sorgenti di Linux, pronta per essere usata. Riferitevi alle dimensioni massime delle immagini riportate sotto per avere un'idea di che cosa mettere o che cosa non mettere nel kernel.
Un suggerimento: per rendere il ramdisk più "leggero" (che consiglio, dato che poi potrete far fare al vostro DNS bene o male quello che vorrete) cercate di integrare nel vostro kernel più cose possibili, lasciandone fuori solo lo stretto indispensabile o le cose più grosse.

Questo per quanto riguarda il kernel. uRamdisk si fa in modo diverso.
Se avete seguito quanto vi ho detto adesso mkimage sta in una directory elencata in PATH. Allora potete direttamente eseguire il seguente comando:

Code: [Select]
mkimage -a 0x800000 -e 0x800000 -A arm -O linux -T ramdisk -n 'boot ramdisk' -C gzip -d <ramdisk gzippato> uRamdisk
e avrete il vostro uRamdisk bello e pronto. Però prima bisogna fare due cose, non semplici. Una è generare il filesystem cramfs in cui metterete le applicazioni non essenziali, e l'altra è generare il filesystem ext2 su file in cui copiare la struttura del firmware, e gzipparlo.

Continua...



Dimensioni massime immagini:
Title: Re: DNS-323
Post by: MsZ on Mon 19 October 2009, 18:56
Piccola digressione.

Ho fabbricato un kernel a mano e funziona! Si vede che ho beccato la combinazione giusta per la lettura del MTD. E' più difficile di quanto pensassi, ma è bastato leggere bene il dmesg originale per riuscire a tirar fuori qualche cosa di buono.

Oh, finalmente. La versione 0.6rc3 sta per arrivare con XFS e VFAT nativi.
Title: Re: DNS-323
Post by: MsZ on Mon 19 October 2009, 20:38
***Creare uRamdisk***

uRamdisk è l'immagine del filesystem che accompagna il kernel nel DNS. Senza filesystem il kernel è incompleto e senza kernel il filesystem non funziona. Quindi, se dovete flashare uno è meglio che aggiorniate (se necessario) e flashate (se lo aggiornate) anche l'altro. Come sempre, previa prova in RAM come descritto sopra.

Allora, per creare uRamdisk dovete prima di tutto tenere presente che in esso c'è un file, chiamato image.cfs, che è un filesystem di tipo cramfs (http://sourceforge.net/projects/cramfs/). Inutile dire che il vostro sistema operativo (e quindi il vostro bel kernel *NIX) lo deve supportare. E' meglio che vi riferiate a questo messaggio (http://www.darkforge.it/board/index.php?topic=1065.msg8590#msg8590) per informazioni su come leggere il firmware ufficiale per avere un'idea di che cosa c'è dentro image.cfs.

Insomma, dovete supportare cramfs e avere mkfs.cramfs tra le vostre innumerevoli applicazioni. Poi, avendo la vostra brava directory di utility estratta da image.cfs ne modificate quello che volete e fate:
Code: [Select]
mkfs.cramfs <directory> <file_destinazione>dove <directory> è la directory delle utility e <file_destinazione> è il file compresso che ospita cramfs. Esso dovrà essere posto nella directory radice del ramdisk.



In genere nel filesystem cramfs trovate questa roba:
LPRng   codepages   driver      language   lltd   sbin   shared_name   web
bin   default      etc_codepage   lib      samba   scsi   upnp      web_page


E nella radice:
bin      dev   home      lib      mnt   root   sys   usr   web
busybox   etc   image.cfs   lost+found   proc   sbin   tmp   var   welcome.msg


Durante l'avvio il kernel monta il ramdisk e subito dopo monta via loopback image.cfs come cramfs, da cui collega le utility.

Una volta messo image.cfs nella radice creiamo il ramdisk ext2 con i seguenti passi:


E poi eseguiamo il comando di mkimage due post sopra, e carichiamo uRamdisk tramite seriale.
Bon, per il momento dovrebbe essere tutto quello che so fare. Appena posso posto il nuovo firmware, con kernel... fatto in casa :gogo8xe:
Title: Re: DNS-323
Post by: MsZ on Tue 20 October 2009, 23:13
Come promesso, ecco il nuovo firmware. Nuovo scintillante, dovrebbe essere pure un po' più veloce. Ovviamente non serve che vi dica due cose:


Il mio DNS è un B1 e il flashing via web del firmware ha dato esito positivo.
Godetevi il changelog. :happy:

Quote
--- Version 0.6rc3 : Serial, Finally
[FIX] Restored image.cfs/sbin/daylight
[NEW] Brand New Kernel!!!
[NEW] XFS support
[NEW] VFAT support
[FIX] Fixed some kernel lines
[FIX] Fixed some busybox lines
[DEL] Removed printer support
[DEL] Removed ping output (XXX is alive!/No response from XXX)
[DEL] Removed CIFS support
[DEL] Removed CFQ scheduler from kernel
[ADD] Added directory image.cfs/modules
[ADD] Added clear applet
[ADD] Added su applet
[ADD] Added hwclock applet
[ADD] Added cursor optimization for vi
[ADD] Support for Large Block Devices (>2TB disks)
[ADD] Support for Large Single Files (>2TB files)
[FIX] Using rdate to syncronize time
[FIX] Removed wrongdate check at startup

[TODOS]
 ° This one is stable, and I managed to build a working
   ARM 2.6.12.6 custom kernel.
 ° Next time I have to substitute some D-Link binary blobs with some scripting
   and enforcing security (serial connection needs su and a normal user)
 ° Need to make crond less annoying
 ° Need to rewrite fscheck.sh from scratch
 ° Need to control raider & usb-share

E' stato un po' complicato far vedere le unità MTD al kernel, ma alla fine penso di avere trovato la configurazione giusta.

La potete vedere se entrate nel DNS tramite telnet:
Code: [Select]
telnet 192.168.0.32Come nome utente usate root e poi scrivete:
Code: [Select]
zcat /proc/config.gz | more
Title: Re: DNS-323
Post by: MsZ on Wed 21 October 2009, 20:57
Temo di aver brickato definitivamente il DNS... probabilmente ho giochicchiato troppo con la seriale.
Vedo se riesco a recuperarlo in qualche modo... :timoroso:
Title: Re: DNS-323
Post by: deejaysound on Thu 22 October 2009, 22:18
Ciao MsZ

....scusa l'intrusione, ma vorrei cercare di seguire il tuo progetto!!

Siccome però sono curioso di vedere come funziona il tuo nuovo firmware, vorrei provare a montarlo nel mio DNS.

Attualmente ho montata la versione del firmware 1.07, secondo te posso metterci sopra direttamente  la tua versione, oppure è meglio se prima faccio il downgrade alla 1.05?

Ciao e grazie!
Title: Re: DNS-323
Post by: MsZ on Thu 22 October 2009, 23:41
Non dovrebbe essere un problema anche se flashi la mia versione (che non è altro che una versione modificata della 1.05) direttamente sopra la 1.07, ma ti prego di ricordare che, se decidi di farlo e qualcosa non funziona più come prima, e prima ti andava bene, non potrai ritenermi responsabile di quello che più non ti funziona, perchè questo firmware l'ho modificato sulle mie esigenze, e sei tu che prendi la decisione di flashare un firmware piuttosto che un altro. E il mio firmware non è ufficiale della D-Link, quindi se ti va storto qualcosa e hai su il mio firmware è alquanto improbabile che la garanzia ti copra.

Inoltre ricorda che il mio DNS è ancora indisposto: cercherò di recuperarlo, ma se non riesco non credo che riprenderò in mano il progetto tanto presto, anche perchè non mi posso permettere un nuovo DNS al momento.
Title: Re: DNS-323
Post by: deejaysound on Fri 23 October 2009, 17:28
Grazie mille per la risposta!

Tranquillo, so bene che non copre queste cose la garanzia.... anche se potrei dimostrare come questo non sia stato proprio del tutto vero in piu di un occasione!   :tup:

Male che dovesse andare proverò a recuperarlo con la seriale o Jtag, non ricordo....

A proposito, proprio in questi giorni stò cercando di resuscitare (tramite JTAG) un nas Terastation di un cliente che è deceduto dopo un aggiornamento firmware finito male... spero di riuscirci! :think:
Title: Re: DNS-323
Post by: roglio on Sat 31 October 2009, 11:14
Ciao MsZ, mi dispiace per il tuo nas, speriamo che riesci a recuperarlo.

Se per caso non lo sapessi, volevo informarti che la dlink ha rilasciato i sorgenti gpl usati nella versione 1.06

Li trovi a questo link ftp://ftp.dlink.com/GPL/DNS-323/106/dns323_GPL_v1.06_12032008.tgz (http://ftp://ftp.dlink.com/GPL/DNS-323/106/dns323_GPL_v1.06_12032008.tgz)

Praticamente li rilasciano ad un anno di distanza dalla release  :sad:

In bocca al lupo!
Title: Re: DNS-323
Post by: MsZ on Sun 01 November 2009, 18:58
Mh, non credo. Di installare una JTAG non ho nessuna voglia, e continua a non dare segni di vita. Quindi ho deciso di cambiare e di costruire un NAS da uno Shuttle K48 (http://www.shuttle.eu/products/barebones/k48/).

Ci installo una Gentoo e la modifico a seconda dei miei bisogni. Sono avvantaggiato perchè parto da zero e ho a disposizione tutti gli strumenti free software che voglio, da compilare come voglio. Intanto devo installarlo e farlo partire, poi vedremo.


Se vorrete continuare ad utilizzare i firmware presenti qui fate pure, sempre tenendo a mente le precauzioni che vi ho elencato. Chiudo il thread perchè ormai credo di non avere più molto da dire, a meno che qualcuno non voglia prendere in mano il progetto... basta che mi invii un PM e possiamo discuterne.


:happy: