ADMIN

2022

06

2022-05-30T12:00:00

Storage und Backup

SCHWERPUNKT

078

Storage

PowerShell

Windows Server Storage mit der PowerShell verwalten

Roboter im Datenlager

von Evgenij Smirnov

Veröffentlicht in Ausgabe 06/2022 - SCHWERPUNKT

Zur Administration des Festplatteninventars eines Windows-Servers stehen zahlreiche Tools bereit. Werkzeuge wie fsutil oder chdsk leisten dabei für spezielle Aufgaben auch gute Dienste, greifen bei umfassender Automatisierung jedoch zu kurz. Zwar hat auch die PowerShell bei der Storage-Verwaltung ihre Grenzen, unterstützt den Administrator jedoch in Sachen Automatisierung.

Erfahrene Windows-Administratoren kennen zahlreiche Werkzeuge, die die Verwaltung von Festplatten, Partitionen und Dateisystemen ermöglichen. Die Palette reicht von der MMC-basierten "Datenträgerverwaltung" (diskmgmt.msc) über Kommandozeilen-Tools bis hin zum Server-Manager und Windows Admin Center. Für komplexere Storage-Systeme existieren weitere Tools wie iSCSICLI für die Konfiguration des eingebauten iSCSI-Initiators oder das grafische Konfigurations-Applet MPIO-CPL für das Storage-Multipathing.
Für einzelne Aufgaben sind diese Hilfsmittel bestens geeignet. Gilt es jedoch, viele Server zu konfigurieren oder komplexe Storage-Landschaften zu migrieren, stoßen die Tools schnell an ihre Grenzen: Die Syntax ist nicht einheitlich, Ausgaben hängen von der eingestellten Betriebssystemsprache ab und grafische Oberflächen erlauben gar keine Automatisierung. Genau in solchen Fällen richtet sich der Blick der Administratoren auf die PowerShell. Sie ist auch deswegen besonders wichtig, weil damit die visuelle Verwaltung lokaler Subsysteme einer Windows-Maschine mittels Windows Admin Center ermöglicht wird.
Dieser Workshop bezieht sich auf den aktuellen Server 2022, dürfte jedoch auch für Server 2019 und 2016 unverändert zutreffen. Dabei beschäftigen wir uns jedoch ausschließlich mit der Bereitstellung von Storage-Kapazitäten. Deren Präsentation an die Clients über SMB, DFS, NFS oder iSCSI verfügt über eine eigene, ausgereifte PowerShell-Unterstützung.
Erfahrene Windows-Administratoren kennen zahlreiche Werkzeuge, die die Verwaltung von Festplatten, Partitionen und Dateisystemen ermöglichen. Die Palette reicht von der MMC-basierten "Datenträgerverwaltung" (diskmgmt.msc) über Kommandozeilen-Tools bis hin zum Server-Manager und Windows Admin Center. Für komplexere Storage-Systeme existieren weitere Tools wie iSCSICLI für die Konfiguration des eingebauten iSCSI-Initiators oder das grafische Konfigurations-Applet MPIO-CPL für das Storage-Multipathing.
Für einzelne Aufgaben sind diese Hilfsmittel bestens geeignet. Gilt es jedoch, viele Server zu konfigurieren oder komplexe Storage-Landschaften zu migrieren, stoßen die Tools schnell an ihre Grenzen: Die Syntax ist nicht einheitlich, Ausgaben hängen von der eingestellten Betriebssystemsprache ab und grafische Oberflächen erlauben gar keine Automatisierung. Genau in solchen Fällen richtet sich der Blick der Administratoren auf die PowerShell. Sie ist auch deswegen besonders wichtig, weil damit die visuelle Verwaltung lokaler Subsysteme einer Windows-Maschine mittels Windows Admin Center ermöglicht wird.
Dieser Workshop bezieht sich auf den aktuellen Server 2022, dürfte jedoch auch für Server 2019 und 2016 unverändert zutreffen. Dabei beschäftigen wir uns jedoch ausschließlich mit der Bereitstellung von Storage-Kapazitäten. Deren Präsentation an die Clients über SMB, DFS, NFS oder iSCSI verfügt über eine eigene, ausgereifte PowerShell-Unterstützung.
Physische und logische Disks
Die klassischen Verwaltungsaufgaben im Hinblick auf die Festplatten, ihre Partitionierung und die Storage-Volumes darauf erledigt ein Administrator traditionell mit der MMC-Konsole "Datenträgerverwaltung" beziehungsweise mit dem Kommandozeilenwerkzeug "diskpart". Um einen ersten Überblick über die vorhandenen Festplatten zu erhalten, bietet sich in PowerShell der Get-Disk-Befehl an. Die zurückgegebenen Objekte entsprechen der Ansicht in der Datenträgerverwaltung, solange alle vorhandenen Festplatten vom Typ "Basic Disk" sind. Konvertieren Sie eine Festplatte in "Dynamic Disk", verschwindet sie aus dem Get-Disk-Inventar, bleibt jedoch in der Datenträgerverwaltung sichtbar.
Tatsächlich gibt es für Operationen, die Dynamic Disks erfordern (Windows-eigenes Software-RAID in verschiedenen Ausprägungen), keinerlei PowerShell-Unterstützung. Falls Sie Dynamic Disks skripten wollen, müssen Sie vermutlich auf diskpart zurückgreifen, denn weder PowerShell noch WMI bieten hier dokumentierte Programmierschnittstellen. Allerdings sind Dynamic Disks nicht mehr en vogue – für das gespiegelte Startvol-ume empfiehlt Microsoft explizit Storage Spaces [1]. Und auch für weitere fortgeschrittene Konfigurationen aus lokalen Festplatten eignen sich Storage Spaces deutlich besser. Für sie gibt es eine umfangreiche PowerShell-Unterstützung, auf die wir später eingehen.
Um eine "frische" Festplatte für den Betrieb zu initialisieren, verwenden Sie
Get-Disk -Number <Disk-Nummer> | Set-Disk -IsOffline $false
 
