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 :

  1. Passer le disque manquant en mode Retired
  2. Ajouter un disque physique au pool
  3. Ajouter le nouveau disque physique aux ressources utilisables par les disques virtuels
  4. Lancer la réparation des disques virtuels
  5. Supprimer le disque physique des ressources utilisables par les disques virtuels
  6. Supprimer le disque physique du pool

Serge Gourraud
55 AA