emFile RAID 1
RAID 1 – Teoria del funzionamento
Il RAID 1 utilizza il “mirroring” per consentire il recupero dei dati. Una copia di tutti i dati presenti sulla partizione master viene mantenuta su una partizione separata chiamata mirror. Il master e il mirror possono risiedere sullo stesso dispositivo di memorizzazione o su dispositivi separati. In caso di difetto hardware o guasto sulla partizione master, i dati possono essere recuperati dalla partizione mirror.
- Scrittura: Su una richiesta di scrittura del file system, i dati del settore vengono scritti contemporaneamente sia sul master che sul mirror.
- Lettura: Su una richiesta di lettura, l’add-on RAID 1 legge i dati dal master. In caso di errore di lettura, i dati vengono prelevati dalla partizione mirror. Il dato viene così recuperato e non viene segnalato alcun errore al file system.
Il RAID 1 può essere configurato per archiviare i dati su un unico dispositivo o su due distinti. Se si utilizza un singolo dispositivo, la prima metà viene usata come partizione master. Quando si usano due dispositivi diversi, le dimensioni dei volumi non devono necessariamente corrispondere: il numero di settori disponibili per il file system sarà pari a quello del dispositivo più piccolo. È tuttavia richiesto che la dimensione del settore sia identica per entrambi i dispositivi.
Recupero errori NAND flash
Il driver Universal NAND può utilizzare l’add-on RAID 1 per evitare la perdita di dati quando si verifica un errore di bit non correggibile durante un’operazione di lettura. In questo caso, il driver richiede all’add-on RAID 1 di fornire i dati del settore corretti dalla partizione mirror. Questa procedura si applica sia alle richieste di lettura provenienti dal file system, sia alle operazioni di lettura interne eseguite dal driver Universal NAND (ad esempio quando i dati di un blocco NAND vengono copiati in un’altra posizione).
Sincronizzazione dei settori
Un reset imprevisto che interrompe un’operazione di scrittura può portare a un’incoerenza dei dati. È possibile che i dati dell’ultimo settore scritto siano memorizzati solo sul master e non sul mirror. Dopo il riavvio, il file system continuerà a funzionare correttamente, ma in caso di un errore di lettura che colpisca esattamente quel settore, verrebbero letti dati obsoleti dal mirror, causando una corruzione dei dati.
Questa situazione può essere evitata sincronizzando tutti i settori del volume RAID. L’applicazione può eseguire la sincronizzazione chiamando la funzione API FS_STORAGE_SyncSectors(). Ad esempio, un task a bassa priorità può chiamare questa funzione in parallelo ad altre attività del file system.
Esempio di configurazione
Il seguente frammento di codice mostra come configurare l’add-on RAID per utilizzare due dispositivi di memoria NAND rispettivamente come partizione master e mirror.
/*********************************************************************
*
* Definizioni configurabili
*
**********************************************************************
*/
#define ALLOC_SIZE 0x8000 // Dimensione del memory pool in byte
/*********************************************************************
*
* Dati statici
*
**********************************************************************
*/
static U32 _aMemBlock[ALLOC_SIZE / 4]; // Pool di memoria usato per
// l'allocazione semi-dinamica.
/*********************************************************************
*
* FS_X_AddDevices
*
* Descrizione funzione
* Questa funzione viene chiamata dal file system durante FS_Init().
* Serve ad aggiungere tutti i dispositivi, usando principalmente FS_AddDevice().
*/
void FS_X_AddDevices(void) {
//
// Fornisce memoria al file system per il suo funzionamento.
//
FS_AssignMemory(&_aMemBlock[0], sizeof(_aMemBlock));
//
// Imposta la dimensione massima del settore del file system.
//
FS_SetMaxSectorSize(2048);
//
// Aggiunge e configura il driver NAND per lo storage master (Indice 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);
//
// Aggiunge e configura il driver NAND per lo storage mirror (Indice 1).
//
FS_AddDevice(&FS_NAND_UNI_Driver);
FS_NAND_UNI_SetPhyType(1, &FS_NAND_PHY_ONFI);
FS_NAND_UNI_SetECCHook(1, &FS_NAND_ECC_HW_NULL);
//
// Aggiunge e configura il driver RAID.
// I parametri indicano: (Unità RAID, Driver Master, Indice Master, Driver Mirror, Indice Mirror).
//
FS_AddDevice(&FS_RAID1_Driver);
FS_RAID1_Configure(0, &FS_NAND_UNI_Driver, 0, &FS_NAND_UNI_Driver, 1);
}
