Réparation d’un Storage Space - Les étapes à ne pas manquer
Aujourd’hui, nous allons faire la réparation d’un storage pool.
Le but de cet article n’est pas d’expliquer le fonctionnement des Storage Pool mais de voir un peu les outils à notre disposition pour faire une réparation, et dans quel ordre les employer.
De nombreux blogs décrivent déjà les Storage Pool de façon très détaillée, mais nous allons revoir quelques notions avant d’aller plus loin :
- Storage Pool : Le groupe de disques physiques qu’on met en commun
- Space : Un disque virtuel créé à partir du Storage Pool. Il peut y avoir 3 types de Spaces : Simple, Mirror (chaque bloc pouvant être disponible en 2 ou 3 exemplaires) et Parity (Raid-5)
- Le mode d’usage des disques physiques : Automatic, Manual et Hot Spare. Il en existe d'autres, mais ce n'est pas le but de cet article.
Vous trouverez d’avantage d’informations sur https://technet.microsoft.com/en-us/library/hh831739(v=ws.11).aspx
La plupart des utilisateurs construisent leur storage pool en ajoutant les disques physiques en mode d’usage Automatic, mais on peut ajouter les disques en mode d’usage Manuel et Hot Spare. Le mode Hot Spare, comme son nom l’indique, fait en sorte que ce disque ne sera pas utilisé quand on créera un disque virtuel (ou space). Le mode d’usage Manual permet de contrôler la taille des blocs et les disques physiques qui seront utilisés par le disque virtuel que l’on va créer, entre autre.
En cas de panne, le mode Automatic fonctionne parfaitement, mais le mode Manual demande quelques actions à mener dans le bon sens, et c’est ce que nous allons voir.
ENVIRONNEMENT
Supposons que nous avons un pool de 5 disques en usage Manual sur lequel nous avons créé 3 disques virtuels en mirroir
On peut détailler toutes ces configurations en powershell également :
Lister les Storage Pool
PS C:\> Get-StoragePool
FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly
------------ ----------------- ------------ ------------ ---------
Primordial OK Healthy True False
OnePool OK Healthy False False
Lister les disques physiques appartenant à un Storage Pool
PS C:\> Get-StoragePool -FriendlyName 'OnePool' | Get-PhysicalDisk
FriendlyName CanPool OperationalStatus HealthStatus Usage Size
------------ ------- ----------------- ------------ ----- ----
PhysicalDisk4 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk1 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk5 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk2 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk3 False OK Healthy Manual-Select 126.25 GB
Lister les disques virtuels créés dans un Storage Pool
PS C:\> Get-StoragePool -FriendlyName 'OnePool' | Get-VirtualDisk
FriendlyName ResiliencySettingName OperationalStatus HealthStatus IsManualAttach Size
------------ --------------------- ----------------- ------------ -------------- ----
Mirror-1 Mirror OK Healthy False 100 GB
Mirror-2 Mirror OK Healthy False 50 GB
Mirror-3 Mirror OK Healthy False 162 GB
Et réciproquement, trouver de quel Storage Pool un disque virtuel est issue
PS C:\> Get-VirtualDisk -FriendlyName 'Mirror-1' | Get-StoragePool
FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly
------------ ----------------- ------------ ------------ ----------
OnePool OK Healthy False False
Et enfin, lister les disques physiques participant au disque virtuel
PS C:\> Get-VirtualDisk -FriendlyName 'Mirror-1' | Get-PhysicalDisk
FriendlyName CanPool OperationalStatus HealthStatus Usage Size
------------ ------- ----------------- ------------ ----- ----
PhysicalDisk4 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk1 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk5 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk2 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk3 False OK Healthy Manual-Select 126.25 GB
On trouvera aussi d'autres commandes dans le même scope mais dont le but est de créer, modifier, supprimer. Elles sont bien documentées dans technet.
LA PANNE
Supposons maintenant qu’un des disques a eu un problème matériel et a été supprimé du SAN, par exemple. Le Server Manager devrait présenter une interface telle que:
On note que le Storage Pool OnePool est en état Degraded
PS C:\> Get-StoragePool -FriendlyName 'OnePool'
FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly
------------ ----------------- ------------ ------------ ----------
OnePool Degraded Warning False False
En détaillant les disques physiques du pool on retrouve un peu plus d’informations :
PS C:\> Get-StoragePool -FriendlyName 'OnePool' | Get-PhysicalDisk
FriendlyName CanPool OperationalStatus HealthStatus Usage Size
------------ ------- ----------------- ------------ ----- ----
PhysicalDisk-1 False Lost Communication Warning Manual-Select 126.25 GB
PhysicalDisk1 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk5 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk2 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk3 False OK Healthy Manual-Select 126.25 GB
On observe au passage que le disque désormais manquant a changé de FriendlyName : Il est passé de PhysicalDisk4 à PhysicalDisk-1.
De même tous les disques virtuels qui avaient des données sur ce disque physique passent en statut Incomplete, on peut le voir par l’interface graphique, et en commandes powershell.
PS C:\> Get-VirtualDisk -FriendlyName 'Mirror-1'
FriendlyName ResiliencySettingName OperationalStatus HealthStatus IsManualAttach Size
------------ --------------------- ----------------- ------------ -------------- ----
Mirror-1 Mirror Incomplete Warning False 100 GB
On peut également voir le disque physique en faute dans le disque virtuel par l’interface graphique (notre cas est trivial) en faisant un click-droit Properties sur le disque virtuel:
LA REPARATION
PREMIERE ETAPE : Passer le disque physique en mode Retired
Quand un disque physique est passé en mode Retired, il cesse de recevoir de nouvelles données, et les données ne seront écrites que sur les disques qui restent disponibles. C’est la première chose à faire avant de supprimer un disque, et cette opération se fait en Powershell.
Il y a plusieurs façons de sélectionner le disque : Par son FriendlyName, par son HealthStatut, etc. Dans notre cas, on va le faire par FriendlyName
PS C:\> Get-PhysicalDisk -FriendlyName 'PhysicalDisk-1' | Set-PhysicalDisk -Usage Retired
PS C:\>
Et on peut voir le statut modifié dans l’interface graphique
Et en Powershell
PS C:\> Get-PhysicalDisk -FriendlyName 'PhysicalDisk-1'
FriendlyName CanPool OperationalStatus HealthStatus Usage Size
------------ ------- ----------------- ------------ ----- ----
PhysicalDisk-1 False Lost Communication Warning Retired 126.25 GB
DEUXIEME ETAPE : Ajouter un disque de remplacement
Avant de faire une réparation il faut s’assurer qu’elle puisse être faite. Si les disques virtuels n’utilisaient pas toute la place, ça se ferait mais la plupart du temps, il n’y a plus de place disponible dans le Storage Pool : On ajoute donc un disque physique au storage pool en faisant un click droit sur le pool et Add Physical Disk… pour sélectionner un disque au préalable déjà disponible sur le serveur et initialisé en GPT.
TROISIEME ETAPE : La réparation ?
On pourrait légitimement penser qu’une réparation devrait être faisable à ce moment-là.
Allons-y par l’interface graphique. Click droit sur le disque virtuel Repair Virtual Disk
Il semble ne rien se passer, allons-y par Powershell
PS C:\> Get-VirtualDisk -FriendlyName 'Mirror-1' | Repair-VirtualDisk -AsJob
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
99 CimJob47 CimJob Running True WIN-CCQIEGC6GQS Repair-VirtualDisk -AsJob
PS C:\> get-job -Name 'CimJob47'
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
99 CimJob47 CimJob Failed True WIN-CCQIEGC6GQS Repair-VirtualDisk -AsJob
Le job est en erreur sans plus de détails. Il faut malheureusement activer le tracing de spaceport et s’appuyer sur de outils internes pour exploiter ce tracing, mais en substance on retrouvera cette séquence :
Enter SpIoctlRepairSpace
Info SpIoctlRepairSpace: Tagging space e7393ab7-5050-11e7-80c2-00155d011310 in pool e7393a8e-5050-11e7-80c2-00155d011310 for repair
Enter SpRepairPoolCallback
Info SpRepairPoolCallback: Repairing space e7393ab7-5050-11e7-80c2-00155d011310 in pool e7393a8e-5050-11e7-80c2-00155d011310
Exit SpRepairPoolCallback: Status = STATUS_SUCCESS
Error SpIoctlRepairSpace: Status = NTSTATUS=C0000461
Le code C0000461 signifie STATUS_DISK_RESOURCES_EXHAUSTED.
Ce tracing ne servira effectivement qu’aux gens du support (tracing et outils de traduction purement internes), mais il y a une autre façon de s’y retrouver en se rappelant que tout le storage pool est configuré comme Manual.
Resources Exhausted
“RESOURCES_EXHAUSTED” signifie qu’il n’y a pas de ressources suffisantes sur le disque pour faire la réparation. On parle bien ici d’un disque et non d’un pool, donc du disque virtuel. On ne parle pas du Storage Pool.
Souvenez-vous : Le disque virtuel est configuré pour utiliser 5 disques physiques et tous les disques physiques sont exploités au maximum. Par ailleurs, l’un des disques physiques est absent (l’anciennement PhysicalDisk4 renommé en PhysicalDisk-1). Il manque donc de la place dans le disque virtuel pour faire la réparation, car pour l’instant : On ne lui a pas dit qu’il pouvait utiliser le nouveau disque physique que nous venons d’ajouter (tout est en Manuel)
PS C:\> Get-VirtualDisk -FriendlyName 'Mirror-1' | Get-PhysicalDisk
FriendlyName CanPool OperationalStatus HealthStatus Usage Size
------------ ------- ----------------- ------------ ----- ----
PhysicalDisk-1 False Lost Communication Warning Retired 126.25 GB
PhysicalDisk1 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk5 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk2 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk3 False OK Healthy Manual-Select 126.25 GB
QUATRIEME ETAPE : Ajouter des ressources aux disques virtuels
Nous configurons les disques virtuels pour pouvoir utiliser le nouveau disque physique que nous venons d’ajouter.
Soit par l’interface graphique en faisant un click droit "Extend Virtual Disk" sur les disques virtuels et en ajoutant le nouveau disque sans changer la taille.
Soit par powershell en utilisant la commande Add-PhysicalDisk: Auquel cas on pourra faire une boucle ou lancer chaque commande indépendemment.
PS C:\> $PhysicalDiskToAdd = Get-PhysicalDisk -FriendlyName 'PhysicalDisk6'
PS C:\> Add-PhysicalDisk -PhysicalDisks $PhysicalDiskToAdd -VirtualDiskFriendlyName 'Mirror-1'
PS C:\> Add-PhysicalDisk -PhysicalDisks $PhysicalDiskToAdd -VirtualDiskFriendlyName 'Mirror-2'
PS C:\> Add-PhysicalDisk -PhysicalDisks $PhysicalDiskToAdd -VirtualDiskFriendlyName 'Mirror-3'
PS C:\>
Note: $PhysicalToAdd peut très bien être une collection de disques également.
Toujours est-il que nos disques virtuels ont désormais le droit d’utiliser le nouveau disque physique, car on peut maintenant voir le PhysicalDisk6 dans la liste des ressources disponibles au disque virtuel
PS C:\> Get-VirtualDisk -FriendlyName 'Mirror-1' | Get-PhysicalDisk
FriendlyName CanPool OperationalStatus HealthStatus Usage Size
------------ ------- ----------------- ------------ ----- ----
PhysicalDisk-1 False Lost Communication Warning Retired 126.25 GB
PhysicalDisk1 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk6 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk5 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk2 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk3 False OK Healthy Manual-Select 126.25 GB
CINQUIEME ETAPE : La réparation
On peut désormais soit faire un Repair dans l’interface graphique, soit le faire en commande powerhsell:
PS C:\> Get-VirtualDisk -HealthStatus Warning | Repair-VirtualDisk -AsJob
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
178 CimJob87 CimJob Running True WIN-CCQIEGC6GQS Repair-VirtualDisk -AsJob
PS C:\> Get-job CimJob87
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
178 CimJob87 CimJob Running True WIN-CCQIEGC6GQS Repair-VirtualDisk -AsJob
Et au bout d’un moment le job se termine correctement.
PS C:\> Get-job CimJob87
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
178 CimJob87 CimJob Completed True WIN-CCQIEGC6GQS Repair-VirtualDisk -AsJob
Les disques virtuels sont maintenant OK, mais le pool est toujours en Warning / Degraded.
SIXIEME ETAPE : Le nettoyage
On commence par supprimer le disque manquant de la liste des ressources disponibles de chaque disque virtuel car pour l’instant ils sont toujours configurés pour utiliser le disque manquant (rien n’est Automatic quand on est en Manual)
Ca doit se faire en PowerShell avec la commande Remove-PhysicalDisk
PS C:\> $PhysicalDiskToRemove = Get-PhysicalDisk -FriendlyName 'PhysicalDisk-1'
PS C:\> Remove-PhysicalDisk -PhysicalDisks $PhysicalDiskToRemove -VirtualDiskFriendlyName 'Mirror-1'
PS C:\> Remove-PhysicalDisk -PhysicalDisks $PhysicalDiskToRemove -VirtualDiskFriendlyName 'Mirror-2'
PS C:\> Remove-PhysicalDisk -PhysicalDisks $PhysicalDiskToRemove -VirtualDiskFriendlyName 'Mirror-3'
Même remarque que pour la commande Add-PhysicalDisk : On peut fournir une collection de disques, et il y a moyen de faire tout cela dans une boucle.
On peut voir que le disque physique manquant ne fait plus partie des ressources disponibles pour les disques virtuels
PS C:\> Get-VirtualDisk -FriendlyName 'Mirror-1' | Get-PhysicalDisk
FriendlyName CanPool OperationalStatus HealthStatus Usage Size
------------ ------- ----------------- ------------ ----- ----
PhysicalDisk1 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk6 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk5 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk2 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk3 False OK Healthy Manual-Select 126.25 GB
PS C:\> Get-VirtualDisk -FriendlyName 'Mirror-2' | Get-PhysicalDisk
FriendlyName CanPool OperationalStatus HealthStatus Usage Size
------------ ------- ----------------- ------------ ----- ----
PhysicalDisk1 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk6 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk5 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk2 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk3 False OK Healthy Manual-Select 126.25 GB
PS C:\> Get-VirtualDisk -FriendlyName 'Mirror-3' | Get-PhysicalDisk
FriendlyName CanPool OperationalStatus HealthStatus Usage Size
------------ ------- ----------------- ------------ ----- ----
PhysicalDisk1 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk6 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk5 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk2 False OK Healthy Manual-Select 126.25 GB
PhysicalDisk3 False OK Healthy Manual-Select 126.25 GB
On peut désormais supprimer le disque physique du pool
Soit par un clic droit "Remove Disk" sur le disque.
Soit par la commande Powershell Remove-PhysicalDisk
PS C:\> $PhysicalDiskToRemove = Get-PhysicalDisk -FriendlyName 'PhysicalDisk-1'
PS C:\> Remove-PhysicalDisk -PhysicalDisks $PhysicalDiskToRemove -StoragePoolFriendlyName 'OnePool'
PS C:\>
Et là, on est bien.
EN CONCLUSION
Un storage pool configuré en Manual nécessite de réaliser des opérations qui sont habituellement exécutées de façon transparente en Automatic
Les étapes à suivre sont les suivantes :
- Passer le disque manquant en mode Retired
- Ajouter un disque physique au pool
- Ajouter le nouveau disque physique aux ressources utilisables par les disques virtuels
- Lancer la réparation des disques virtuels
- Supprimer le disque physique des ressources utilisables par les disques virtuels
- Supprimer le disque physique du pool
Serge Gourraud
55 AA