Author Topic: DNS-323  (Read 28848 times)

0 Members and 1 Guest are viewing this topic.

Offline roglio

  • Nuovo iscritto
  • Posts: 5
Re: DNS-323
« Reply #20 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?


Offline MsZ

  • Il Manutentore
  • Militante
  • ******
  • Posts: 913
  • GNUru Meditation
Re: DNS-323
« Reply #21 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:

  • carica il modulo usb-storage nel kernel,
  • verifica che sdc sia partizionato e formattato,
  • faccia la scansione delle partizioni e dei filesystem,
  • crei le directory di montaggio delle partizioni nell'USB,
  • le monti automaticamente,
  • modifichi /etc/smb.conf in modo da condividere immediatamente le unità in rete.

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:
« Last Edit: Sun 04 October 2009, 17:02 by MsZ »

Offline roglio

  • Nuovo iscritto
  • Posts: 5
Re: DNS-323
« Reply #22 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.

Offline MsZ

  • Il Manutentore
  • Militante
  • ******
  • Posts: 913
  • GNUru Meditation
Re: DNS-323
« Reply #23 on: Tue 06 October 2009, 21:58 »
La porta CON4 incriminata (il rettangolino bianco verso il centro della foto).


Panoramica della scheda madre del DNS. Come vedete è tutto compreso e le due porte SATA sono all'estremità superiore della foto.


La porta seriale così come sarà dopo la modifica.

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.

Offline roglio

  • Nuovo iscritto
  • Posts: 5
Re: DNS-323
« Reply #24 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.

Offline MsZ

  • Il Manutentore
  • Militante
  • ******
  • Posts: 913
  • GNUru Meditation
Re: DNS-323
« Reply #25 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.


Schermata di upload seriale tramite C-Kermit.




Mh... dura la vedo... fargli vedere le immagini è più dura di quel che pensassi... :annoiato:
« Last Edit: Fri 16 October 2009, 02:52 by MsZ »

Offline MsZ

  • Il Manutentore
  • Militante
  • ******
  • Posts: 913
  • GNUru Meditation
Re: DNS-323
« Reply #26 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:
« Last Edit: Fri 16 October 2009, 16:56 by MsZ »

Offline MsZ

  • Il Manutentore
  • Militante
  • ******
  • Posts: 913
  • GNUru Meditation
Re: DNS-323
« Reply #27 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:
  • ckermit
    ckermit è un programma per dialogare via porta seriale e trasferire dati, ma non solo.
    Nel sito trovate binari e sorgenti. kermit è distribuito gratuitamente sotto licenza kermit.
  • Dovete avere il supporto usbserial e ftdi_sio compilati nel kernel.
    Non è importante che siano built-in o modulari, l'importante è che Linux capisca che quello che avete
    appena inserito nella porta USB è un convertitore USB->seriale. Non serve scaricare nulla, se avete un kernel
    2.4 o successivo.

Componenti:
  • Convertitore USB->TTL (FTDI)
    Il convertitore è un minuscolo chip montato all'interno del connettore USB e traduce il protocollo USB in protocollo seriale.
  • Connector housing 4 positions 1,25mm (Molex)
    Ne basta uno. E' un connettore a 4 posizioni molto piccolo, probabilmente lo avete visto nei cavetti
    che connettevano i lettori CD alla scheda madre per portare il segnale audio digitale dal CD audio alla scheda audio.
  • Terminazioni femmina 28-32AWG
    Sono molto piccoli e difficili da maneggiare e crimpare. Ne servono quattro per connettore.

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

Offline MsZ

  • Il Manutentore
  • Militante
  • ******
  • Posts: 913
  • GNUru Meditation
Re: DNS-323
« Reply #28 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:
  • uImage: 1572864 byte -> 0x180000 byte
  • uRamdisk: 6160384 byte -> 0x5e0000 byte

Offline MsZ

  • Il Manutentore
  • Militante
  • ******
  • Posts: 913
  • GNUru Meditation
Re: DNS-323
« Reply #29 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.

 

Creative Commons License All ValerioCipriani.com contents are published according to Creative Common License, except different instructions. The Staff is not responsible of eventually guide, article and publishing mistakes. All published items are patent free. All trade marks reported are right reserved. Contact us, Info.