1 votes

Software raid mdadm n'ajoute pas de spare

Je viens de découvrir le même problème sur deux serveurs tout neufs et identiques installés il y a seulement 9 mois environ. Je n'ai pas pu écrire sur le disque sur les deux, car le système l'avait marqué en lecture seule. Les journaux indiquaient qu'il y avait une sorte d'erreur de disque sur les deux.

Notez que j'utilise KVM avec plusieurs invités sur chacun de ces serveurs. Les invités fonctionnaient tous bien, mais le problème se situait au niveau de l'hôte KVM. Cela n'a probablement pas d'importance, mais c'est peut-être pertinent. Les deux systèmes ont seulement deux lecteurs avec raid1 logiciel et LVM au dessus. Chaque invité KVM a également sa propre partition LVM.

Les deux systèmes montraient une matrice RAID1 dégradée lorsqu'on regardait /proc/mdstat .

J'ai donc redémarré un des systèmes, et il m'a dit que je devais lancer manuellement fsck . C'est ce que j'ai fait. Cela a semblé régler les problèmes et un redémarrage a remis le système en marche normalement. Le même processus a également fonctionné sur le second serveur.

Ensuite, j'ai lancé mdadm --manage /dev/md0 --add /dev/sdb1 pour ajouter le lecteur défaillant dans la matrice. Cela a bien fonctionné sur les deux serveurs. Pendant l'heure suivante, en regardant /proc/mdstat a montré les progrès réalisés sur la synchronisation des disques. Après environ une heure, un système a terminé, et /proc/mdstat montre que tout fonctionne bien avec [UU] .

Cependant, sur l'autre système, après environ une heure et demie, la charge du système est montée en flèche et rien ne répondait. Quelques minutes plus tard, tout est revenu. Mais en regardant /proc/mdstat montre maintenant ce qui suit :

root@bond:/etc# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid1 sda1[2] sdb1[1]
      293033536 blocks [2/1] [_U]

unused devices: <none>

Comme vous pouvez le voir, il semble ne plus y avoir de synchronisation. Le pourcentage d'exécution, le temps restant, etc. ne sont plus affichés. Cependant, en exécutant mdadm --detail /dev/md0 montre ça :

