RAID Reconstructor ne prend pas directement en charge les matrices RAID-6, il ne récupérera donc pas automatiquement une configuration RAID-6. Cependant, avec quelques connaissances sur votre RAID-6, vous pouvez créer une image virtuelle (fichier VIM) qui vous permettra de reconstruire le RAID-6 après la défaillance de deux disques au maximum. Toute notre gamme de logiciels de récupération de données prend en charge les images virtuelles. Une fois que vous avez créé un fichier VIM, vous pouvez l'utiliser pour monter, cloner, imager ou récupérer des données à partir de votre RAID-6 reconstruit. À l'heure actuelle, les versions logicielles suivantes prennent en charge les fichiers VIM pour RAID-6 : DiskExplorer X V2.01, GetDataBack Pro V5.63, RAID Reconstructor V5.13, DriveMap V0.11 BETA, DriveDoppel V0.91 BETA.
Les images virtuelles de Runtime prennent en charge deux schémas RAID-6 distincts. La première méthode consiste en un schéma purement basé sur l'opération XOR, où les disques sont combinés par XOR de multiples manières afin de rendre la baie résistante à la défaillance de deux disques au maximum. Nous allons examiner un exemple concret de RAID-6 composé de 4 disques sur un contrôleur Adaptec AIC-9405W.
Le deuxième schéma est une implémentation Reed-Solomon utilisant un disque pour la parité XOR de type RAID-5 et un second pour la parité Reed-Solomon. Nous allons examiner un exemple de RAID-6 à 6 disques sur un contrôleur RocketRaid 4520SGL.
Pour les deux schémas RAID-6, nous vous montrerons comment créer le fichier VIM afin de reconstruire la matrice après la défaillance de 0, 1 ou 2 disques.
Ce schéma utilise uniquement l'opération XOR et est donc facile à analyser. Le contrôleur RAID sélectionne les blocs de données et de parité de manière à ce qu'ils soient répartis horizontalement et verticalement sur les disques, vous assurant ainsi de pouvoir récupérer les données après une panne de deux disques.
| Basé sur plusieurs XOR | ||||||||||||
| Exemple : RAID-6, 4 disques, taille de bloc 128 sur Adaptec AIC-9405W | ||||||||||||
| Disque local secteur*)\ |
Disque 1 | Disque 2 | Disque 3 | Disque 4 | Cycle | Bande | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0-127 | B1 **) | B2 | B3 | B4 | 0 | 0 | ||||||
| 128-255 | P1***) | P2 | P3 | P4 | 1 | |||||||
| 256-383 | B5 | B6 | B7 | B8 | 1 | 0 | ||||||
| 384-511 | P5 | P6 | P7 | P8 | 1 | |||||||
| : | : | : | : | : | : | : | ||||||
|
||||||||||||
Les bandes alternent entre des blocs de données purs et des blocs de parité :
B3 xor B4 => P1
B1 xor B4 => P2
B1 xor B2 => P3
B2 xor B3 => P4
Ces parités garantissent que même la perte de deux disques peut être atténuée. Si, par exemple, les disques 1 et 2 tombent en panne, vous pouvez reconstruire B2 à partir de B3 xor P4, puis B1 à partir de B2 xor P3.
VIM pour extraire les données à l'aide de tous les lecteurs :
<virtualimage>
<loop>
<drive>...ada_1.img: </drive>
<drive>...ada_2.img: </drive>
<drive>...ada_3.img: </drive>
<drive>...ada_4.img: </drive>
<cycle blocksize="128">
<stripe>1,2,3,4</stripe>
<stripe></stripe>
</cycle>
</loop>
</virtualimage>
Si aucun disque n'est manquant, il est alors possible de récupérer les données à partir des blocs de données de chaque bande.
La première bande récupère 128 secteurs de chaque disque dans l'ordre des disques 1, 2, 3 et 4. La bande suivante est vide, elle ne contient que les parités dont nous n'avons pas besoin. La bande vide augmente le compteur de secteur de 128 à 256, de sorte que la première bande de la prochaine itération du cycle renvoie à nouveau les données des disques 1, 2, 3 et 4.
VIM pour extraire les données après la défaillance d'un disque :
<virtualimage>
<loop>
<drive>...ada_1.img: </drive>
<drive>...ada_2.img: </drive>
<drive>...ada_3.img: </drive>
<drive>...ada_4.img: </drive>
<cycle blocksize="128">
<stripe>2x3(1),2,3,4</stripe>
<stripe></stripe>
</cycle>
</loop>
</virtualimage>
En supposant que le disque 1 soit manquant, nous pouvons recréer le disque en remplaçant l’occurrence du disque 1 par B2 xor P3.
Comme P3 se trouve dans la bande suivante, nous devons anticiper dans notre expression de bande. Cela est réalisé avec 3(1), qui indique « disque 3 une bande devant ». Notre expression de bande 2x3(1),2,3,4 récupère 128 secteurs du disque 2, xors avec le contenu du disque 3 à 128 secteurs d’avance, puis collecte les disques restants 2, 3 et 4. Le bande suivante est à nouveau vide, car nous avons déjà collecté ce dont nous avons besoin grâce à l'aperçu préalable. La bande vide augmente le compteur de secteur de 128 à 256, donc la première bande de l’itération du cycle suivant renvoie à nouveau des données de 2x3(1), 2,3,4.
VIM pour extraire les données après la défaillance de deux disques :
<virtualimage>
<loop>
<drive>...ada_1.img: </drive>
<drive>...ada_2.img: </drive>
<drive>...ada_3.img: </drive>
<drive>...ada_4.img: </drive>
<cycle blocksize="128">
<stripe>3x4(1)x3(1),3x4(1),3,4
</stripe>
<stripe></stripe>
</cycle>
</loop>
</virtualimage>
En supposant que les disques 1 et 2 manquent, nous pouvons recréer les disques en remplaçant les occurrences du disque 2 par B3 xor P4, et du disque 1 par B2 xor P3.
Comme P3 et P4 se trouvent dans la bande suivante, nous devons à nouveau anticiper dans notre expression de bande. Cela se réalise avec 3(1) et 4(1), qui indiquent respectivement « disque 3 une bande devant » et « disque 4 une bande devant ». Notre expression de bandes 3x4(1)x3(1),3x4(1),3,4 récupère le disque 2 en utilisant 3x4(1), et le disque 1 en utilisant le disque 2 xor-ed récemment récupéré avec 3x4(1).
La bande suivante est à nouveau vide, car nous avons déjà collecté ce dont nous avions besoin grâce à l'aperçu. La bande vide augmente le compteur de secteur de 128 à 256, donc la première bande de l’itération du cycle suivant renvoie des données provenant de 3x4(1)x3(1),3x4(1),3,4 à nouveau.
Ce schéma utilise deux algorithmes de parité distincts pour les blocs de données, XOR et correction d’erreur Reed-Solomon, permettant une redondance sur 2 disques. RS est élégant : il permet aux deux blocs de parité, P et R, de pivoter sur les disques sans stocker les blocs de parité dans des bandes spéciales. D'autre part, le RS est plus compliqué à calculer que le XOR. RS n'est pas commutatif, contrairement à XOR.
| Reed-Solomon et basé sur XOR | ||||||||||||
| Exemple : RAID-6, 6 disques, taille de bloc 128 sur un contrôleur RocketRaid 4520SGL | ||||||||||||
| Disque local secteur*)\ |
Disque 1 | Disque 2 | Disque 3 | Disque 4 | Disque 5 | Disque 6 | Cycle | Bande | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0-127 | B1 **) | B2 | B3 | B4 | P | R | 0 | 0 | ||||
| 128-255 | B5 | B6 | B7 | P | R | B8 | 1 | |||||
| 256-383 | B9 | B10 | P | R | B11 | B12 | 2 | |||||
| 384-511 | B13 | P | R | B14 | B15 | B16 | 3 | |||||
| 512-639 | P | R | B17 | B18 | B19 | B20 | 4 | |||||
| 640-767 | R | B21 | B22 | B23 | B24 | P | 5 | |||||
| 768-895 | B25 | B26 | B27 | B28 | P | R | 1 | 0 | ||||
| 896-1023 | B29 | B30 | B31 | P | R | B32 | 1 | |||||
| : | : | : | : | : | : | : | : | : | ||||
|
||||||||||||
Toutes les relations entre les blocs de données et les blocs de parité sont exprimées dans la même bande. Il n'y a pas d'aperçu comme dans le schéma précédent. Voici les relations :
Bande 0: B1 xor B2 xor B3 xor B4 => P B1 rs B2 rs B3 rs B4 => R
Bande 1: B5 xor B6 xor B7 xor B8 => P B5 rs B6 rs B7 rs B8 => R
Bande 2 : B9 xor B10 xor B11 xor B12 => P B9 rs B10 rs B11 rs B12 => R
etc.
Comme vous pouvez le constater, les pannes d'un seul disque peuvent être facilement résolues à l'aide de P. Si vous devez récupérer les données après la perte de deux disques, vous aurez également besoin de R. Nous montrerons plus tard comment intégrer les deux opérations, XOR et RS, dans un fichier VIM.
VIM pour extraire les données à l'aide de tous les lecteurs :
<virtualimage>
<loop>
<drive>...high_1.img: </drive>
<drive>...high_2.img: </drive>
<drive>...high_3.img: </drive>
<drive>...high_4.img: </drive>
<drive>...high_5.img: </drive>
<drive>...high_6.img: </drive>
<cycle blocksize="128">
<stripe>1,2,3,4</stripe>
<stripe>1,2,3,6</stripe>
<stripe>1,2,5,6</stripe>
<stripe>1,4,5,6</stripe>
<stripe>3,4,5,6</stripe>
<stripe>2,3,4,5</stripe>
</cycle>
</loop>
</virtualimage>
Si aucun disque n'est manquant, il est alors possible de récupérer les données à partir des blocs de données de chaque bande. Consultez la table de rotation Reed-Solomon pour déterminer les disques de données pour chaque bande : ils sont 1,2,3,4 pour la bande 0, 1,2,3,6 pour la bande 1, 1,2,5,6 pour la bande 2, 1,4,5,6 pour la bande 3, 3,4,5,6 pour la bande 4, et 2,3,4,5 pour la bande 5.
Ces 6 vecteurs correspondent exactement à ce que vous voyez dans ce fichier VIM.
VIM pour extraire les données après la défaillance d’un disque en utilisant la parité :
<virtualimage>
<loop>
<drive>...high_1.img: </drive>
<drive>...high_2.img: </drive>
<drive>...high_3.img: </drive>
<drive>...high_4.img: </drive>
<drive>...high_5.img: </drive>
<drive>...high_6.img: </drive>
<cycle blocksize="128">
<stripe>2x3x4x5,2,3,4</stripe>
<stripe>2x3x4x6,2,3,6</stripe>
<stripe>2x3x5x6,2,5,6</stripe>
<stripe>2x4x5x6,4,5,6</stripe>
<stripe>3,4,5,6</stripe>
<stripe>2,3,4,5</stripe>
</cycle>
</loop>
</virtualimage>
Si un disque manque, nous pouvons le recréer simplement en appliquant la parité P. En pratique, nous effectuons une opération XOR entre P et les disques de données survivants.
En supposant que le disque 1 est manquant, écrivons les 6 vecteurs pour nos bandes. Regardez la table de rotation, bande 0 : du disque 1 au disque 6, les disques de données et de parité sont ordonnés DDDDPR. Nous pouvons remplacer le disque manquant 1 par 2x3x4x5. Les disques 2, 3 et 4 sont les disques de données restants et P est le disque de parité XOR de cette bande.
Bande 0 :
D,D,D,D,P,R -> 1,2,3,4,5,6 --(remplacer 1 par 2x3x4x5)-> 2x3x4x5,2,3,4
Bande 1 :
D,D,D,P,R,D -> 1,2,3,4,5,6 --(remplacer 1 par 2x3x4x6)-> 2x3x4x6,2,3,6
Bande 2 :
D,D,P,R,D,D -> 1,2,3,4,5,6 --(remplacer 1 par 2x3x5x6)-> 2x3x5x6,2,5,6
Bande 3 :
D,P,R,D,D,D -> 1,2,3,4,5,6 --(remplacer 1 par 2x4x5x6)-> 2x4x5x6,4,5,6
Bande 4 :
P,R,D,D,D,D -> 1,2,3,4,5,6 --(aucun remplacement)-> 3,4,5,6
Bande 5 :
R,D,D,D,D,P -> 1,2,3,4,5,6 --(aucun remplacement)-> 2,3,4,5
Les 6 vecteurs à droite sont nos descriptions de bandes dans le fichier VIM.
VIM pour extraire les données après la défaillance d’un disque utilisant Reed-Solomon :
<virtualimage>
<loop>
<drive>...high_1.img: </drive>
<drive>...high_2.img: </drive>
<drive>...high_3.img: </drive>
<drive>...high_4.img: </drive>
<drive>...high_5.img: </drive>
<drive>...high_6.img: </drive>
<cycle blocksize="128">
<stripe>?r2r3r4r5r6,2,3,4</stripe>
<stripe>?r2r3r6r4r5,2,3,6</stripe>
<stripe>?r2r5r6r3r4,2,5,6</stripe>
<stripe>?r4r5r6r2r3,4,5,6</stripe>
<stripe>3,4,5,6</stripe>
<stripe>2,3,4,5</stripe>
</cycle>
</loop>
</virtualimage>
Nous pouvons également récupérer les données après une panne d'un seul disque à l'aide de l'algorithme Reed-Solomon RS. Nous définissons RS comme une fonction sur tous les disques, disponibles ou non, dans l’ordre correct :
RS(D,D,D,D,P,R). Pour une utilisation dans le fichier VIM, nous écrivons ceci comme DrDrDrDrPrR. Regardez la table de rotation pour remplacer les paramètres par le bon numéro de disque :
Bande 0: RS(1,2,3,4,5,6) -> 1r2r3r4r5r6
Bande 1: RS(1,2,3,6,4,5) -> 1r2r3r6r4r5
Bande 2: RS(1,2,5,6,3,4) -> 1r2r5r6r3r4
Bande 3: RS(1,4,5,6,2,3) -> 1r4r5r6r2r3
Bande 4: RS(3,4,5,6,1,2) -> 3r4r5r6r1r2
Bande 5: RS(2,3,4,5,6,1) -> 2r3r4r5r6r1
En supposant que le disque 1 manque, nous remplaçons le descripteur de disque le plus à gauche par le descripteur RS pour les 4 premières bandes. Les deux dernières bandes, encore une fois, ne nécessitent aucune reconstruction. Avant d’insérer le descripteur RS, remplacez le disque manquant par un ?. Cela indique de quel résultat nous avons besoin. Pour la bande 0, 1r2r3r4r5r6 devient ?r2r3r4r5r6.
VIM pour extraire les données après la défaillance de deux disques :
<virtualimage>
<loop>
<drive>...high_1.img: </drive>
<drive>...high_2.img: </drive>
<drive>...high_3.img: </drive>
<drive>...high_4.img: </drive>
<drive>...high_5.img: </drive>
<drive>...high_6.img: </drive>
<cycle blocksize="128">
<stripe>!r?r3r4r5r6,?r!r3r4r5r6,3,4 </stripe>
<stripe>!r?r3r6r4r5,?r!r3r6r4r5,3,6 </stripe>
<stripe>!r?r5r6r3r4,?r!r5r6r3r4,5,6 </stripe>
<stripe>!r4r5r6r?r3,4,5,6 </stripe>
<stripe>3,4,5,6 </stripe>
<stripe>3x4x5x6,3,4,5 </stripe>
</cycle>
</loop>
</virtualimage>
Dans ce paragraphe, nous allons tout rassembler : XOR et RS pour récupérer après une panne de deux disques.
En supposant que les disques 1 et 2 sont manquants, nous devrons remplacer les descripteurs de disque 1 et 2 dans la bande 0. Selon le paragraphe précédent, la fonction RS pour la bande 0 est 1r2r3r4r5r6. Utiliser ? et ! pour les disques manquants, ! étant le disque que vous souhaitez calculer. Pour la bande 1, la fonction RS est 1r2r3r6r4r5 et les descripteurs pour les disques 1 et 2 sont respectivement
Bande 0: 1r2r3r4r5r6 => 1,2,3,4 => !r?r3r4r5r6,?r!r3r4r5r6,3,4
Bande 1: 1r2r3r6r4r5 => 1,2,3,6 => !r?r3r6r4r5,?r!r3r6r4r5,3,6
Bande 2: 1r2r5r6r3r4 => 1,2,5,6 => !r?r5r6r3r4,?r!r5r6r3r4,5,6
Bande 3: 1r4r5r6r2r3 => 1,4,5,6 => !r4r5r6r?r3,4,5,6
Bande 4: 3r4r5r6r1r2 => 3,4,5,6 => 3,4,5,6
Bande 5: 2r3r4r5r6r1 => 2,3,4,5 => 3x4x5x6,3,4,5 (or !r3r4r5r6r?,3,4,5)