emFile RAID 5
Sebbene l’acronimo R-A-I-D derivi da Redundant Array of Independent (originariamente Inexpensive) Disks, i termini “recuperabile” e “replicabile” sono più accurati di “ridondante”. Storicamente, i dispositivi di archiviazione sono stati i dischi rigidi. Nelle applicazioni embedded, questi possono essere qualsiasi tipo di dispositivo di memoria (NAND, NOR, SD) e, date le dimensioni del sistema, l’archiviazione è raramente “indipendente”. Tuttavia, la terminologia standard rimane RAID. Invece di disco o drive, il termine più pertinente, specialmente per i sistemi embedded, è “partizione”.
Una partizione è una sezione di un dispositivo di archiviazione che viene trattata dal sistema operativo come se fosse un dispositivo separato. Sia il RAID1 che il RAID5 archiviano i dati su più partizioni, in modo che i dati originali possano essere recuperati o replicati in caso di guasto di un’unità di memoria.
Caratteristiche principali
- Aumenta la capacità di archiviazione utilizzabile rispetto al RAID 1.
- Fornisce protezione da difetti/guasti del dispositivo di memoria.
- Funziona a livello di storage sia con file system FAT che EFS.
- Può essere utilizzato con qualsiasi dispositivo di archiviazione supportato da emFile (come schede NAND, NOR e SD).
- Consente l’uso di diversi tipi di memoria per le partizioni.
- Permette di collocare tutte le partizioni sullo stesso dispositivo di archiviazione.
RAID 5 – Teoria del funzionamento
Il RAID 5 richiede almeno tre partizioni di memoria. Uno spazio di archiviazione equivalente alla dimensione di una partizione viene utilizzato per le informazioni di controllo della parità, rendendolo non disponibile per l’archiviazione dei dati. Il controllo di parità consiste nell’aggiunta di un’informazione extra (il risultato di una formula) che può essere utilizzata per replicare i dati in caso di difetto o guasto hardware. La capacità di archiviazione richiesta per i dati di parità può essere ridotta aumentando il numero di partizioni, incrementando così la capacità totale disponibile.
L’add-on RAID 5 calcola le informazioni di parità utilizzando la funzione “eXclusive Or” (XOR). Il risultato di una funzione XOR eseguita su un qualsiasi numero di input è tale che, se un input viene perso (ovvero una partizione si guasta), l’informazione mancante può essere ricalcolata (cioè recuperata o replicata) utilizzando il risultato XOR e gli altri input noti.
RAID 5 vs RAID 1
Il RAID 1 utilizza il mirroring (rispecchiamento) per consentire il recupero dei dati. Una copia di tutti i dati sulla partizione master viene mantenuta su una partizione separata chiamata mirror. Il master e il mirror possono trovarsi sullo stesso dispositivo di archiviazione o su dispositivi separati. In caso di guasto hardware sulla partizione master, i dati possono essere recuperati dalla partizione mirror.
Il RAID 5 distribuisce i dati su diverse partizioni e utilizza il controllo di parità. Il salvataggio di un controllo di parità, anziché di una copia completa dei dati, riduce la quantità di memoria necessaria per ricreare i dati originali in caso di necessità.
Nota: Il RAID 5 utilizza meno spazio di archiviazione per ottenere la stessa sicurezza dei dati del RAID 1. Questo può essere un vantaggio cruciale in ambienti con risorse limitate. Il RAID 1 è leggermente più veloce del RAID 5 perché esegue meno funzioni per garantire la sicurezza dei dati.
RAID con il driver NAND di SEGGER
Il driver proprietario Universal NAND Flash di SEGGER è il migliore della categoria per velocità, efficienza, affidabilità e protezione dei dati. È stato ottimizzato per utilizzare la minor quantità possibile di RAM e ROM mantenendo prestazioni elevate.
Può correggere errori di bit singoli o multipli utilizzando l’ECC (codice di correzione degli errori) hardware integrato nella flash NAND o routine ECC software fornite dalla libreria emLib ECC. I driver NAND utilizzano il wear leveling (livellamento dell’usura) attivo e passivo, la gestione dei blocchi danneggiati (bad-block management) e sono fail-safe. L’add-on RAID fornisce un ulteriore livello di precauzione a un sistema già robusto, massimizzando l’integrità dei dati.
Il driver NAND e il RAID lavorano insieme per evitare la perdita di dati quando si verifica un errore di bit non correggibile durante un’operazione di lettura. In tal caso, il driver Universal NAND richiede all’add-on RAID 5 di fornire i dati del settore corretti dalle altre partizioni. Questa procedura si applica sia alle richieste di lettura provenienti dal file system, sia alle operazioni di lettura interne eseguite dal driver quando i dati di un blocco NAND vengono copiati in un’altra posizione.
Sincronizzazione dei dati dei settori
Un reset imprevisto che interrompe un’operazione di scrittura può causare incoerenza dei dati. È possibile che sul dispositivo venga aggiornato solo il dato dell’ultimo settore scritto, mentre l’informazione di parità no. Dopo il riavvio, il file system continuerà a funzionare correttamente, ma in caso di errore di lettura su quel settore (o su qualsiasi settore nella stessa stripe), il componente RAID 5 non sarà in grado di recuperare i dati, il che potrebbe causare una corruzione.
Questa situazione può essere prevenuta eseguendo una sincronizzazione di tutti i settori sul volume RAID 5 tramite la funzione API FS_STORAGE_SyncSectors(). Questa operazione può essere eseguita all’inizializzazione del file system o in parallelo alle normali attività, ad esempio in un task a bassa priorità.
Esempio di configurazione
Il seguente frammento di codice mostra come configurare l’add-on RAID 5 utilizzando tre partizioni situate sullo stesso dispositivo flash NAND.
/*********************************************************************
*
* Definizioni configurabili
*
**********************************************************************
*/
#define ALLOC_SIZE 0x8000 // Dimensione del pool di memoria in byte
/*********************************************************************
*
* Dati statici
*
**********************************************************************
*/
static U32 _aMemBlock[ALLOC_SIZE / 4]; // Pool di memoria per allocazione semi-dinamica.
/*********************************************************************
*
* FS_X_AddDevices
*
* Descrizione funzione
* Chiamata dal File System durante FS_Init().
* Aggiunge tutti i dispositivi usando primariamente FS_AddDevice().
*/
void FS_X_AddDevices(void) {
//
// Assegna memoria al file system per il funzionamento.
//
FS_AssignMemory(&_aMemBlock[0], sizeof(_aMemBlock));
//
// Aggiunge e configura il volume RAID5. Nome volume: "raid5:0:"
//
FS_AddDevice(&FS_RAID5_Driver);
FS_RAID5_AddDevice(0, &FS_NAND_UNI_Driver, 0, 0);
FS_RAID5_AddDevice(0, &FS_NAND_UNI_Driver, 0, 1000);
FS_RAID5_AddDevice(0, &FS_NAND_UNI_Driver, 0, 2000);
FS_RAID5_SetNumSectors(0, 1000);
//
// Aggiunge e configura il driver NAND. Nome volume: "nand:0:"
//
FS_AddDevice(&FS_NAND_UNI_Driver);
FS_NAND_UNI_SetPhyType(0, &FS_NAND_PHY_ONFI);
FS_NAND_UNI_SetECCHook(0, &FS_NAND_ECC_HW_NULL);
FS_NAND_UNI_SetBlockRange(0, 0, NAND_NUM_BLOCKS);
FS_NAND_ONFI_SetHWType(0, &FS_NAND_HW_K66_SEGGER_emPower);
}
