Utilizza in modo sicuro le schede SD quando l'alimentazione può essere interrotta in qualsiasi momento


10

Stiamo lavorando su un piccolo sistema Linux incorporato (2.6.35-ish) con un dispositivo NAND interno piccolo per il sistema operativo e le applicazioni (250-500Meg) e una scheda SD con schede SD SDHC da 8 GB per i dati.

L'alimentazione dell'unità può essere interrotta in qualsiasi momento.

Il sistema deve archiviare i dati su schede SD. Questi dati sono piuttosto importanti ... è l'intero scopo del sistema. I sistemi sono di solito completamente disconnessi da qualsiasi rete in posizioni remote e i dati vengono recuperati tramite sneakernet ogni 4-8 settimane.

Attualmente, abbiamo semplicemente VFAT sulle schede SD. Ciò è avvenuto principalmente per consentire ai primi client di test di copiare facilmente i dati manualmente sui loro laptop Win7.

Tuttavia, ora sono preoccupato che sia solo questione di tempo fino a quando un'interruzione di corrente nel momento sbagliato provoca la perdita di dati.

Qual è il modo migliore per configurare un tale sistema per prevenire la perdita di dati? JFFS2 suona come quello che vorrei in termini di come scrive i dati (e le esigenze in termini di prestazioni non sono affatto elevate), ma sembra abbastanza faticoso usare block2mtd, ecc. Non sono anche sicuro di come interagirà il livellamento dell'usura della carta con esso.

Qual'è il miglior modo per farlo?

MODIFICARE

Sto pensando di lasciare il filesystem VFAT e allocare file di dimensioni giornaliere alla volta, pieni di 0xFF, che dovrebbero limitare notevolmente l'esposizione ai guasti del ciclo di alimentazione. Potrei quindi solo aggiungere record all'interno di quei blocchi precreati, e spero che le schede SD non siano così stupide da cancellare / indossare scritture di livello in regioni 0xFF.

Posso usare noatime, ma esiste un equivalente nomtime VFAT per impedire le scritture nel campo orario modificato? Avrei bisogno di un modo per impedire qualsiasi aggiornamento dei metadati fino a quando non viene creato il file di un nuovo giorno.

MODIFICA 2

Qualcuno sullo scambio di stack elettronici mi ha ricordato che ci sono anche dati ECC su NAND, quindi non c'è modo di impedire la necessità di una cancellazione.

Quindi, JFFS2 tramite block2mtd sarebbe appropriato in questa situazione?

MODIFICA 3

È peggio di quanto pensassi. Le schede SD che ho cancelleranno i blocchi di dati anche se scrivi esattamente gli stessi contenuti su disco. I blocchi di cancellazione sono 64 KB, ed è troppo grande per ritardare del tutto le scritture. Memorizzerò fino a 128 KB di dati nella memoria flash NAND (di cui posso controllare il comportamento in scrittura), in una specie di journal, quindi scriverò blocchi da 128 KB in un file allineato a 128 KB in una partizione VFAT sulla scheda SD (in caso altre schede SD hanno 128 KB di cancellazione).


1
"speriamo che le schede SD non siano così stupide ..." <--- ROFLOL. Probabilmente!
derobert il

Fino a quando non trovi una soluzione completa al problema che hai, usa il synccomando dopo ogni scrittura sulla scheda SD, scriverà i bit immediatamente dopo averli cambiati / creati senza memorizzarli nella RAM in modo che le tue modifiche siano almeno sulla scheda e non sarebbe andato dalla perdita di potenza.
Hanan N.

syncprobabilmente peggiorerebbe le cose, poiché aumenta la frazione di tempo in cui i metadati sono a metà aggiornamento.
Ben Voigt,

Risposte:


5

Bene, il modo in cui puoi risolvere questo problema è quello di risolvere il problema "l'alimentazione può essere interrotta in qualsiasi momento". È impossibile aggiungere anche solo un minuto di carica della batteria?

In alternativa, forse potresti usare due schede SD. Scrivi i dati su una scheda, sincronizza, scrivi sull'altra. Ogni blocco dei tuoi dati avrebbe bisogno di un checksum e di un numero di blocco, ma poi anche con qualche sfortuna piuttosto sfortunata, una delle carte dovrebbe avere ragione.