root@bond:/etc# mdadm --detail /dev/md0
/dev/md0:
        Version : 00.90
  Creation Time : Mon Nov 30 20:04:44 2009
     Raid Level : raid1
     Array Size : 293033536 (279.46 GiB 300.07 GB)
  Used Dev Size : 293033536 (279.46 GiB 300.07 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Fri Sep 10 23:38:33 2010
          State : clean, degraded
 Active Devices : 1
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 1

           UUID : 4fb7b768:16c7d5b3:2e7b5ffd:55e4b71d
         Events : 0.5104310

    Number   Major   Minor   RaidDevice State
       2       8        1        0      spare rebuilding   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1

La ligne de fond semble indiquer que la réserve est en train de se reconstruire. Pourquoi est-ce un spare ? Le système rapporte que les deux appareils sont propres. Il est resté comme ça pendant des heures. Les disques sont des VelociRaptors 300GB 10K RPM petits et rapides, donc j'aurais pensé que la synchronisation aurait déjà eu lieu. La tentative de réinsertion indique que le périphérique est occupé :

root@bond:/etc# mdadm /dev/md0 --re-add /dev/sda
mdadm: Cannot open /dev/sda: Device or resource busy

L'exécution de dmesg sur le "bon" serveur montre ceci à la fin :

[ 4084.439822] md: md0: recovery done.
[ 4084.487756] RAID1 conf printout:
[ 4084.487759]  --- wd:2 rd:2
[ 4084.487763]  disk 0, wo:0, o:1, dev:sda1
[ 4084.487765]  disk 1, wo:0, o:1, dev:sdb1

Sur le "mauvais" serveur, ces 4 dernières lignes sont répétées des centaines de fois. Sur le "bon" serveur, elles n'apparaissent qu'une fois.

Les lecteurs sont toujours synchronisés ? Cette "reconstruction" va-t-elle se terminer ? Dois-je simplement être plus patient ? Si non, que dois-je faire maintenant ?

UPDATE :

J'ai redémarré, et le disque a recommencé à se synchroniser. Après presque 2 heures, la même chose s'est produite comme décrit ci-dessus (j'obtiens toujours un [_U]). Cependant, j'ai pu voir les journaux dmesg avant que les morceaux d'impression de RAID1 conf ne les consument tous :

[ 6348.303685] sd 1:0:0:0: [sdb] Unhandled sense code
[ 6348.303688] sd 1:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[ 6348.303692] sd 1:0:0:0: [sdb] Sense Key : Medium Error [current] [descriptor]
[ 6348.303697] Descriptor sense data with sense descriptors (in hex):
[ 6348.303699]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
[ 6348.303707]         22 ee a4 c7 
[ 6348.303711] sd 1:0:0:0: [sdb] Add. Sense: Unrecovered read error - auto reallocate failed
[ 6348.303716] end_request: I/O error, dev sdb, sector 586065095
[ 6348.303753] ata2: EH complete
[ 6348.303776] raid1: sdb: unrecoverable I/O read error for block 586065024
[ 6348.305625] md: md0: recovery done.

Donc peut-être que la question que je devrais poser est "Comment puis-je exécuter fsck sur un disque de rechange dans un ensemble raid ?".

2voto

Rodger Points 609

Je ne sais pas si vous avez effectivement remplacé le(s) disque(s) défaillant(s) ? Parce que vos symptômes auraient un sens pour moi si vous aviez ré-additionné le lecteur défectueux, auquel cas il y a de fortes chances que le lecteur se soit bloqué. Si vous avez réinséré le disque défectueux, y a-t-il des erreurs ultérieures dans /var/log/messages ou dmesg ?

(Par ailleurs, je vous déconseille fortement de réinsérer un disque défectueux dans une matrice RAID. Si le défaut a corrompu des données sur le plateau, vous pouvez constater que lorsque vous le rajoutez à la matrice, la resynchronisation laisse le fichier corrompu sur le disque, et la prochaine fois que vous lirez les fichiers, ce sera un coup de dés pour savoir si vous obtenez de bonnes ou de mauvaises données, selon le disque qui répond en premier ; j'ai vu cela se produire dans la nature).

0voto

Shadow0144 Points 11

En utilisant mdadm --details, un disque sera listé comme disque de rechange pendant la reconstruction. Une fois la reconstruction terminée, il ne sera plus affiché comme disque de rechange.

[ 6348.303711] sd 1:0:0:0: [sdb] Add. Sense: Unrecovered read error - auto reallocate failed
[ 6348.303716] end_request: I/O error, dev sdb, sector 586065095
[ 6348.303753] ata2: EH complete
[ 6348.303776] raid1: sdb: unrecoverable I/O read error for block 586065024
[ 6348.305625] md: md0: recovery done.

La première ligne indique qu'il y a eu un échec de réallocation, et que les données n'ont pas été lues. Les trois lignes suivantes signalent que les données n'ont pas pu être lues et énumèrent les secteurs illisibles.

Comme Rodger l'a souligné, le disque est mauvais, ne le réinsérez pas. Ce n'est jamais une bonne idée de remettre en place un disque qui a échoué. Retirez le disque et remplacez-le. Si vous le souhaitez, exécutez des diagnostics sur le disque défaillant, mais seulement après l'avoir retiré et remplacé.

0voto

Tout d'abord, il faut se débarrasser de tout disque qui génère des erreurs de lecture qui se retrouvent dans le fichier journal. Cela signifie que la relocalisation des blocs défectueux a échoué et/ou que le disque est sur le point de mourir.

Je vous suggère d'utiliser un CD de secours Linux pour sauver vos données, comme par exemple http://ubuntu-rescue-remix.org/ pour utiliser ddrescue. Il peut faire une copie d'image sur la partition d'un nouveau disque, et fera de nombreuses tentatives, etc. pour essayer de récupérer votre partition. Montez une clé USB ou une autre partition

mkdir /tmp/x && mount /dev/sdd1 /tmp/x

pour conserver le fichier journal de ddrescue - vous pouvez alors arrêter ddrescue (ctrl-C) et le redémarrer plus tard à partir du même point.

Faites une partition sur le nouveau disque un peu plus grande que l'ancien. Vous n'êtes pas obligé d'utiliser tout le disque !

Démarrez le CD de secours avec "nodmraid" comme paramètre de démarrage du noyau. Si vous utilisez le live CD ubuntu, installez RAID et LVM si vous l'utilisez.

apt-get install mdadm lvm2 gddrescue

vous devez être connecté à l'internet pour que cela fonctionne). Sinon, utilisez le CD de secours ubuntu pour l'étape ddrescue. J'ai échangé entre le CD de secours pour les exécutions ddrescue, et le CD live pour le travail Grub et fsck.

En supposant que /dev/sdb est votre disque source défaillant, et /dev/sdx est votre nouveau disque, et /mnt/x est une clé USB ou une partition sur un autre disque qui a été monté. Vous pouvez consulter le site besoin de le fichier journal de ddrescue, vraiment ! Il suit le déroulement de ddrescue et permet de l'interrompre.

Conformément à http://www.forensicswiki.org/wiki/Ddrescue

ddrescue --no-split /dev/sdb /dev/sdX imagefile /mnt/x/logfile

entonces

ddrescue --direct --max-retries=3 /dev/sdb /dev/sdX /mnt/x/logfile

entonces

ddrescue --direct --retrim --max-retries=3 /dev/sdb /dev/sdX /mnt/x/logfile

N'ayez pas peur de faire Ctrl-C si la récupération d'un seul secteur prend des heures. Passez simplement à l'étape suivante (l'étape 1 doit réussir quoi qu'il arrive). La dernière étape tente de récupérer les dernières miettes de données utilisables.

Vous devrez également faire

mdadm --create /dev/md99 --level-1 --raid-devices=2 missing /dev/sdX

pour créer une nouvelle matrice RAID en utilisant le nouveau disque, ceci écrit un nouveau superbloc RAID sur la partition (dans les derniers 64K à 128K à la fin de la partition).

Retirez votre vieux disque défaillant /dev/sdb du système afin qu'il ne soit pas visible pour linux.

Rendez votre disque RAID source accessible. Vous devrez peut-être utiliser le paramètre "nodmraid" au noyau de démarrage, car j'ai eu des problèmes avec le CD de secours Ubuntu, et j'ai fini par utiliser le live CD Ubuntu (10.4) où nodmraid est dans F6 Options. Vous devriez juste avoir besoin d'utiliser

mdadm --assemble /dev/md99 /dev/sdX

Puis fsck ou faites n'importe quel contrôle que vous devez faire sur les données de la matrice RAID md99 (j'ai utilisé vgscan puis j'ai pu voir les LV LVM pour lancer le contrôle). J'utilise XFS pour mythtv mais la commande xfs_check a fait planter mon système, mais xfs_repair était OK.

Montez le répertoire /boot depuis votre nouveau /dev/sdX

monter /dev/mapper/my_vg/root_lv /tmp/x

puis mettez un nouveau Grub boot record sur le nouveau disque /dev/sdX RAID (seulement si vous démarrez à partir de RAID !)

Grub-setup -d /tmp/x/boot/Grub /dev/sdX

Vous avez maintenant une matrice RAID (presque) amorçable. Vous pouvez aussi faire la configuration en utilisant Grub lui-même, ou utiliser dd pour copier les 446 premiers octets de /dev/sdb vers /dev/sdX. SEULEMENT les 446 premiers octets, le reste du 1er secteur est votre table de partition, que vous allez farcir énormément si vous en copiez plus ! Vous devrez peut-être faire de même pour le 1er secteur de votre partition /dev/sdX1 (disons). Sauvegardez tous les secteurs que vous allez écraser, en utilisant également dd.

Si vous utilisez grub2 et que vous démarrez à partir de RAID, vous constaterez que l'UUID de la matrice RAID a changé et que votre démarrage échouera. Modifiez la ligne de commande de démarrage (e dans Grub panneau de démarrage) pour supprimer splash et quiet, afin que vous puissiez voir ce qui se passe. Ensuite, après l'échec du démarrage, vous êtes laissé dans initramfs.

mdadm --assemble /dev/md99 /dev/sdX

puis vérifiez /proc/mdstat pour vous assurer que le tableau est là. Si c'est le cas, il suffit de "quitter" et, avec un peu de chance, votre stanza de démarrage Grub fonctionnera correctement (le mien a été configuré pour utiliser LVM, il a donc trouvé les LV sur le périphérique RAID une fois qu'il y avait un périphérique RAID, il a simplement cherché le LV). Une fois que vous avez démarré, vous avez presque terminé.

Le fichier image initrd (fichier cpio gzippé) contient une copie de mdadm.conf utilisée pendant le processus de démarrage, visible et modifiable sous la forme /etc/mdadm/mdamdm.conf pendant le processus de démarrage. Si vous pouvez faire démarrer votre système normalement, mettez simplement à jour l'initramfs en utilisant

update-initramfs -u

Si vous n'arrivez pas à démarrer le système à cause d'un UUID incorrect dans le fichier mdadm.conf

Soyez conscient que votre périphérique de destination /dev/sdX peut apparaître comme /dev/sdY lorsque vous démarrez d'une manière différente (Grub, rescue, real boot).

Au fait, à moins que vous n'utilisiez RAID5 et que vous soyez vraiment intéressé par l'alignement des blocs, j'utiliserais une partition pour votre matrice RAID, vous n'avez pas besoin d'utiliser un disque entier (surtout si vous remplacez un disque de 1 To par un disque de 2 To). Vous pouvez toujours ajouter une autre partition et une deuxième matrice RAID plus tard pour utiliser la totalité des 2 To.

Ouf ! C'est fait !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X