Initialize-Disk -Number <Disk-Nummer> -PartitionStyle GPT
Für die gleiche Initialisierungsart für alle nicht initialisierten Festplatten nutzen Sie:
Get-Disk |
Where-Object {$_.IsOffline -and ($_.PartitionStyle -eq 'RAW')} | Initialize-Disk -PartitionStyle GPT
Um die Disk-Objekte nach der Initialisierung weiterzuverarbeiten, müssen Sie das Initialize-Disk-Cmdlet zusätzlich noch mit dem Schalter "-PassThru" versehen.
Eine aktive Festplatte wieder offline zu setzen, gelingt mit
Get-Disk -Number <Disk-Nummer> | Set-Disk -IsOffline $true
Geht es Ihnen nicht um logisch verfügbare, sondern um physisch an den Computer angeschlossene Festplattenlaufwerke, stoßen alle bisher erwähnten Tools schnell an ihre Grenzen: Das Get-Disk-Cmdlet zeigt keine dynamischen Datenträger an, und keines der drei Tools liefert Festplatten zurück, die einem Storage-Spaces-Pool hinzugefügt wurden. Mit herkömmlichen Windows-Bordmitteln sehen Sie die angeschlossenen Datenträger im "Geräte-Manager" (devmgmt.msc). Dort haben Sie auch Zugriff auf Multipath-I/O-Informationen des jeweiligen Datenträgers, sofern mehrere Pfade zu ihm führen.
Mit der PowerShell erreichen Sie diese Funktionalität mit dem Get-PhysicalDisk-Befehl, der Ihnen allerdings keine Informationen über das Multipathing anzeigt. Und auch die physischen Anschlussinformationen wie Adapter, Target- und LUN-Nummer erhalten Sie nur in einem String innerhalb der Eigenschaft "PhysicalLocation" – leider ausschließlich für lokale Laufwerke und nicht für solche, die aus einem Storage-System per iSCSI oder FC bereitgestellt wurden. Diskpart zeigt Ihnen mit DETAIL DISK diese Informationen an – solange die Festplatten nicht Teil eines Storage-Spaces-Pools sind. Unter den gleichen Voraussetzungen erhalten Sie diese Informationen in PowerShell mittels WMI:
Get-CIMInstance Win32_DiskDrive | Select Index, Model, SCSI*
Der "Index" entspricht dabei der Disk-Nummer in Get-Disk.
Ändert sich die Storage-Konfiguration außerhalb Ihrer PowerShell-Sitzung, bekommen die PowerShell-Cmdlets dies nicht immer gleich mit. Das Phänomen kennen Sie sicher auch aus der Datenträgerverwaltung, wo Sie in diesem Fall zum Menüpunkt "Aktion – Datenträger neu einlesen" greifen. In PowerShell lautet der äquivalente Befehl Update-HostStorageCache.
Bild 1: Verschiedene Werkzeuge erlauben Zugriff auf unterschiedliche Disk-Typen.
Partitionen und Volumes verwalten
Die Verwaltung von Partitionen und Dateisystem-Volumes auf diesen unterliegt derselben Einschränkung wie die Verwaltung der Festplatten: Dynamische Datenträger sind für die PowerShell unsichtbar. Dafür können Sie mit dem Get-Partition-Cmdlet ohne weitere Parameter alle Partitionen auf allen sichtbaren Disks (das heißt Basisdatenträger und Storage-Spaces-VirtualDisks) auf einmal auflisten, ohne sich vorher auf eine bestimmte Disk festlegen zu müssen. Noch erfreulicher gestaltet sich die Verwaltung von Volumes – hier sind alle unabhängig von der darunterliegenden Storage-Technologie sichtbar und verwaltbar. Sie können sie mit Get-Volume auflisten, mit Repair-Volume reparieren oder mit Optimize-Volume analysieren und defragmentieren. Und mit dem Format-Volume-Befehl formatieren Sie das Volume neu. Dabei ist "Quick Format" die Standard-Einstellung. Um eine vollständige Formatierung zu erzwingen, verwenden Sie den Schalter "-Full". Um ein neues Volume anzulegen, können Sie entweder eine ganze Disk verwenden:
Get-Disk -Number <Nummer> |
 