Il tuo problema di base sarà il livellamento dell'usura sulle schede SD, che AFAIK dipende dal fornitore della scheda (e forse anche dal batch, possono cambiarlo ogni volta). Probabilmente non gestisce correttamente l'interruzione dell'alimentazione. E a seconda di ciò che fa, ciò potrebbe non significare solo corrompere il blocco in cui stai scrivendo.

  1. Supponiamo una carta banalmente piccola: 3 blocchi (flash). Il blocco 1 ha ricevuto più scritture di 2 o 3. Chiamerò i blocchi fisici per numero e i blocchi logici A, B, C per lettera. In questo momento, A = 1, B = 2, C = 3.
  2. Emetti una scrittura per bloccare A. La scheda SD è come aha! abbiamo bisogno di livellare l'usura qui, altrimenti il ​​blocco 1 si consumerà prima di 2 e 3. Decide di scambiare i blocchi 1 e 2.
  3. Legge il blocco 1 nella posizione RAM i (sulla scheda SD, non nella RAM di sistema). Aggiorna la parte che si desidera modificare.
  4. Legge il blocco 2 in posizione RAM ii
  5. Cancella il blocco 1
  6. Scrive la posizione RAM ii nel blocco 1.
  7. Aggiorna la tabella di mappatura per dire B = 1
  8. Cancella il blocco 2.
  9. Scrive la posizione RAM i nel blocco 2.
  10. Aggiorna la tabella di mappatura per dire A = 2

Naturalmente, "aggiorna la tabella di mappatura" non è sempre banale. E l'ordine di 5–10 potrebbe essere diverso (se tutti completano, non importa, bene le cancellazioni devono venire prima delle scritture, ovviamente). Ma si verifica un'interruzione di corrente, potresti finire con A non solo corrotto (come previsto) ma anche con B. Oppure, se si verifica un'interruzione dell'alimentazione durante un aggiornamento della mappatura, chissà quale tipo di corruzione causerà.


1
Queste unità devono vivere in ambienti relativamente difficili per molti anni e una volta installate verranno spedite in vari paesi per i quali preferiremmo non qualificare le batterie. Probabilmente abbandoneremmo MMC / SD e costruiremmo la nostra soluzione NAND-flash prima di usare una batteria.
Darron,

Bene, nel nostro caso la soluzione "correggi la potenza può essere interrotta in qualsiasi momento" si riduce a "impedire ai camionisti di addormentarsi al volante e guidare nei nostri dispositivi". "Un camion si è schiantato contro di esso" riguarda in realtà la modalità di guasto più comune.
SF.

1
Non è necessario un minuto di carica della batteria. La quantità di energia necessaria per smontare in modo sicuro una scheda SD dovrebbe rientrare nell'intervallo che un condensatore può memorizzare.
Ben Voigt,

4

Qualcosa di simile è stato discusso in electronics.stackexchange.com: come posso proteggere la scheda SD da interruzioni di corrente impreviste?

Una risposta laterale che funziona in tandem con le soluzioni software è guardare l'hardware (c'era anche una domanda su ESE su questo, ma non riesco a trovarlo ora; non si trattava rigorosamente di schede SD, solo di dispositivi che perdono energia e come rilevare questo e agire su di esso).

La storia breve è: potresti non avere la carica della batteria, ma il tuo alimentatore ha alcuni condensatori abbastanza grandi per lisciare l'alimentazione. Fondamentalmente, il potere non si spegne. La tensione si assottiglia. Probabilmente esiste un circuito integrato / circuito di protezione brown-out che asserisce il segnale RESET sul sistema incorporato quando la tensione scende al di sotto di un certo punto. Le schede madri per PC hanno anche quelle e rispondono al segnale "POWEROK" dell'alimentatore. Ciò significa che, quando l'alimentazione si interrompe, il computer verrà arrestato forzatamente per alcuni millisecondi prima che la tensione scenda al di sotto dei livelli di sicurezza. Durante questo periodo, periferiche come le schede SD sono ancora accese, ma non ci sono più transazioni provenienti dal computer.

