Je réalise que cette question est maintenant ancienne, mais elle n'a jamais été en fait répondue, et j'aurais pu utiliser un guide quand j'avais besoin de faire quelque chose de similaire. Donc, dans l'intérêt de répondre à la question du PO avec des faits plutôt qu'avec des opinions, voici comment j'ai mis à niveau un ensemble RAID5 existant à 3 disques sur un Dell PE R430 avec un PERC H730P (alias MegaRAID SAS-3 3108 rev2) en utilisant perccli64 v7.1327 s'exécutant sur le noyau Linux 4.15.
Pour référence, ma topologie :
- Contrôleur 0
- Boîtier 32
- Emplacements 1, 2, 3 (l'emplacement 0 contient un SSD)
- Ancienne taille du disque dur 4 To (3,637 TiB) x3
- Taille du Vol 0 7,276 TiB (avant l'expansion)
- Nouvelle taille du disque dur : 12 To (10,913 TiB)
Veuillez faire attention à la différence entre Terabyte (TB ou 10^12) et Tebibyte (TiB ou 2^40). perccli64 affiche les tailles en Tebibytes, mais utilise "TB" comme suffixe. Je sais... je n'aime pas ça non plus.
Contexte : avec un volume RAID5 d'environ 8 To, nous manquions d'espace. J'avais calculé qu'un volume de 20 TiB était nécessaire, donc j'ai commandé trois disques durs SATA HGST de 12 To. Le plan :
- Remplacer 1 disque, laisser le volume se reconstruire.
- Répéter pour le disque 2
- Répéter pour le disque 3
- Étendre l'ensemble pour utiliser les disques de plus grande taille
- Redimensionner le(s) système(s) de fichiers existant(s) pour utiliser le volume plus grand
- Faire tout cela alors que le système est en fonctionnement et sans accès à iDRAC
Avec les PERCs, il est possible de simplement retirer un disque actif et en insérer un de remplacement, mais je dirigeais cela à travers des mains intelligentes, et je voulais être parfaitement clair sur quel disque retirer, donc j'ai d'abord mis un seul disque hors ligne, en commençant par l'emplacement 1, en exécutant
perccli64 /c0/e32/s1 set offline
AVIS IMPORTANT : cela met le RAID5 dans un état dégradé ! Je recommande de regarder d'abord les statistiques SMART, et si un disque montre des signes d'erreurs, remplacer celui-ci en premier. Si deux disques ou plus montrent des indications de défaillance imminente, ne dégradez pas l'ensemble sans un plan de DR en place et une sauvegarde complète validée et accessible facilement. En fait, une personne intelligente ferait cela de toute façon. Vous pouvez vérifier les stats SMART (après avoir installé smartmontools) avec :
smartctl -a /dev/sdb -d megaraid,n
(remplacez le dernier n par l'emplacement que vous souhaitez examiner).
Une fois hors ligne, pour faciliter l'identification du disque par les mains intelligentes, flasher la LED de localisation avec
perccli64 /c0/e32/s1 start locate
Ensuite, la personne qui se trouve au serveur peut retirer le disque clignotant et en mettre un nouveau. En exécutant :
perccli64 /c0/e32/s1 show
devrait montrer d'abord le disque avec un état "Ofln" (Hors ligne), ensuite non disponible tant qu'aucun n'est présent, ensuite un état "Rbld" (Reconstruction) une fois que le nouveau disque est inséré, et enfin "Onln" (En ligne) une fois la reconstruction terminée.
perccli64 /c0/e32/s1 show rebuild
montrera un pourcentage de progression pendant la reconstruction (ne faites pas confiance aux estimations de temps), et
perccli64 /c0/v0 show
affichera le volume comme "Dgrd" (Dégradé) pendant la reconstruction, puis "Optl" (Optimal) une fois terminée. Mes disques sont SATA, et la charge système est modérément lourde, mais la reconstruction de la partie 4 To du volume sur les nouveaux disques n'a pris qu'environ 15 heures pour chaque disque.
Attendez que l'ensemble soit optimal, puis répétez les mêmes étapes pour les disques restants, dans mon exemple, les emplacements /c0/e32/s2 et /c0/e32/s3.
Une fois que tous les disques sont remplacés, votre topologie devrait montrer un ensemble de volumes d'array optimal composé de disques durs plus grands mais toujours avec la taille d'array plus petite d'origine, dans mon cas 7,276 TiB (affiché incorrectement en tant que TB, pas TiB). L'étape suivante consiste à étendre l'array lui-même, mais vous devrez d'abord faire un peu de calcul...
La commande d'extension perccli64 est assez mal documentée. La seule aide donnée est :
Syntaxe : perccli /cx/vx expand Size= [expandarray]
DESCRIPTION : Étend le VD à la taille spécifiée dans l'array
OPTIONS :
expandarray - étendre l'array si possible pour accommoder la taille donnée
Size - Si le format de taille n'est pas mentionné, la taille donnée sera traitée en Mo
Ce qui n'est pas clair dans la sortie d'aide, c'est que le paramètre Size, qui est requis, est la taille À AJOUTER à l'array, pas la taille désirée après l'expansion. Nous voulons lui donner la taille du nouvel array en Mio, moins la taille de l'ancien array en Mio. Dans mon cas, 12 To (en réalité 12 000 138 625 024 octets, comme indiqué par smartctl) moins 4 To (en réalité 4 000 781 611 008) donne 7 999 357 014 016. Un RAID5 de trois disques est le double de cela à 15 998 714 028 032 octets, et divisé par 2^20 donne 15 257 562 Mio. Si vous spécifiez trop, il échouera en indiquant un espace insuffisant. Pour éviter cela, retirez quelques gigas, car il arrondit au pourcentage supérieur (!!!) de l'espace total de toute façon... Comme je l'ai dit, la commande d'extension est mal documentée, c'est pourquoi je partage ce que j'ai appris ici.
L'option "expandarray" semble être nécessaire uniquement lorsque la taille de base du disque a changé, comme c'est le cas ici, car en essayant de l'exécuter sans cette option a renvoyé une erreur indiquant un espace insuffisant, mais avec une note supplémentaire indiquant "étendre l'array pour obtenir l'espace supplémentaire". Enfin, un message de diagnostic utile ! J'ai donc exécuté
perccli64 /c0/v0 expand Size=15250000 expandarray
ce qui a rapidement retourné un succès car cela a lancé une tâche d'initialisation en arrière-plan (BGI). Le BGI signifie que le nouvel espace est disponible immédiatement, et vous pouvez visualiser la progression de l'initialisation avec
perccli64 /c0/v0 show bgi
Ce résultat est très mauvais pour estimer le temps restant, car il montre un pourcentage qui commence par la partie qui était déjà existante comme déjà terminée. Je pense qu'il considère la première partie comme initialisée rapidement, et l'inclut lors de l'estimation du temps restant pour la partie qui doit en fait être écrite sur le disque. Alors que 4 To ont pris 15 heures auparavant, et que c'est encore 8 To supplémentaires par disque, je m'attendais à ce que cela prenne environ 30 heures, mais cela pourrait prendre beaucoup plus de temps car il s'exécute à une priorité d'arrière-plan plus basse. Je ne sais pas combien de temps cela a vraiment pris dans mon cas.
Alors que le contrôleur rend magiquement l'espace disponible immédiatement en exécutant la tâche d'initialisation en arrière-plan, nous devons quand même faire en sorte que le système d'exploitation reconnaisse la nouvelle taille du volume. Commencez par une analyse du périphérique SCSI en envoyant '1' à /sys/class/block/sdb/device/rescan (en spécifiant le nom du périphérique correct s'il ne s'agit pas de sdb), après quoi il affiche la nouvelle taille plus grande lors de l'exécution de
blockdev --getsize64 /dev/sdb
Cela termine la partie difficile. Les étapes restantes utilisent des commandes Linux standard. Il existe de nombreux autres tutoriels sur ces étapes, et chaque système est différent, donc je n'entrerai pas dans les détails minutieux. Voici ce qui a fonctionné pour moi. J'ai utilisé parted pour corriger le GPT (il offre la première fois où il essaie d'imprimer la table), puis ajouter une nouvelle partition commençant après le dernier secteur utilisé et se terminant à la fin du disque étendu (commande parted "mkpart pv2 15625877504s 46873438207s"). Encore une fois, vous devrez faire des calculs pour obtenir les bonnes valeurs de secteur. Ensuite, j'ai utilisé la nouvelle partition avec
pvcreate /dev/sdb5
vgextend volgrp /dev/sdb5
lvextend -l +95%FREE /dev/volgrp/logvol
resize2fs /dev/volgrp/logvol
Après cela, la sortie df montrait environ 14 To d'espace supplémentaire, et mon problème de capacité était résolu. Notez que j'ai réservé 5% de l'espace libre au cas où j'aurais besoin d'étendre l'un des autres LV également.