New-Volume -FileSystem NTFS -DriveLetter Z -FriendlyName  <DiskLabel>
oder zuerst mit
Get-Disk -Number <Nummer> |
 
New-Partition -Size <Größe in Bytes> -Offest <Offset in Bytes>
gewünschte Partitionen anlegen und anschließend mit
$part = Get-Partition -DiskNumber <Nummer> -PartitionNumber <Nummer>
$part | Set-Partition -NewDriveLetter <Buchstabe>
 
Format-Volume -Partition $part -FileSystem NTFS
das Dateisystem-Volume erzeugen und formatieren. Am letzten Beispiel können Sie den Zusammenhang zwischen Volume und Partition in Windows besonders deutlich erkennen: Die Partition bestimmt die physische Lage des Objekts im Disk-Subsystem und dessen Bereitstellung, während das Volume für das Dateisystem darauf zuständig ist.
iSCSI-LUNs mit Multipath einbinden
Bereits seit Windows 2000 Server beinhaltet das Microsoft-Betriebssystem einen eigenen iSCSI-Initiator. Damit binden Sie Storage-LUNs mit Bordmitteln in Ihre Windows-Instanzen ein, sofern sie vom Storage über das iSCSI-Protokoll bereitgestellt wurden. Ein weiteres wertvolles Feature, das nicht nur für iSCSI, sondern für alle blockbasierten Storage-Protokolle wie SAS, Fibre Channel oder FCoE zur Verfügung steht, ist Multipath-I/O oder MPIO. Damit verwaltet der Initiator mehrere Verbindungen zum gleichen Storage-Ziel gemäß der festgelegten Richtlinie.
Bei einem frisch installierten Windows-System ist der iSCSI-Initiator-Dienst ("MSiSCSI") standardmäßig deaktiviert. Bevor Sie den Initiator konfigurieren, müssen Sie den Dienst also für den automatischen Start konfigurieren und starten. Dies gelingt mit zwei PowerShell-Befehlen:
Set-Service MSiSCSI -StartupType Automatic
 
