Truc en vrac pour Linux

Avec le raid soft

Comment creer un disque raid directement en mode dégradé

Quel est le problème ?

Le problème qui m'a conduit là est le suivant: j'ai un disque SATA2 de 160Go rempli de données (photos de vacances, devs, etc ...) et je sais pertinemment que les disques IDE sont généralement de mauvaise qualité et ont une durée de vie plutot limitée. ne voulant pas risquer de perdre mes données Ô combien précieuses et sentimentales, je décide donc de migrer tout ça sur du raid soft. Je décide par la même occasion de doubler mon espace de stockage (vu les prix des disques dur, il ne faut pas se priver !). Je décide de partir sur du raid5 et donc d'acheter 3 disques de 160 Go de manière a disposer de 280 Go d'espace disque. Que faire ? Il faut 3 disques de taille identique pour monter un raid 5 or j'ai déjà un disque de 160 Go ... j'achète trois disque et je me retrouve, après la migration des données, avec un 4ème disque de 160 Go inutile sur les bras ou bien je n'achete que deux disques et je me débrouille avec des tours de passe passe pour déplacer les données. Après tout le propre du raid 5 est de tolérer la perte d'un disque... Je suis donc joueur, j'en achète deux et on verra bien.

raid soft vs raid hard

Le choix est très simple: dans le cas du raid hard le codage des données sur les différents disques dépend directement du constructeur de la carte raid. dans le cas du raid soft, le codage sur les disque dépend de l'os utilisé. Il reste à déterminer qui du matériel ou du soft est le plus pérenne et le plus répandu. Personnellement je fait plus facilement confiance au soft. le kernel Linux à conservé le même codage des données au travers de ces differents kernels (constaté entre le 2.4.18 et le 2.6.16.40 et ce quelque soit le processeur utilisé). Le raid hard, quant à lui, présente un inconvenient majeur (un spof): la carte raid. Si celle ci vient à décéder subitement d'une mort horrible, pourres vous trouver exactement la même carte afin de récupérer les doonnées ? De plus on ne trouve pas facilement de carte raid pour des disques IDE. Il reste un problème de perf entre e raid soft et le raid hard. on pourrais légitimement pensser que le raid soft est plus lent que le raid hard puisque c'est le processeur qui execute l'encodage raid et non une carte dédiée. et bien ... il n'en est rien ! généralement les cartes raid, pour pallier quelques soucis de chaleur ou d'encombrement utilisent des processeurs ridiculement faibles (fréquences de 200 ou 300 MHz). Le CPU du système est bien plus performant que ceux ci. bien entendu un système utilisant du raid soft consomera un peu plus de CPU que sans le raid, mais cette conso supplémentaires est négligeable dans bien des cas. Ces affirmations sont basées sur mon expérience personnelles, et, bien sur, quelques tests seraient les bienvenus pour valider tout ceci.

raid1 vs raid5