È molto probabile che una scheda SD abbia abbastanza tempo per completare tutte le transazioni in sospeso, incluso il livellamento dell'usura, prima che si spenga. Migliorare l'alimentatore con un condensatore abbastanza grande o usarne uno vicino alla scheda SD può essere d'aiuto, ma puoi sempre sperimentare la tua piattaforma così com'è. È abbastanza probabile che mantenga il potere per un tempo sufficiente.

Se l'aspetto hardware del problema non è un problema, è possibile risolvere solo quelli software. Gli ideali di derobert sull'uso di due schede per la ridondanza non sono male e l'uso di un filesystem standard come VFAT corre meno il rischio di confondere gli algoritmi di livellamento dell'usura della scheda.

Ad ogni modo, potrebbe anche darsi che non avrai così tanti problemi. Supponendo che un blocco sulla tua carta possa sopravvivere a 100 scritture (conservativo - ma cerca di ottenere carte di buona qualità!), E usando carte da 8 GB, avrai scritto 800 GB quando il primo blocco muore (statisticamente parlando, ovviamente).


La domanda è stata avviata perché stavo già subendo un grave danneggiamento della scheda SD in caso di spegnimento degli eventi. Abbastanza spesso, in realtà. Forse 1 su 20 eventi di interruzione di corrente sono stati catastrofici e forse 1 su 4 ha causato almeno ALCUNI danno. Alla fine sono passato alla memorizzazione dei dati di un giorno sul flash NAND interno e alla copia su SD a mezzanotte (un'operazione di circa 1 secondo). Sto cercando di migliorare le cose in futuro. Ho già un valore di 400uF di tappi sul binario ... non abbastanza, a quanto pare ... forse il brownout non viene gestito correttamente.
darron,

È un tasso di incidenza piuttosto elevato! Tempo per ottenere le sonde dell'oscilloscopio e vederlo in azione, penso. Sebbene sia probabile che tu possa aggirarlo nel software, il modo migliore in termini di consumo energetico è assicurarti di non avere problemi hardware. Forse potresti coprire le tue scommesse e chiedere anche su electronics.stackexchange.com ?
Alexios,

@darron, quale soluzione hai trovato per il tuo problema di archiviazione della scheda SD? Stai ancora scrivendo su NANDFlash per poi copiarlo una volta al giorno? Ho un design con scheda SD come RFS principale (nessun NANDFlash separato) e vedo problemi di corruzione dei dati, sia con che senza improvvise condizioni di mancanza di corrente.
Fred Basset,

4

Abbiamo avuto un problema con il nostro file system SD, ext2 root danneggiato in caso di interruzione improvvisa dell'alimentazione. Prima di tutto, facciamo funzionare il sistema con un mount root di sola lettura. Dato che avevamo bisogno di un po 'di spazio di archiviazione scrivibile (ma non eravamo di registrazione dei dati) abbiamo impostato una seconda partizione come scrivibile. Per ridurre al minimo il danno di FS in caso di interruzione di corrente imprevista, abbiamo reso questa una partizione ext3, anche se ciò causerà almeno il doppio del numero di scritture fisiche sulla scheda. Questa combinazione (ma ammetto che le nostre scritture della seconda partizione sono poco frequenti rispetto a un data logger) sembra funzionare senza problemi. Finora. (Sistemi installati per circa 30 mesi in strutture professionali)


3

Per la sicurezza dei dati in un ambiente con la possibilità di interruzioni di corrente e la sicurezza generale dei dati è necessario considerare ancora più punti.

Non utilizzare celle MLC per l'archiviazione, solo SLC ha un tempo di conservazione dei dati che è sufficiente. Quindi quelle schede SLC possono avere un firmware intelligente, alcune non possono in alcun modo essere danneggiate dalla perdita di potenza. Riconoscono la mancanza di corrente misurando e assicurando che l'ultimo blocco sia stato scritto completamente.

Quelle carte sono più costose e un po 'più lente delle celle MLC. Vedi i fornitori come swissbit per le carte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.