Start-Service MSiSCSI
Danach können Sie den iSCSI-Initiator auf Ihrem Windows-Server konfigurieren. Eine der wichtigsten globalen Einstellungen ist der IQN-Name des Initiators. Um diesen anzupassen, verwenden Sie:
Set-InitiatorPort -NodeAddress <IQN> -NewNodeAdress <Neuer IQN>
Den alten Initiator-Namen können Sie mit
Get-InitiatorPort -ConnectionType iSCSI
herausfinden. Eine Änderung des Initiator-Namens ist oft der Namenskonvention des Storage-Teams geschuldet. Es kann dafür aber auch zwingende technische Gründe geben. Der standardmäßig vergebene IQN eines Windows-Computers ist ein 26-stelliges Präfix, gefolgt vom Computernamen. Es gibt jedoch ältere Storage-Systeme, die den IQN intern auf 32 Stellen beschränken und damit nur die ersten sechs Stellen des Computernamens auswerten. Heißen zum Beispiel Ihre Cluster-Knoten "SERVER01", "SERVER02" und so weiter, wird solch ein Storage sie alle nur als "SERVER" wahrnehmen und die LUN-Reservierungen innerhalb des Clusters scheitern.
Ein Tipp: Manchmal dauert der Aufbau von iSCSI-Verbindungen beim Booten des Servers zu lange und Freigaben, die auf iSCSI-LUNs liegen, werden nicht bereitgestellt. In diesem Fall müssen Sie den "Server-Dienst" (LanManServer) vom iSCSI-Initiator-Dienst (MSiSCSI) abhängig machen. Dies ist mit PowerShell-Bordmitteln nicht möglich, Sie müssen vielmehr zum bewährten sc config depend greifen. Achten Sie darauf, dass Sie den iSCSI-Dienst hinzufügen und nicht als einzige Abhängigkeit setzen.
Ist Multipathing mit Ihrem jetzigen oder zukünftigen Storage-System eine Option, sollten Sie das MPIO-Feature am besten gleich konfigurieren. Bei Server-Clustern ist es sogar Vorschrift, dass Sie MPIO zumindest aktivieren, bevor Sie das Cluster bilden. Das MPIO-Feature hat eine eingebaute Unterstützung für den bordeigenen iSCSI-Initiator. Diese ist jedoch standardmäßig deaktiviert. Die Aktivierung dieser Unterstützung erfordert einen Neustart, daher sollten Sie diesen Konfigurationsschritt möglichst frühzeitig vornehmen:
Add-WindowsFeature Multipath-IO
 
$vid = 'MSFT2005'
 
$pid = ' iSCSIBusType_0x9'
 
New-MSDSMSupportedHW -VendorId $vid -ProductId $pid
 
Set-MSDSMGlobalDefaultLoadBalance-Policy -Policy RR
 
