Cette page est en cours de rédaction.
Apportez votre aide…
Comment installer Ubuntu sur un RAID-1 logiciel ?
Une des plus grandes hantises pour l'utilisateur de l'outil informatique est de perdre ses précieuses données ; ses lettres, ses morceaux de musiques préférés, la configuration de sa machine,… mais également (surtout depuis l'explosion de la photo numérique) les photos du petit dernier.
Une des causes les plus fréquentes de cette perte de données est le crash du disque dur. Un composant matériel qui peut flancher (comme tout composants) et qui peut vous causer de gros tracas surtout si vous n'avez pas fait de sauvegarde de vos données.
Si vous avez un peu d'argent dans votre tirelire, une solution simple et pas trop onéreuse peut vous prémunir de ce genre de désagrément ; il s'agit du RAID. Le concept du RAID est d'écrire simultanément sur plusieurs disques les mêmes données afin d'éviter toute perte en cas de panne de l'un des disques.
La solution que je vais vous expliquer repose sur un RAID-1. Le RAID-1 est en fait, une copie miroir d'un disque sur un autre (ou plus mais alors, je vous conseille d'utiliser le RAID-5). Pour installer une solution de type RAID-5 ou RAID-1 avec plusieurs disques, vous pouvez vous baser sur cet article et l'adapter légèrement à vos besoins.
ATTENTION : bien que le risque de perdre vos données soit limité avec l'usage d'une solution RAID, cela ne vous dispense pas d'effectuer des backups !!!
Quelques idées pour les backups :
- Les CDs ou les DVDs et plus encore (backup-manager).
- Les synchronisations avec une autre machine (rsync).
- Une sauvegarde automatique et incrémentielle de son répertoire home (rdiff-backup)
Remarque : l'article ci-dessous repose sur le fait que vous possédez deux disques dans une même machine; si les deux disques sont dans deux machines différentes, je vous conseille de lire l'article concernant le RAID-1 over IP avec DRBD.
La solution RAID-1 proposée ci-dessous est une solution logicielle. Il ne s'agit pas d'une carte contrôleur RAID que l'on installe dans la machine. Remarquez cependant que plusieurs contrôleurs RAID grand public ne font pas du RAID en hardware, une explication les concernant est disponible en fin de l'article.
Préambule
Je vais vous exposer comment j'ai installé un RAID-1 logiciel sur un serveur Fujitsu Siemens RX100 S2 équipé d'un contrôleur fake-RAID Promise Fasttrack S150 TX4. Les disques durs sont deux disques SATA de 80 Go et sont reconnus comme étant les devices /dev/sda
et /dev/sdb
. Si vous ne disposez pas d'un système fake-RAID, la technique est identique à l'exception de la récupération en cas de panne qui nécessite quelques ajustements.
Cet article considère que vous savez comment installer une Ubuntu Hoary de manière normale et que vous possédez une gravure sur CD d'Hoary; vous trouverez plus d'information concernant l'installation d'Hoary sur cette page.
Installation
- Pour commencer l'installation, démarrer sur le CD-ROM Ubuntu. Personnellement, j'ai installé Ubuntu en mode
server
. Ce n'est pas nécessaire mais il est utile de préciser que tout ce qui suit sera en ligne de commande car aucune interface X n'est installée lors d'une installation en modeServer
1).
Attention : Il est impératif d'utiliser le CD "Server" ou le CD "Alternate", car il n'y a pas les options pour le RAID avec le CD "Desktop".
- Effectuez l'installation normalement jusqu'au partitionnement des disques avec l'outil
partman
.
Partitionnement
A ce moment, vous devriez avoir à l'écran l'ensemble des disques durs détectés ainsi qu'une option permettant de modifier les tables de partitions manuellement.
- Choisissez
Modifier manuellement la table de partition
. - Partitionnez les disques et gardez en tête que les deux disques doivent être parfaitement identiques. C'est-à-dire que si vous avez deux disques de tailles différentes, veillez à garder le début des disques identiques et ajoutez une partition au plus grand que vous monterez plus tard si nécessaire (Attention, cette partition ne sera pas en RAID-1).
- Avec des disques de 80 Go, j'ai choisi de partitionner de la manière suivante :
sda1 /boot 509.9 MB (amorçable) sda2 swap 1.0 GB sda3 raid 78.5 GB
- Voici un autre exemple avec 2 disques de 250 Go :
Je crée d'abord 3 partitions RAID sur chacun des disques.
Disque 1
sda1 raid 1 GB sda2 raid 2 GB sda3 raid 247 GB
Disque 2
sdb1 raid 1 GB sdb2 raid 2 GB sdb3 raid 247 GB
Puis je crée 3 périphériques multidisques RAID. Et enfin je formate ces 3 périphériques comme suit :
raid1 /boot 1 GB raid2 swap 2 GB raid3 / 247 GB
- Pour d'autres informations sur cette étape voir aussi Comment installer Ubuntu sur un RAID-0 logiciel ?
Important : notez les informations concernant l'ordre et les tailles des partitions que vous venez de créer car ces informations pourraient (j'espère pour vous que non) vous être utiles si un des disques devait être remplacé.
Remarque : on m'a indiqué que GRUB et LILO sont capables de booter directement sur une device de type RAID software (/dev/mdX
). Je n'ai cependant pas eu l'occasion d'essayer la procédure. La machine qui est à ma disposition est maintenant en production. Je mettrai cette page à jour dès que possible; vous trouverez les informations concernant GRUB et LILO dans les notes (en fin d'article).
- Pour indiquez que
sda3
est un volume RAID, il vous suffit de créer une partition et de sélectionnerVolume physique RAID
pour le champUtiliser comme
. - Répercutez la même table de partition sur le second disque
sdb
. Mais, attention : veillez bien à ne pas indiquer de point de montage pour la première partition (/boot
), ni pour la seconde partition (swap
). Indiquez ces partitions comme étantNe pas utiliser cette partition
pour le champUtiliser comme
. - Remarque importante : N'oubliez pas d'indiquer à chaque fois que la première partition est amorçable.
- Maintenant, vous pouvez définir votre RAID-1 logiciel en allant sur le champ
Configurer le RAID logiciel
. - Ubuntu va vous demander si vous voulez appliquer les changements, faites
oui
. - Choisissez
Configurer un périphérique multi-disques
. - Choisissez l'option
RAID-1
, nombre de périphériques actifs :2
, nombre de périphériques de réserves :0
. - Sélectionnez les deux périphériques actifs; chez moi, il s'agit de :
/dev/scsi/host1/bus0/target0/lun0/part3 /dev/scsi/host0/bus0/target0/lun0/part3
- Choisissez
Continuer
etTerminer
. - Vous avez maintenant une ligne supplémentaire avec quelque chose ressemblant à ceci, dans le cas du premier exemple de disques 80 Go, :
Périphérique RAID1 n°0 - 78.5 GB Périph. RAID1 logiciel n°1 78.5 GB
- Allez sur
n°1 78.5 GB
et faitesENTER
. - Changez le champ
Utiliser comme
pour obtenirSystème de fichiers journalisés ext3
et changez le point de montage en/
. - Sélectionnez
Fin du paramétrage pour cette partition
. - Tout en bas de l'écran, allez sur l'élément
Terminer le partitionnement et appliquer les changements
et faitesENTER
. - Confirmez le fait qu'il faut appliquer les changements sur les disques.
- A partir de maintenant, vous pouvez terminer l'installation normalement.
Quelques explications
Tout d'abord, vous avez sans doute remarqué la création d'une partition /boot
. Cette partition /boot
est nécessaire car elle va nous permettre de stocker le noyau afin qu'il soit accessible par le BIOS. En effet, le BIOS n'est pas capable de lire une partition RAID-1 logicielle; seul le noyau Linux peut le faire. Or, à ce moment du démarrage, on doit être capable de charger le noyau, c'est pour cela qu'on va placer le noyau et la base du système nécessaire au démarrage dans cette partition /boot
.
Ensuite, vous me direz que les données RAID-1 seront sauvegardées mais pas les informations de démarrage (ce qui se trouve dans /boot
). C'est exact. Comme cette partition ne peut pas être mise sur le RAID, on va devoir la dupliquer manuellement à chaque modification du noyau ou des paramètres de démarrage (GRUB,…).
Enfin, les partitions ne sont pas utilisées sur le second disque (notamment, sdb1
et sdb2
) afin que l'installeur Ubuntu ne configure pas les accès à ces partitions (qui serviront en cas de panne du premier disque).
Premier démarrage
Attention : n'effectuez pas de reboot ou d'arrêt lors du premier démarrage tant que la construction du RAID n'est pas finie !!!
(s'il vous arrive de redémarrer votre machine avant la fin de la construction du Raid, celle ci reprendra quasiment là ou elle s'est arreté)
Pour savoir si la construction est finie, vous trouverez les informations en affichant le fichier /proc/mdstat
via la commande suivante:
cat /proc/mdstat
ou mieux :
watch -n 10 cat /proc/mdstat
qui affiche l'état de la construction toutes les 10 secondes (à interrompre sans danger par un Ctrl-C).
Lorsque la construction est en cours, vous obtenez quelques lignes ressemblant à ceci :
Personalities : [raid1] md0 : active raid1 sdb3[0] sda3[1] 76670144 blocks [2/2] [UU] [=================>...] resync = 88.9% (68220800/76670144) finish=4.3min speed=32422K/sec unused devices: <none>
Lorsque la construction est terminée, vous obtenez quelques lignes ressemblant à cela :
Personalities : [raid1] md0 : active raid1 sdb3[0] sda3[1] 76670144 blocks [2/2] [UU] unused devices: <none>
Je me répète mais c'est important : SURTOUT, NE REDEMARRER PAS LA MACHINE TANT QUE LA CONSTRUCTION N'EST PAS FINIE !!!.
Quelques explications
Cette phase de construction prend un certain temps mais rassurez-vous, elle ne se produit que lorsque vous installez le RAID pour la première fois, ou que vous avez subi une avarie et que vous remettez votre système à la normale.
Si vous redémarrez la machine alors que le système RAID n'est pas cohérent, le noyau ne saura pas déterminer quel est le disque qui contient les données valables et quel est le disque qui était en train d'être reconstruit. Dès lors, le noyau se retrouve face à deux disques sans savoir lequel est valide… Ce qui est relativement problématique.
En RAID 1, chaque disque physique a un numéro d'ordre et un status, le système sait donc toujours ce qu'il est nécessaire de mettre à jour, même en cas de reboot. Les super-blocs récents (version 1.2) permettent même de marquer quelles parties du disque ne sont pas synchronisées.
En RAID 5, il est possible que le système ne sache pas quels sont les données à utiliser dans le cas où la matrice est désynchronisée ET est en mode dégradé (il manque un disque); il faut alors forcer la construction de la matrice pour pouvoir reprendre la synchronisation, avec le risque que quelques blocs contiennent des données obsolètes ou pire, aléatoires (il faut alors faire un fsck sur le système).
Duplication du boot
Remarque : Si vous avez configuré GRUB ou LILO pour un démarrage direct sur /dev/mdX
, il n'est pas nécessaire de dupliquer le boot. (voir notes en fin d'article)
Maintenant que la construction du RAID-1 est terminée, vous possédez deux disques partitionnés de manière identique. Cependant, un seul des disques contient une partition /boot
(qui permet donc le démarrage du système) et une partition swap
(pas indispensable mais utile de temps à autre). Le second disque possède juste une partition RAID-1.
Dans l'état actuel des choses, cela signifie que si votre premier disque tombe en panne, vous ne savez pas démarrer sur le second. Ce qui pose problème car le but de cet article est d'avoir un système qui peut démarrer surtout si un des deux disques flanche.
Pour faire cela, nous devons configurer une partition /boot
avec les mêmes informations que le premier disque ainsi qu'une partition swap
qui sera utilisée lorsqu'on démarrera sur le disque "de réserve". Les utilisations des partitions n'ont pas été définie lors de l'installation pour éviter que le fichier fstab
soit configuré comme connaissant 2 partitions supplémentaires.
Préparation des partitions et formatage
Voici comment nous allons préparer ces deux partitions non-RAID afin que notre système puisse quand même démarrer sans le premier disque.
Pour ce faire, nous allons lancer fdisk
afin d'examiner les partitions de notre second disque (dans mon cas sdb
) :
sudo fdisk -l
Cette commande va nous indiquer quelque chose de similaire à ce qui suit :
Disk /dev/sda: 80.0 GB, 80026361856 bytes 255 heads, 63 sectors/track, 9729 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 62 497983+ 83 Linux /dev/sda2 63 184 979965 82 Linux swap / Solaris /dev/sda3 185 9729 76670212+ fd Linux raid autodetect Disk /dev/sdb: 80.0 GB, 80026361856 bytes 255 heads, 63 sectors/track, 9729 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 * 1 62 497983+ 83 Linux /dev/sdb2 63 184 979965 83 Linux /dev/sdb3 185 9729 76670212+ fd Linux raid autodetect Disk /dev/md0: 78.5 GB, 78510227456 bytes 2 heads, 4 sectors/track, 19167536 cylinders Units = cylinders of 8 * 512 = 4096 bytes Disk /dev/md0 doesn't contain a valid partition table
Vous remarquerez que sdb2
, notre future partition swap
de secours n'est pas reconnue en tant que telle comme une swap
. Pour ce faire, nous devons légèrement modifier la table de partition de /dev/sdb2
. Pour ce faire, introduisez la commande suivante :
sudo fdisk /dev/sdb
Ensuite, vous demandez de changer le code d'identification de la partition en entrant la commande t
(pour toggle
), ensuite le numéro de partition 2
(dans mon cas) et enfin, le code d'identification 82
qui signifie qu'il s'agit d'une partition swap
.
Enfin, entrez la commande w
(pour write
) afin d'écrire la table de partition définitivement sur le disque.
Il nous reste plus qu'à formater les partitions, pour la partition /boot
de réserve, nous introduisons la commande suivante (dans mon cas) :
sudo mkfs.ext3 /dev/sdb1
Et pour formater la partition swap
, il vous suffit d'introduire la commande suivante (dans mon cas) :
sudo mkswap /dev/sdb2
Redémarrez la machine pour que tout soit propre (en ligne de commande : sudo reboot
).
Copie des informations de boot
Remarque : Si vous avez configuré GRUB ou LILO pour un démarrage direct sur /dev/mdX
, il n'est pas nécessaire de dupliquer le boot. (voir notes en fin d'article)
Une fois le démarrage effectué, il ne vous reste plus qu'à copier les données boot du premier disque vers le deuxième. C'est cette procédure qu'il faut suivre si vous effectuer une modification de GRUB ou du Kernel (en fait, vous devez mettre à jour les partitions /boot à chaque fois qu'elle est modifiée !!!).
Pour ce faire, c'est très simple. Si ce n'est pas fait, créer un répertoire /boot2
via la commande suivante :
sudo mkdir /boot2
Montez la partition /boot
du second disque avec la commande qui suit (dans mon cas) :
sudo mount /dev/sdb1 /boot2
Copiez l'intégralité des fichiers de la partition /boot
avec la commande suivante :
sudo cp -Rf /boot/* /boot2/
Il ne vous reste plus qu'à démonter la partition /boot
de réserve (qui est actuellement montée en /boot2
) :
sudo umount /boot2
Maintenant, vous devez configurer Grub2 pour le deuxième disque (il faut bien pouvoir démarrer si le sda crash). Tapez :
sudo umount /boot
Montez alors le deuxième disque à la place :
sudo mount /dev/sdb1 /boot
Configurez Grub2 :
sudo dpkg-reconfigure grub-pc
Faites ok et ok (rien à changer jusque là). Ensuite vient le choix entre sda1 et sdb1. Décochez alors sda1 pour cocher sdb1. Puis faites ok. Votre ordinateur est maintenant prêt à démarrer avec le deuxième disque. Redémarrez pour constater par vous même en choississant votre disque au démarrage Bios à l'aide de "F8".
Votre système est maintenant prêt à subir une panne de disque dur.
Installer un RAID1 en mode terminal "à la main"
Exécuter le terminal Applications → Accessoires → terminal
Puis passer en root (Plus simple)
sudo -i
On part du principe que vous avez installé 2 disques durs identiques comme moi de 500 Go. (sdb et sdc) comme il sont gros nous allons faire 2 partitions.
fdisk /dev/sdb
créer une partition principale donc n
puis p
puis 1
de 1 à 25000
créer une autre partition pricipale donc n
puis p
puis 2
de 25001 à la fin du disque.
Cela donne ceci :
Commande (m pour l'aide): p Disque /dev/sdb: 500.1 Go, 500107862016 octets 255 têtes, 63 secteurs/piste, 60801 cylindres Unités = cylindres de 16065 * 512 = 8225280 octets Périphérique Amorce Début Fin Blocs Id Système /dev/sdb1 1 24316 195318238+ 83 Linux /dev/sdb2 24317 60801 293065762+ 83 Linux
maintenant il faut installer le flag sur les deux partitions donc t
puis 1
puis fd
idem sur la deuxième partition donc t
puis 2
puis fd
cela va donner ceci :
Commande (m pour l'aide): p Disque /dev/sdb: 500.1 Go, 500107862016 octets 255 têtes, 63 secteurs/piste, 60801 cylindres Unités = cylindres de 16065 * 512 = 8225280 octets Périphérique Amorce Début Fin Blocs Id Système /dev/sdb1 1 24316 195318238+ fd Linux raid autodetect /dev/sdb2 24317 60801 293065762+ fd Linux raid autodetect
sauver les modifications w
et puis faire exactement la même chose sur le second disque /dev/sdc
Après, formater les 4 partitions (je ne sais pas si c'est utile, mais bon) ;
mkfs.ext3 /dev/sdb1; mkfs.ext3 /dev/sdb2; mkfs.ext3 /dev/sdc1; mkfs.ext3 /dev/sdc2
C'est un peu long…
Maintenant, créer deux nouveaux devices
mknod /dev/md0 b 9 0 mknod /dev/md1 b 9 1
c'est à ce stade que nous avons besoin de mdadm (donc installez-le)
apt-get install mdadm
C'est presque fini. Enfin, là, ça va prendre beaucoup de temps mais c'est le plus simple : Il suffit de créer les deux volumes raid en raid1 et taper y
à la question
mdadm --create --metadata=0.90 --verbose /dev/md0 --level=raid1 --raid-devices=2 /dev/sdb1 /dev/sdc1 mdadm --create --verbose /dev/md1 --level=raid1 --raid-devices=2 /dev/sdb2 /dev/sdc2
ça affiche ceci
mdadm --create --verbose /dev/md1 --level=raid1 --raid-devices=2 /dev/sdb2 /dev/sdc2 mdadm: /dev/sdb2 appears to contain an ext2fs file system size=293065760K mtime=Thu Jan 1 01:00:00 1970 mdadm: /dev/sdc2 appears to contain an ext2fs file system size=293065760K mtime=Thu Jan 1 01:00:00 1970 mdadm: size set to 293065664K Continue creating array? y mdadm: array /dev/md1 started.
On peut contrôler tout de suite avec
mdadm --detail -scan
ce qui doit afficher ceci
ARRAY /dev/md0 level=raid1 num-devices=2 UID=b0be37d4:54202dc1:0e9efb29:244465d1 ARRAY /dev/md1 level=raid1 num-devices=2 UID=17538a36:6bce6973:73fafbc4:d6a357b0
mdadm -Es | grep md/0 >>/etc/mdadm/mdadm.conf mdadm -Es | grep md/1 >>/etc/mdadm/mdadm.conf
initramfs doit contenir le fichier de configuration mdadm.conf durant le démarrage de l'ordinateur donc on le met à jour :
sudo update-initramfs -u
Maintenant vous devez attendre la construction du raid. Vous pouvez voir le détail de l'avancement comme ceci :
mdadm --detail /dev/md0
ça affiche ceci :
/dev/md0: Version : 00.90.03 Creation Time : Tue Dec 18 12:36:06 2007 Raid Level : raid1 Array Size : 195318144 (186.27 GiB 200.01 GB) Device Size : 195318144 (186.27 GiB 200.01 GB) Raid Devices : 2 Total Devices : 2 Preferred Minor : 0 Persistence : Superblock is persistent Update Time : Tue Dec 18 12:36:06 2007 State : clean, resyncing Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Rebuild Status : 44% complete UUID : b0be37d4:54202dc1:0e9efb29:244465d1 Events : 0.1 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 1 8 33 1 active sync /dev/sdc1
Là il est a 44%. Il parait que l'on peut le formater pendant la création du raid mais j'attendrais avant de lancer la commande de formatage. Il ne faut absolument pas interrompre la création du raid. Il n'y a plus qu'a monter les volumes ou vous voulez. Par exemple :
mount /dev/md0 /home/ftp mount /dev/md1 /home/samba
Pour le reste suivre les procédures habituelles voir l'utilisation de mount et de fstab.
Utilisation du système RAID-1 logiciel
Comment obtenir des informations sur le statut du RAID ?
Pour obtenir des informations sur le statut du RAID, vous pouvez le faire soit de manière non détaillée avec la commande suivante :
cat /proc/mdstat
Et vous obtenez une sortie de la sorte :
Personalities : [raid1] md0 : active raid1 sdb3[0] sda3[1] 76670144 blocks [2/2] [UU] unused devices: <none>
Pour obtenir les RAID existant dans le système :
sudo mdadm --detail -scan
Qui génère ceci chez moi :
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=48b74990:15f454d9:93947193:76d9ea46 devices=/dev/sdb3,/dev/sda3
Ou alors, vous pouvez demander des informations beaucoup plus détaillée via la commande suivante (chez moi le RAID est sur la device /dev/md0
) :
sudo mdadm --detail /dev/md0
Avec cette commande, vous savez tout :
/dev/md0: Version : 00.90.01 Creation Time : Wed Aug 31 09:38:34 2005 Raid Level : raid1 Array Size : 76670144 (73.12 GiB 78.51 GB) Device Size : 76670144 (73.12 GiB 78.51 GB) Raid Devices : 2 Total Devices : 2 Preferred Minor : 0 Persistence : Superblock is persistent Update Time : Fri Sep 9 10:50:48 2005 State : active Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 UUID : 48b74990:15f454d9:93947193:76d9ea46 Events : 0.60924 Number Major Minor RaidDevice State 0 8 19 0 active sync /dev/sdb3 1 8 3 1 active sync /dev/sda3
Comment invalider un disque ?
Quand un disque à l'air de poser problème (ou qu'il pose réellemment problème), il est de bonne pratique de l'invalider le temps que l'on puisse le retirer physiquement.
Par exemple, si votre disque tombe en panne et que vous ne pouvez pas arrêter le serveur tout de suite, vous allez être inondé de messages d'erreurs et le système sera plus lent. Dans ce cas, vous l'invalidez le temps de pouvoir arrêter le serveur pour effectuer le remplacement physique (à moins d'avoir l'HotPlug bien entendu).
Pour marquer le disque comme étant invalide (ou faulty
), on introduit la commande suivante (ici, j'invalide la partition /dev/sdb3
de l'array RAID /dev/md0
) :
sudo mdadm /dev/md0 -f /dev/sdb3
Comment démarrer en cas de panne d'un des disques ?
J'ai effectué plusieurs tests dans le cas où un disque viendrait à tomber en panne. Ces tests ont été effectués sur le serveur ci-dessus avec le fake-RAID. Si vous n'avez pas de contrôleur, il y a certaines choses qui doivent être effectuées.
Sans contrôleur
Voici une solution qui fonctionne :
*invoquer le shell grub : grub> * Dans le shell de grub exécuter: #Ecrire le MBR de /dev/sda root (hd0,0) setup (hd0) #Ecrire le MBR de /dev/sdb device (hd0) /dev/sdb root (hd0,0) setup (hd0)
Grâce à l'écriture dans le MBR des deux disques, ils démarrent l'un sans l'autre. J'ai simulé tour à tour la panne de sdb puis de sda, sans problème, il faut simplement taper ctrl+D pour continuer le lancement quand on vous le demande.
Avec contrôleur fake-RAID
C'est le charme du contrôleur fake-RAID, il n'y a rien à faire .
En fait, votre Linux est configuré pour travailler sur le disque sda
, ce qui signifie que vous trouverez uniquement des allusions à sda
dans les fichiers de configuration (comme fstab
par exemple). Le disque sdb
sert juste de réserve.
Si vous retirez le disque sda
, le contrôleur montrera au système que le disque sdb
devient le sda
et dès lors, tous vos fichiers de configuration se rapporteront au bon device
.
Comment remplacer le disque défectueux et réactiver le RAID ?
Pour remplacer un disque défectueux, vous devez retirer le disque, en placer un nouveau et le partitionner de la même manière que celui qui est tombé en panne (c'est pour cette raison qu'il faut noter les différentes tailles de partitions utilisées).
Ensuite, vous indiquez correctement les identifications des partitions (Linux
, swap
et raid
dans mon cas) avec fdisk
. Vous suivez la procédure décrite ci-dessus Copie des informations de boot et enfin, vous ajoutez la partition RAID à l'array dégradé (le RAID auquel il manque un disque) via la commande suivante (dans mon cas) :
sudo mdadm /dev/md0 -a /dev/sdb3
Attention : la reconstruction du système RAID commence. Veillez à ne pas éteindre ou redémarrer la machine tant que ce n'est pas fini. (pour savoir quand c'est fini et le pourquoi, relisez la section Premier démarrage ci-dessus.
Une fois la reconstruction finie, votre système est comme neuf.
Agrandir un système RAID-1 logiciel
Le principe même d'un RAID-1 est particulièrement gourmant en espace disque: pour deux disques de capacité égales, vous ne disposerez que de la capacité d'un seul.
Il est donc très probable que vous en arriviez à vouloir agrandir l'espace disponible:
- Soit en ajoutant de nouveaux disques
- Soit en remplaçant les disques existants par des disques de plus grande capacité
Ajout de nouveaux disques
Dans un RAID-1, l'information est recopiée sur l'ensemble des disques contenus dans chaque système, cette copie a un coût en terme de performance. A moins que vous ayez vraiment très peu de confiance dans vos disques, il est souvent superflu d'utiliser du mirroring sur plus de deux disques.
Dans tous les cas, ajouter des disques à un système RAID-1 existant n'augmentera pas l'espace disponible mais la fiabilité de votre stockage. Ainsi pour augmenter la capacité d'un système en RAID-1 en ajoutant des disques, cela revient à créer de nouveaux points de montage ou a recourir aux partitions logiques (LVM).
En effet, si votre périphérique RAID est le support de partition logique, il est en fait vu comme un PV (ou physical volume) au sein d'un VG (Virtual Group) et dans ce VG vous avez défini des LV (Logical Volume). Ajouter des disques reviens à ajouter des PV au VG actuel puis à étendre vos partitions logiques. De cette manière vous aurez agrandis l'espace disponible sur vos partitions existantes.
En cas de défaillance d'un Physical Volume vous perdez les informations contenues dans le Volume Group. Il n'y a donc aucun sens d'ajouter un périphérique RAID0 (dont la fiabilité est faible) à un VG contenant des périphériques en RAID1 (beaucoup plus robustes mais plus couteux).
Remplacement des disques existants
Tout d'abord on vérifie que le sytème actuel n'est pas en défaut et que les deux disques sont correctement synchronisés:
$sudo cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sdb2[0] sda2[1] 312440064 blocks [2/2] [UU] md0 : active raid1 sdb1[0] sda1[1] 128384 blocks [2/2] [UU] unused devices: <none>
- La première partition de chacun des deux disques est attribué à un md0 qui sert de /boot.
- La seconde partition de chacun des deux disques est attribué à un md1 qui sert de support pour LVM (md1 est un PV).
On va ensuite vérifier que chacune des partition de /boot est bien bootable:
fdisk /dev/sda WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): p Disk /dev/sda: 2000.4 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x494ca524 Device Boot Start End Blocks Id System /dev/sda1 * 1 16 128488+ fd Linux raid autodetect /dev/sda2 17 19452 156151800 fd Linux raid autodetect
Il y a bien une étoile dans la colonne "Boot" en face de /dev/sda1.
On répète l'opération avec /dev/sdb.
Si tout est bon, on peut arrêter la machine afin de procéder au premier échange.
On redémarre ensuite, il est possible qu'au cours du démarrage le démon mdadm qui gère le RAID vous dise que le RAID1 est endommagé et vous demande si vous souhaitez quand même continuer à utiliser la machine, c'est normal puisque vous avez volontairement retiré un disque.
Vous pouvez vérifier l'état du RAID avec la commande
cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sda2[1] 312440064 blocks [2/1] [_U] md0 : active raid1 sda1[1] 128384 blocks [2/1] [_U]
Il y a donc un seul volume de disponible sur les deux qui le compose.
Un fois le système démarré, on partitionne le nouveau disque de manière à avoir :
- la partition /boot de la même taille que l'ancienne (pas besoin de davantage) et bootable
- l'autre partition aussi grande que possible
fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x1c8e53bb. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): p Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x1c8e53bb Device Boot Start End Blocks Id System Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-243201, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-243201, default 243201): 16 Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (17-243201, default 17): Using default value 17 Last cylinder, +cylinders or +size{K,M,G} (17-243201, default 243201): Using default value 243201 Command (m for help): a Partition number (1-4): 1 Command (m for help): p Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x1c8e53bb Device Boot Start End Blocks Id System /dev/sdb1 * 1 16 128488+ 83 Linux /dev/sdb2 17 243201 1953383512+ 83 Linux Command (m for help): t Partition number (1-4): 1 Hex code (type L to list codes): fd Changed system type of partition 1 to fd (Linux raid autodetect) Command (m for help): t Partition number (1-4): 2 Hex code (type L to list codes): fd Changed system type of partition 2 to fd (Linux raid autodetect) Command (m for help): p Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x1c8e53bb Device Boot Start End Blocks Id System /dev/sdb1 * 1 16 128488+ fd Linux raid autodetect /dev/sdb2 17 243201 1953383512+ fd Linux raid autodetect Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
Ensuite, il suffit de rajouter les partitions aux volumes RAID-1:
sudo mdadm /dev/md0 --add /dev/sdb1
et
sudo mdadm /dev/md1 --add /dev/sdb2
La reconstruction commence immédiatement, elle est très rapide pour md0, le volume étant très faible, un peu plus longue pour md1 (le temps qu'il recopie toutes les informations octets par octets d'un disque sur l'autre.
cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sdb2[2] sda2[1] 312440064 blocks [2/1] [_U] [=>...................] recovery = 5.9% (18516224/312440064) finish=52.4min speed=93437K/sec md0 : active raid1 sdb1[0] sda1[1] 128384 blocks [2/2] [UU] unused devices: <none>
Une fois la reconstruction finie, il faut renouveler l'opération en remplaçant le second disque.
Lorsque la synchro est terminée avec vos deux nouveaux disques en place, vous pouvez alors augmenter la taille des volumes en partant du plus bas (plus proche de la couche physique) jusqu'à celui qui est le plus éloigné de la couche physique, en ce qui me concerne c'est à dire:
- Redimensionnement du md
mdadm -G /dev/md1 -z max mdadm: component size of /dev/md1 has been set to 1953383424K
- Redimensionnement du pv
pvresize /dev/md1
- Redimensionnement d'une partition logique (LV)
lvextend -L +800 /dev/mynew_vg/vol01
- Redimensionnement du système de fichier sur la partition logique en question:
resize2fs /dev/mynew_vg/vol01
Notes
Concernant les fake-RAID
La plupart des contrôleurs RAID ATA (ou SATA) (à l'exception de 3Ware Escalade, Adaptec 24x0, Areca, HP/Compaq, IBM ServeRAID, Intel SRC*/ICP Vortex, LSI Logic MegaRAID 150-4/150-6 et Tekram) ne sont pas des RAID réellement hardware mais ce sont plutôt des RAID software ou des fake-RAID dépendant du BIOS. Les fonctionnalités matérielles manquantes sont traditionnellement émulés de manière particulière, non documentée et avec des pilotes propriétaires pour pouvoir sortir du matériel à des prix compétitifs.
Les fake-RAID sont difficiles à supporter sous Linux. En effet, le reverse-engineering est difficile, les pilotes sont propriétaires et particuliers et il y a peu de coopération avec les constructeurs.
Le plus souvent, Linux est incapable de lire des volumes fake-RAID existants avec ce type de contrôleur; à moins que vous n'utilisiez les pilotes fake-RAID propriétaire (quand ils existent…). A moins de vouloir avoir un dual-boot avec MS-Windows, vous ne devez pas vous soucier de ces pilotes. Car le RAID logiciel (software) Linux (le pilote md
du noyau) est plus rapide et plus fiable. (vous trouverez une série de tests comparatifs reproductibles sur cette page : http://spamaps.org/raidtests.php)
Vous serez donc bien avisé de fuir les volumes fake-RAID, d'utiliser vos disques SATA comme des périphériques blocs et d'activer le RAID software Linux durant l'installation .
Remarque d'un utilisateur: J'ai fait l'expérience sur mon poste de travail avec un contrôleur NVIDIA qui était géré par Linux en natif (Avec Ubuntu 8.10) et cela a fonctionné quelques temps. Puis le RAID 1 s'est corrompu pour je ne sais quelle raison. J'ai été dans l'incapacité de récupérer le RAID 1. Donc depuis je gère mes partitions en RAID logiciel purement Linux et exit les RAIDs irrécupérables ;)
Remarque importante : La critique énoncée ci-dessus à propos des fake-RAID est justifiée mais il n'en est pas moins vrai que les contrôleurs (même si il ne s'occupe pas du RAID) sont très pratiques pour la séquence de boot lorsqu'un disque tombe en panne. Voir la section ci-dessus : Comment démarrer en cas de panne d'un des disques ?.
Concernant le démarrage avec des contrôleurs Promise
Lors de l'installation d'Ubuntu sur le serveur décrit ci-dessus, j'ai été confronté à un problème peu ordinaire (enfin, c'était la première fois que j'ai rencontré un tel problème et qui plus est, n'était pas documenté sur le web).
En fait, après plusieurs tentatives d'installation infructueuse sur les disques SATA de ce serveur, j'en suis arrivé à essayer de comprendre comment fonctionnait le contrôleur Promise.
Le problème auquel j'étais confronté était le suivant :
- Les deux disques sont connectés sur le contrôleur.
- Le contrôleur m'indique à l'écran que les disques sont en
1x2 mirror
. - Je boote sur le CD d'installation Ubuntu.
- Premier problème, Ubuntu détecte 2 disques et ne voit pas les disques comme un périphérique RAID.
- Je me dis "Pas grave, j'installe sur le premier et à priori, le second devrait avoir les mêmes données."
- J'installes Ubuntu sur le premier disque.
- A la fin de l'installation, je redémarre la machine et là j'obtiens un message du style
No operating system
.
Après quelques recherches, j'ai appris que les contrôleurs Promise de ce type ne sont pas des contrôleurs RAID hardware mais bien des fake-RAID (voir note ci-dessus à ce propos).
Je me dis, bon ok mais ça n'explique pas que mon système ne boote pas (même lorsque je déconnecte physiquement le second disque).
Voici ce que j'ai fait :
- J'ai désactivé tous les arrays dans le BIOS du contrôleur (CTRL+F au démarrage),
- j'ai retiré physiquement le second disque
- et j'ai installé Ubuntu sur le premier comme si de rien était.
- Ensuite, j'ai reconnecté le second disque et j'ai créé un nouvel array dans le BIOS du contrôleur. Attention : lors de la création du nouvel array, j'ai demandé au contrôleur de faire un
Create and duplicate
. A partir de ce moment, Ubuntu bootait (sans RAID mais le système démarrait). - Enfin, j'ai suivi la procédure expliquée dans cet article pour avoir du RAID-1.
Ma théorie concernant ce comportement pour le moins étrange…
Je pense que le MBR pour le RAID est stocké dans le contrôleur et non sur le disque. Etant donné qu'on utilise pas les pilotes de Promise, le MBR (qui indique où booter) est inscrit uniquement sur le disque d'installation et dès lors, il n'est pas connu au niveau du contrôleur. En effectuant une duplication, le MBR Grub/Ubuntu inscrit sur le premier disque est copié sur le second et dans le contrôleur.
Cependant, lors de la mise à jour du kernel via apt-get, le reboot est impossible.
Boot directement sur la partition RAID
Comme dit plus haut, on m'a indiqué que GRUB et LILO sont capables de booter directement sur une device de type RAID software (/dev/mdX). Je n'ai cependant pas eu l'occasion d'essayer la procédure. La machine qui est a ma disposition est maintenant en production. Je mettrai cette page à jour dès que possible.
Il s'agit d'un cas idylique, aucune modification n'est à effectuer en cas de mise à jour du noyau.
Avec GRUB
Exécutez
login@hostname:~$ sudo grub
Pour trouver où sont installés les fichiers de configuration du chargeur de démarrage GRUB du RAID 1 (Ici la partition est dédiée au boot donc elle est montée dans le répertoire /boot de la partition racine /, si les fichiers de boot sont directement sur la partition racine / saisissez grub>find /boot/grub/stage1):
Grub>find /grub/stage1 (hd0,0) (hd1,0)
Si vos disques du RAID 1 sont /dev/sda et /dev/sdb. Pour installer le chargeur de démarrage GRUB dans le MBR de /dev/sda:
Grub>device (hd0) /dev/sda Grub>root (hd0,0) Grub>setup (hd0)
Pour installer le chargeur de démarrage GRUB dans le MBR de /dev/sdb:
Grub>device (hd0) /dev/sdb Grub>root (hd0,0) Grub>setup (hd0)
Éditez le fichier de configuration du chargeur de démarrage GRUB:
login@hostname:~$ sudo nano /boot/grub/menu.lst
Modifiez la configuration du chargeur de démarrage GRUB pour une partition racine / sur le RAID 1 /dev/md1:
title Ubuntu n°version, kernel n°kernel-generic root (hd0,0) kernel /vmlinuz-n°kernel-generic root=/dev/md1 ro quiet splash initrd /initrd.img-n°kernel-generic quiet
Mise à jour de la configuration du chargeur de démarrage GRUB
login@hostname:~$ sudo update-grub
Avec Lilo
Voici l'état des partitions (pas comme décrite ci-dessus) et la configuration :
# fdisk -l Disk /dev/sda: 36.4 GB, 36401479680 bytes 255 heads, 63 sectors/track, 4425 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 13 104391 fd Linux raid autodetect /dev/sda2 14 17 32130 fd Linux raid autodetect /dev/sda3 18 4425 35407260 fd Linux raid autodetect Disk /dev/sdb: 36.4 GB, 36401479680 bytes 255 heads, 63 sectors/track, 4425 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 * 1 13 104391 fd Linux raid autodetect /dev/sdb2 14 17 32130 fd Linux raid autodetect /dev/sdb3 18 4425 35407260 fd Linux raid autodetect # cat /etc/lilo.conf disk=/dev/md0 partition=/dev/md1 map=/boot/map prompt delay=20 timeout=20 vga=normal default=Linux image=/boot/vmlinuz root=/dev/md0 label=Linux read-only # df -h Filesystem Size Used Avail Use% Mounted on /dev/md0 99M 19M 75M 20% / tmpfs 1013M 0 1013M 0% /dev/shm /dev/md1 31M 5.9M 23M 21% /boot /dev/mapper/svg-home 496M 31M 440M 7% /home /dev/mapper/svg-tmp 248M 8.1M 228M 4% /tmp /dev/mapper/svg-usr 2.0G 776M 1.2G 41% /usr /dev/mapper/svg-var 248M 207M 29M 89% /var /dev/mapper/svg-log 1008M 33M 924M 4% /var/log /dev/mapper/svg-loc 20G 12G 7.9G 59% /local
Pour éviter le problème ci-dessus, soit vous boutez sans périphérique de stockage branché, soit vous mettez tous les noms éventuels sous lequel peuvent se retrouver les partitions RAID à assembler. Par exemple, pour un RAID 1 avec deux disques je mets dans mdadm.conf :
DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1
ET mdadm trouvera les deux bonnes partitions de type RAID là-dedans!
Liens
Server
, il suffit d'ajouter les paquets kubuntu-desktop pour KDE, ubuntu-desktop pour Gnome ou xubuntu-desktop pour XFCE.