Globalement, il y a 3 types de raid, raid0 (mais on en parle pas ici, car il n'offre aucune protection des données), raid1 et raid5. Les autres format de raid sont plus ou moins des dérivés de ceux ci. Le raid1 c'est du mirroring. Avec ce mode on doit systématiquement doubler l'espace disque pour assurer la redondance des données. Le raid 5 est plus econome il n'utilise qu'un seul disque pour la redondance sur une grappe de n disque (ex: un raid 5 sur 4 disques allouera un espace équivalent à la somme de 3 disques et le 4ème dique sera utilisé pour les données redondantes). L'inconvénient majeur est que la perte de deux disques de données entraine la perte de toutes les données du raid. L'autre inconvénient du raid5 est que les données sont écrites sur les différents disques de manière codée. Bien que le code utilisé soit extrement simple, ces données ne sont pas utilisables sans un traitement paticulier. En bref le seul avantage du raid5 c'est les économies à l'achat. Le raid à préférer de manière générale est le raid1. Celui ci ne présente que des avantages. Il permet la perte de 50% des disques et surtout, les données sont brutes: elles ne sont pas codées. un disque issu d'un raid1 peut être utilisé directement comme un disque dur normal.

dans le vif du sujet

NOTE: Jean-Charles me fait remarquer qu'il y a une solution bien plus simple: mdadm propose un argument "missing" pour signaler un device absent: ce qui est bien plus simple que de fabrique une device virtuel.

mdadm --build /dev/md0 --level=raid1 --raid_devices=2 /dev/sda1 missing

Si l'on regarde la commande mdadm, on s'apperçoit que pour creer un système raid, il faut que tous les disques qui composent le volume soit disponibles. Comment feinter la machine ? J'ai essayé d'utiliser /dev/null mais ce n'est pas un device en mode bloc, le raid n'en veut pas. Donc toute la problématique est résumée à ceci: comment créer un périphérique factice en mode bloc d'une taille de 160Go ? Il existe la commande losetup qui permet de mapper un fichier sur un périphérique /dev/loop0. Pour pouvoir utiliser cette fonctionnalité du kernel, celui ci doit être compilé avec le support de "Loopback device support". la syntaxe est très simple: losetup /dev/loop0 /fichier/a/mapper. Un nouveau problème surgit: pour créer un devide /dev/loop0 de 160Go il faut utiliser un fichier de 160Go. Nous voila revenu à la case départ il faut tout de même un espace disque de 160Go quelque part. Et bien ... pas tout à fait. Le filesystem "ext" possede une particularité plutot utile. Lorsque l'on cré un fichier, celui ci n'à pas de taille prédéfinie. si l'on ouvre un fichier et que l'on fait un seek de 159 999 999 999 caracteres dans ce fichier, on n'ecrit un octet '\0' au 160 000 000 000 ème caractere, et l'on enregistre. Comment se comporte le système ?. en tous cas, il cré un fichier de 160Go, mais les premier octets, ceux ou l'on à rien ecrit que fait le systeme avec ceux ci ? et bien tout simplement il n'alloue aucun bloc pour ceux ci, et fournit des zero si on lui demande ce qu'il y a dedans. Voila comment on peut creer un fichier de 160Go sans utiliser 160Go de place sur le disque.

En pratique ...

Alors comment creer ce fichier special sans ecrire un bout de C ? tout simplement avec la commande dd:

# dd if=/dev/zero of=/tmp/mon_gros_fichier bs=160G seek=1 count=0

On a tout simplement demandé à dd de copier le device /dev/zero dans le fichier /tmp/mon_gros_fichier avec des blocs de 160Go, seek veut dire que l'on saute un bloc avant de commancer la copie des données, et count veut dir que l'on copie 0 blocs. On a donc créer un fichier virtuel de 160Go rempli de 0. Il faut maintenant mapper sur fichier sur un device en mode caractères:

# losetup /dev/loop0 /tmp/mon_gros_fichier

le device /dev/loop0 correspond maintenant au fichier /tmp/mon_gros_fichier. Il ne reste plus qu'à fabriquer le raid:

# mdadm --assemble /dev/loop0 /dev/sda1 /dev/sdb1
mdadm: /dev/md1 assembled from 2 drives - need all 3 to start it (use --run to insist).

Donc, come demandé:

# mdadm --run /dev/md1

Et voila, le raid se construit. il faut le laisser faire quelques dizaines de minutes, et voila le resultat:

# cat /proc/mdstat 
Personalities : [raid0] [raid1] [raid5] [raid4] 
md1 : active raid5 sda1[1] sdb1[2]
      312576512 blocks level 5, 64k chunk, algorithm 2 [3/2] [_UU]
		      
unused devices: <none>

Il faut ensuite arreter le raid avec un

# mdadm --stop /dev/md0

supprimer le fichier factice /tmp/mon_gros_fichier et reconstruire le raid:

# mdadm --assemble /dev/sda1 /dev/sdb1
.

Et voila le raid construit en mode degradé, il reste a migrer les données et ajouter le 3eme disque pour avoir un raid fonctionnel.