Restart-Computer -Force
Der letzte Konfigurationsbefehl setzt die Pfadauswahl-Richtlinie standardmäßig auf "Round Robin" – jede nachfolgende Anfrage nimmt den nächsten aktiven Pfad unabhängig von der Auslastung. Weitere valide Werte für die MPIO-Policy sind "FOO" für "FailOver Only", "None" für "Kein Multipathing", "LB" für "Least Blocks" und "LQD" für "Least Queue Depth". Lesen Sie unbedingt die Integrationsanleitung des Storage-Herstellers, bevor Sie sich für eine MPIO-Richtlinie entscheiden, denn nicht jeder iSCSI-Storage unterstützt jede Richtlinie gleichermaßen gut. In den meisten Fällen haben Sie nur die Wahl zwischen "Round Robin" und "FailOver Only". Mit den Befehlen Get-MPIOSetting und Set-MPIOSetting nehmen Sie einige weitere globale MPIO-Einstellungen auf dem System vor.
Ist der iSCSI-Initiator aktiviert und MPIO konfiguriert, können Sie Ihren iSCSI-Storage an das System anbinden und anschließend die an Ihren Initiator präsentierten LUNs einlesen. Der Kürze wegen verzichten wir hier auf die Authentifizierung gegenüber dem Target-Storage. Die hierfür notwendigen Parameter liefert [2]. Die Anbindung eines iSCSI-Ziels auf zwei Pfaden führen Sie mittels PowerShell wie folgt durch. Achten Sie dabei darauf, dass die IP-Adressen aus den einzelnen Storage-Subnetzen in den Arrays für Initiator- und Target-Adressen in der gleichen Reihenfolge vorkommen:
$iniAddr = @(
           '10.0.104.11'
           '10.0.105.11'
)
$tgtAddr = @(
           '10.0.104.21'
           '10.0.105.21'
)
(0..($iniAddr.Length - 1)) | For-Each-Object {
      New-IscsiTargetPortal `
      -TargetPortalAddress $tgtAddr[$_] `
      -TargetPortalPortNumber 3260 `
      -InitiatorPortalAddress $iniAddr[$_]
}
$targets = Get-IscsiTarget
(0..($iniAddr.Length - 1)) | For-Each-Object {
      $targets | Connect-IscsiTarget `
           -IsMultipathEnabled $true `
           -IsPersistent $true `
           -TargetPortalAddress $tgtAddr[$_] `
           -InitiatorPortalAddress $iniAddr[$_]
}
Anschließend lesen Sie mit Update-Host-StorageCache die neu angebundenen iSCSI-Targets in die Datenträgerverwaltung ein, und Sie finden, sofern der Storage LUNs an diesen Initiator präsentiert hat, neue Disks in Ihrem Storage-Inventar vor.
Für die weitere Verwaltung der MPIO-Einstellungen der einzelnen Geräte und Pfade bieten die mitgelieferten PowerShell-Module von Windows keine Befehle. Auch die WMI-Unterstützung in diesem Bereich ist dürftig und erlaubt lediglich den lesenden Zugriff auf die MPIO-Konfiguration der einzelnen Devices, nicht jedoch die Änderung dieser Konfiguration. Hier können Sie entweder auf das CLI-Tool "mpclaim.exe" mit seiner etwas kryptischen Syntax zurückgreifen oder die Einstellungen manuell in der GUI des Geräte-Managers vornehmen.
Storage Spaces via PowerShell
Im Vergleich zu den klassischen Basic und Dynamic Disks ist Storage Spaces eine relativ neue Technologie. Ihr Stammbaum geht auf den Windows Home Server zurück. Dieser diente Microsoft als Designstudie dafür, wie sich aus preiswerten SATA-Platten fehlertolerante und performante Storage-Volumes bereitstellen lassen, ohne auf schwer verwaltbare und fehleranfällige Dynamic Disks zurückgreifen zu müssen.
Das Produkt "Storage Spaces" wurde mit Server 2012 R2 vorgestellt. Für die grafische Verwaltung war von vornherein der neue Server-Manager vorgesehen, was unter der Haube bedeutet, dass eine vollständige PowerShell-Unterstützung zur Verfügung stehen muss. Diese ist im mitgelieferten Modul "Storage" enthalten, aus dem auch die bereits erwähnten Get-Disk- oder Set-InitiatorPort-Befehle stammen. Das Modul wurde von 103 Befehlen in Server 2012 auf 160 Befehle in Server 2022 erweitert, ohne dass sich dabei die Versionsnummer des Moduls geändert hat.
Möchten Sie einen neuen Storage-Pool auf Ihrem Windows-System erstellen, beginnen Sie mit dem bereits bekannten Cmdlet, allerdings mit dem folgenden Zusatzparameter:
Get-PhysicalDisk -CanPool $true
Sehen Sie nicht alle Festplatten aufgelistet, die Sie erwartet haben, können Sie mit
Get-PhysicalDisk -CanPool $false | ft DeviceId, CannotPoolReason
ausgeben, was das Hinzufügen bestimmter Disks zu einem Pool verhindert. Haben Sie die Probleme beseitigt, legen Sie den neuen Pool an:
$sub = Get-StorageSubSystem -FriendlyName "Windows Storage*"
 
$disks = Get-PhysicalDisk -CanPool $true
 
$pool = New-StoragePool
      -FriendlyName '<Name>' `
      -PhysicalDisks $disks `
      -StorageSubSystemUniqueId $sub.UniqueId
In diesem Pool erzeugen Sie nun mit
$pool | New-VirtualDisk
      -FirendlyName <Name> -Size <Größe> `
      -ProvisioningType Thin `
      -ResiliencySettingName Mirror `
      -NumberOfDataCopies 2
eine virtuelle Festplatte, die "thin" provisioniert ist und eine RAID1-ähnliche Schutzstufe (zwei Kopien von jedem Block) aufweist. Anders als beim schrittweisen Assistenten im Server-Manager wird die Verfügbarkeit der notwendigen Anzahl und Größe an Festplatten erst überprüft, wenn Sie den Befehl absenden. Es kann also passieren, dass das Anlegen des Laufwerks fehlschlägt. Das an der PowerShell-Pipeline erzeugte Objekt ist eine "Disk". Diese können Sie, wie am Anfang des Artikels beschrieben, an "Initialize-Disk" und weiter an "New-Partition" und "Format-Volume" pipen, um eine fertig formatierte Festplatte zu erhalten.
Wie bei allen komplexeren Storage-Systemen ist es auch bei Storage Spaces wichtig, den Status der Laufwerke zu überwachen und frühzeitig Reparaturen einzuleiten. Dafür haben alle Objekte, die die Get-StoragePool-, Get-VirtualDisk-, Get-PhysicalDisk- oder Get-Vol-ume-Cmdlets zurückliefern, die Eigenschaft "HealthStatus". Steht dort einmal nicht "Healthy", müssen Sie den Status der einzelnen Komponenten untersuchen und eventuelle Fehler beheben. Manchmal schleichen sich dabei jedoch logische Fehler ein. Storage Spaces kann sie in der Regel selbst beheben, sofern die gewählte Redundanz dafür ausreicht. Das können Sie für alle Virtual Disks mit einem PowerShell-Befehl initiieren:
Get-VirtualDisk |
 
Where-Object {$_.HealthStatus -Eq "Unhealthy"} |
 
Repair-VirtualDisk
Auch das Repair-VirtualDisk-Cmdlet akzeptiert den Schalter "-PassThru", mit dem Sie das Ergebnis der Reparatur an die Pipe ausgeben können. War die Reparatur einmal nicht erfolgreich, müssen Sie weiter forschen.
Storage Spaces bieten eine Vielzahl weiterer Funktionen wie Tiered Storage, Enclosure-Verwaltung und vieles mehr. All diese Funktionen sind durch entsprechende spezialisierte PowerShell-Cmdlets und zusätzliche Parameter in den allgemeineren Befehlen vollumfänglich abgebildet, denn für Storage Spaces gibt es keine andere Verwaltungsschnittstelle als die PowerShell – sowohl der Server-Manager als auch das Windows Admin Center greifen für die graphische Verwaltung auf die PowerShell zurück.
Fazit
Microsoft liefert PowerShell-Module [3], die eine Automatisierung Ihrer Storage-Bereitstellung und -Verwaltung ermöglichen. Um daraus den maximalen Nutzen zu ziehen, müssen Sie sich mit dem Windows-Storage-Subsystem beschäftigen, vor allem mit verschiedenen Betriebsarten und Adressierungsmöglichkeiten der dortigen Laufwerke. Operationen mit den herkömmlichen Dynamic Disks sind mittels PowerShell oder WMI allerdings nicht mehr vorgesehen. Bei neueren Systemen sollten Sie ohnehin Storage Spaces den Vorzug geben, wofür eine vollständige PowerShell-Unterstützung vorhanden ist.
(jp)
Link-Codes