Guida completa al monitoraggio dello spazio su disco condiviso su Hyper-V con PowerShell

Una gestione efficace dello spazio su disco è un aspetto fondamentale per mantenere un’infrastruttura IT efficiente e affidabile. Uno strumento potente nell’arsenale dei professionisti IT è PowerShell, un framework di automazione delle attività di Microsoft. Oggi analizzeremo uno script PowerShell progettato per il monitoraggio dello spazio su disco, in volumi condivisi in un ambiente cluster Hyper-V. Questo script è particolarmente utile per i professionisti IT e i fornitori di servizi gestiti (MSP) che devono garantire il funzionamento regolare dei loro sistemi ed evitare tempi di inattività dovuti a problemi di archiviazione.

Background

Il monitoraggio dello spazio su disco è fondamentale per evitare interruzioni impreviste e garantire che le applicazioni e i servizi funzionino senza interruzioni. I volumi condivisi in un cluster Hyper-V possono ospitare numerose virtual machine e l’esaurimento dello spazio può avere gravi conseguenze. Questo script PowerShell semplifica il processo di monitoraggio, consentendo agli amministratori di tenere sotto controllo lo spazio libero e di intervenire prima che si verifichino problemi.

Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V:

Requires -Version 5.1

<#
.SYNOPSIS
    Hyper-V Monitor shared volume disk free space. Must be ran as a Local or Domain Admin user.
.DESCRIPTION
    Hyper-V Monitor shared volume disk free space. Must be ran as a Local or Domain Admin user.

.EXAMPLE
    (No Parameters)
    ## EXAMPLE OUTPUT WITHOUT PARAMS ##
Name                       Path                  Size(GB) FreeSpace(GB) UsedSpace(GB) PercentFree
----                       ----                  -------- ------------- ------------- -----------
Cluster Virtual Disk (vd1) C:\ClusterStorage\vd1 3,068.98 168.77        2900.21       9.99

PARAMETER: -MinimumPercentage 20
    Only errors when any shared volume disk is below the specified percentage.
    Defaults to 10 percent.
.EXAMPLE
    -MinimumPercentage 20
    ## EXAMPLE OUTPUT WITH MinimumPercentage ##
Name                       Path                  Size(GB) FreeSpace(GB) UsedSpace(GB) PercentFree
----                       ----                  -------- ------------- ------------- -----------
Cluster Virtual Disk (vd1) C:\ClusterStorage\vd1 3,068.98 168.77        2900.21       9.99

PARAMETER: -MinimumFreeBytes 1073741824
    Only errors when any shared volume disk is below the specified percentage.
    Defaults to 1GB or 1073741824 bytes.
.EXAMPLE
    -MinimumFreeBytes 1073741824
    ## EXAMPLE OUTPUT WITH MinimumFreeBytes ##
Name                       Path                  Size(GB) FreeSpace(GB) UsedSpace(GB) PercentFree
----                       ----                  -------- ------------- ------------- -----------
Cluster Virtual Disk (vd1) C:\ClusterStorage\vd1 3,068.98 168.77        2900.21       9.99

PARAMETER: -ExcludeDrivesByName MyDisk
    Excludes drives that contains the text MyDisk in its name.
.EXAMPLE
    -ExcludeDrivesByName 1073741824
    ## EXAMPLE OUTPUT WITH ExcludeDrivesByName ##
Name                       Path                  Size(GB) FreeSpace(GB) UsedSpace(GB) PercentFree
----                       ----                  -------- ------------- ------------- -----------
Cluster Virtual Disk (vd1) C:\ClusterStorage\vd1 3,068.98 168.77        2900.21       9.99

PARAMETER: -ExcludeDrivesByPath C:\ClusterStorage\MyDisk
    Excludes drives that contains the text MyDisk in its name.
.EXAMPLE
    -ExcludeDrivesByPath C:\ClusterStorage\MyDisk
.EXAMPLE
    -ExcludeDrivesByPath MyDisk
    ## EXAMPLE OUTPUT WITH ExcludeDrivesByPath ##
Name                       Path                  Size(GB) FreeSpace(GB) UsedSpace(GB) PercentFree
----                       ----                  -------- ------------- ------------- -----------
Cluster Virtual Disk (vd1) C:\ClusterStorage\vd1 3,068.98 168.77        2900.21       9.99

PARAMETER: -CustomFieldParam "ReplaceMeWithAnyMultilineCustomField"
    Saves the results to a multi-line string custom field.
.EXAMPLE
    -CustomFieldParam "ReplaceMeWithAnyMultilineCustomField"
    ## EXAMPLE OUTPUT WITH CustomFieldParam ##
Name                       Path                  Size(GB) FreeSpace(GB) UsedSpace(GB) PercentFree
----                       ----                  -------- ------------- ------------- -----------
Cluster Virtual Disk (vd1) C:\ClusterStorage\vd1 3,068.98 168.77        2900.21       9.99
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows Server 2016
    Release Notes: Initial Release
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#>

[CmdletBinding()]
param (
    [int]$MinimumPercentage = 10,
    $MinimumFreeBytes = 1GB,
    [String]$ExcludeDrivesByName,
    [String]$ExcludeDrivesByPath,
    [string]$CustomFieldParam
)

begin {
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
    }
    function Test-IsSystem {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        return $id.Name -like "NT AUTHORITY*" -or $id.IsSystem
    }
    function Get-FriendlySize {
        param($Bytes)
        # Converts Bytes to the highest matching unit
        $Sizes = 'Bytes,KB,MB,GB,TB,PB,EB,ZB' -split ','
        for ($i = 0; ($Bytes -ge 1kb) -and ($i -lt $Sizes.Count); $i++) { $Bytes /= 1kb }
        $N = 2
        if ($i -eq 0) { $N = 0 }
        if ($Bytes) { "$([System.Math]::Round($Bytes,$N)) $($Sizes[$i])" }else { "0 B" }
    }
    function Get-Size {
        param (
            [string]$String,
            [ValidateSet("PB", "TB", "GB", "MB", "KB", "B", "Bytes")][string]$DefaultSize = "GB"
        )
        switch -wildcard ($String) {
            '*PB' { [int64]$($String -replace '[^\d+]+') * 1PB; break }
            '*TB' { [int64]$($String -replace '[^\d+]+') * 1TB; break }
            '*GB' { [int64]$($String -replace '[^\d+]+') * 1GB; break }
            '*MB' { [int64]$($String -replace '[^\d+]+') * 1MB; break }
            '*KB' { [int64]$($String -replace '[^\d+]+') * 1KB; break }
            '*B' { [int64]$($String -replace '[^\d+]+') * 1; break }
            '*Bytes' { [int64]$($String -replace '[^\d+]+') * 1; break }
            Default { Get-Size -String "$String $DefaultSize" }
        }
    }
    function Invoke-FilterDisks {
        [CmdletBinding()]
        param(
            [parameter(ValueFromPipeline = $true)]
            $Disks
        )
        process {
            $Disks | ForEach-Object {
                # Check if exclude by name is needed
                if ($([string]::IsNullOrEmpty($ExcludeDrivesByName) -or [string]::IsNullOrWhiteSpace($ExcludeDrivesByName))) {
                    $_
                }
                else {
                    if (
                        $_.Name -like "*$ExcludeDrivesByName*"
                    ) {
                        # Output Nothing
                    }
                    else {
                        $_
                    }
                }
            } | ForEach-Object {
                # Check if exclude by name is needed
                if ($([string]::IsNullOrEmpty($ExcludeDrivesByPath) -or [string]::IsNullOrWhiteSpace($ExcludeDrivesByPath))) {
                    $_
                }
                else {
                    if (
                        $_.Path -like "*$ExcludeDrivesByPath*"
                    ) {
                        # Output Nothing
                    }
                    else {
                        $_
                    }
                }
            }
        }
    }
    if ($env:MinimumPercentage) {
        $MinimumPercentage = $env:MinimumPercentage
    }
    if ($env:minimumFreeSpace) {
        $MinimumFreeBytes = Get-Size -String $env:minimumFreeSpace
    }
    if ($env:ExcludeDrivesByName) {
        $ExcludeDrivesByName = $env:ExcludeDrivesByName
    }
    if ($env:ExcludeDrivesByPath) {
        $ExcludeDrivesByPath = $env:ExcludeDrivesByPath
    }
    if ($env:CustomFieldParam) {
        $CustomFieldParam = $env:CustomFieldParam
    }
}
process {
    if (Test-IsSystem) {
        Write-Error -Message "Access Denied. Please run with a Domain Account or a Local Account that has permissions to access this node."
        exit 1
    }

    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }

    Import-Module FailoverClusters -ErrorAction SilentlyContinue

    if (-not $(Get-Command -Name "Get-Cluster" -ErrorAction SilentlyContinue)) {
        Write-Error "[Error] Must run this script on a server that is apart of a Cluster or can communicate with a Cluster."
        exit 1
    }

    try {
        Get-ClusterNode -ErrorAction Stop | Out-Null
    }
    catch {
        Write-Error "[Error] Failed to get Cluster Nodes."
        exit 1
    }

    # Get Cluster Shared Volume Info
    $Volumes = foreach ( $csv in $(Get-ClusterSharedVolume) ) {
        foreach ( $csvinfo in $($csv | Select-Object -Property Name -ExpandProperty SharedVolumeInfo) ) {
            [PSCustomObject]@{
                Name        = $csv.Name
                Path        = $csvinfo.FriendlyVolumeName
                Size        = $csvinfo.Partition.Size
                FreeSpace   = $csvinfo.Partition.FreeSpace
                UsedSpace   = $csvinfo.Partition.UsedSpace
                PercentFree = $csvinfo.Partition.PercentFree
            }
        }
    }

    # Prep Format-Table substitutions
    $Size = @{ Label = "Size(GB)" ; Expression = { (Get-FriendlySize -Bytes $_.Size) } }
    $FreeSpace = @{ Label = "FreeSpace(GB)" ; Expression = { (Get-FriendlySize -Bytes $_.FreeSpace) } }
    $UsedSpace = @{ Label = "UsedSpace(GB)" ; Expression = { (Get-FriendlySize -Bytes $_.UsedSpace) } }
    $PercentFree = @{ Label = "PercentFree" ; Expression = { ($_.PercentFree) } }
    # Sort disks by FreeSpace
    $Disks = $Volumes | Sort-Object FreeSpace
    # Save results as a string
    $DisksFormattedString = $Disks | Format-Table -AutoSize Name, Path, $Size, $FreeSpace, $UsedSpace, $PercentFree | Out-String

    # If using a custom field sent that to the specified custom field, should be a multi-line
    if ($CustomFieldParam) {
        Ninja-Property-Set -Name $CustomFieldParam -Value $DisksFormattedString
    }

    # Loop through each disk
    $DiskUnderPercentage = $Disks | Invoke-FilterDisks | Where-Object { $_.PercentFree -lt $MinimumPercentage }
    $DiskUnderFreeBytes = $Disks | Invoke-FilterDisks | Where-Object { $_.FreeSpace -lt $MinimumFreeBytes }

    if ($DiskUnderPercentage -or $DiskUnderFreeBytes) {
        if ($DiskUnderPercentage) {
            Write-Host "[Issue] One or more Disks under $MinimumPercentage % free!"
        }
        if ($DiskUnderFreeBytes) {
            Write-Host "[Issue] One or more Disks under $(Get-FriendlySize -Bytes $MinimumFreeBytes) free!"
        }
        $DisksFormattedString | Write-Host
        exit 1
    }

    # List all shared volumes
    if (-not $DiskUnderPercentage) {
        Write-Host "[Info] One or more Disks over $MinimumPercentage % free."
    }
    if (-not $DiskUnderFreeBytes) {
        Write-Host "[Info] One or more Disks over $(Get-FriendlySize -Bytes $MinimumFreeBytes) free."
    }
    $DisksFormattedString | Write-Host
    exit 0
}
end {
    
    
    
}

 

Analisi dettagliata

Analizziamo lo script passo per passo per capire le sue funzionalità e come può essere utilizzato in modo efficace per il monitoraggio dello spazio su disco in ambiente Hyper-V.

1. Prerequisiti e configurazione iniziale Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V richiede PowerShell versione 5.1 e deve essere eseguito con privilegi amministrativi. Si inizia con la definizione di vari parametri come MinimumPercentage, MinimumFreeBytes, ExcludeDrivesByName, ExcludeDrivesByPath e CustomFieldParam.

2. Funzioni per il controllo dei privilegi e il calcolo delle dimensioni

  • Test-IsElevated controlla se lo script è in esecuzione con privilegi di amministratore.
  • Test-IsSystem assicura che lo script non venga eseguito come account di sistema.
  • Get-FriendlySize e Get-Size convertono i valori dei byte in unità più leggibili come KB, MB, GB, ecc.

3. Filtraggio e variabili d’ambiente Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V imposta le funzioni per filtrare le unità in base ai nomi o ai percorsi specificati. Controlla anche la presenza di variabili d’ambiente che potrebbero sovrascrivere i parametri dello script.

4. Recupero delle informazioni su cluster e volumi Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V importa il modulo FailoverClusters e verifica che sia in esecuzione su un server che fa parte di un cluster. Quindi recupera le informazioni sui volumi condivisi nel cluster, come le dimensioni, lo spazio libero, lo spazio utilizzato e la percentuale di spazio libero.

5. Formattazione e output Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V formatta le informazioni sul disco per renderle leggibili e controlla se i volumi sono al di sotto delle soglie di spazio libero specificate. Se vengono rilevati dei problemi, vengono forniti i dettagli e lo script esce con uno stato di errore. Altrimenti, conferma che tutti i volumi hanno spazio libero sufficiente.

Casi d’uso potenziali

Immagina un amministratore IT responsabile di un cluster Hyper-V che ospita virtual machine critiche. L’amministratore può utilizzare lo script per automatizzare il monitoraggio dello spazio su disco, assicurandosi di essere avvisato prima che i volumi abbiano troppo poco spazio disponibile. Questo approccio proattivo consente di allocare spazio di archiviazione aggiuntivo o di eliminare i file non necessari, evitando potenziali interruzioni e mantenendo le prestazioni del sistema.

Confronti

Rispetto al monitoraggio manuale o all’utilizzo di strumenti integrati di base, questo script per il monitoraggio dello spazio su disco in ambiente Hyper-V offre un approccio più automatizzato e dettagliato. Non solo controlla lo spazio libero, ma consente anche la personalizzazione in base ai nomi dei volumi, ai percorsi e ai requisiti specifici di spazio libero. Altri metodi, come gli strumenti di monitoraggio di terze parti, possono offrire funzionalità simili, ma spesso hanno costi più elevati e richiedono una configurazione aggiuntiva.

Domande frequenti

D: Questo script per il monitoraggio dello spazio su disco in ambiente Hyper-V può essere eseguito su qualsiasi versione di Windows Server?

R: Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V supporta Windows Server 2016 e versioni successive a causa dei requisiti del modulo FailoverClusters.

D: Quali permessi sono necessari per eseguire questo script per il monitoraggio dello spazio su disco in ambiente Hyper-V?

R: Lo script per il monitoraggio dello spazio su disco in ambiente Hyper-V deve essere eseguito con privilegi di amministratore locale o di dominio per accedere alle informazioni necessarie sul cluster.

D: Come posso escludere volumi specifici dal monitoraggio?

R: Puoi utilizzare i parametri ExcludeDrivesByName o ExcludeDrivesByPath per filtrare volumi specifici in base ai loro nomi o percorsi.

Implicazioni

I risultati di questo script per il monitoraggio dello spazio su disco in ambiente Hyper-V possono avere un impatto significativo sulle operazioni IT. Identificando i volumi con spazio libero insufficiente, gli amministratori possono adottare misure preventive per evitare interruzioni del servizio. Questo monitoraggio proattivo migliora anche l’affidabilità e le prestazioni complessive del sistema, contribuendo a rendere più stabile l’ambiente IT.

Raccomandazioni

Quando utilizzi questo script per il monitoraggio dello spazio su disco in ambiente Hyper-V, tieni in considerazione le seguenti best practice:

  • Pianifica l’esecuzione dello script per il monitoraggio dello spazio su disco in ambiente Hyper-V a intervalli regolari utilizzando Task Scheduler o strumenti simili.
  • Personalizza i parametri in base alle esigenze specifiche del tuo ambiente.
  • Assicurati di disporre di autorizzazioni sufficienti e di eseguire lo script sui server appropriati.

Considerazioni finali

Gli script PowerShell come questo per il monitoraggio dello spazio su disco in ambiente Hyper-V sono strumenti preziosi per i professionisti IT e gli MSP, in quanto offrono potenti funzionalità di automazione per gestire e monitorare i sistemi critici. Incorporando tali script nei loro flussi di lavoro, gli amministratori possono mantenere un migliore controllo sulla loro infrastruttura, garantire prestazioni ottimali e prevenire potenziali problemi prima che si aggravino.

NinjaOne, software leader per le operazioni IT, può migliorare ulteriormente questo processo integrando l’esecuzione degli script con le sue funzionalità di monitoraggio e gestione, fornendo una soluzione completa per la gestione dell’infrastruttura IT.

Passi successivi

La creazione di un team IT efficiente ed efficace richiede una soluzione centralizzata che funga da principale strumento per la fornitura di servizi. NinjaOne consente ai team IT di monitorare, gestire, proteggere e supportare tutti i dispositivi, ovunque essi si trovino, senza la necessità di una complessa infrastruttura locale.

Per saperne di più su NinjaOne Endpoint Management, fai un tour dal vivo, o inizia la tua prova gratuita della piattaforma NinjaOne.

Categorie:

Ti potrebbe interessare anche

×

Guarda NinjaOne in azione!

Inviando questo modulo, accetto La politica sulla privacy di NinjaOne.

Termini e condizioni NinjaOne

Cliccando sul pulsante “Accetto” qui sotto, dichiari di accettare i seguenti termini legali e le nostre condizioni d’uso:

  • Diritti di proprietà: NinjaOne possiede e continuerà a possedere tutti i diritti, i titoli e gli interessi relativi allo script (compreso il copyright). NinjaOne ti concede una licenza limitata per l’utilizzo dello script in conformità con i presenti termini legali.
  • Limitazione d’uso: Puoi utilizzare lo script solo per legittimi scopi personali o aziendali interni e non puoi condividere lo script con altri soggetti.
  • Divieto di ripubblicazione: In nessun caso ti è consentito ripubblicare lo script in una libreria di script appartenente o sotto il controllo di un altro fornitore di software.
  • Esclusione di garanzia: Lo script viene fornito “così com’è” e “come disponibile”, senza garanzie di alcun tipo. NinjaOne non promette né garantisce che lo script sia privo di difetti o che soddisfi le tue esigenze o aspettative specifiche.
  • Assunzione del rischio: L’uso che farai dello script è da intendersi a tuo rischio. Riconosci che l’utilizzo dello script comporta alcuni rischi intrinseci, che comprendi e sei pronto ad assumerti.
  • Rinuncia e liberatoria: Non riterrai NinjaOne responsabile di eventuali conseguenze negative o indesiderate derivanti dall’uso dello script e rinuncerai a qualsiasi diritto legale o di equità e a qualsiasi rivalsa nei confronti di NinjaOne in relazione all’uso dello script.
  • EULA: Se sei un cliente NinjaOne, l’uso dello script è soggetto al Contratto di licenza con l’utente finale (EULA) applicabile.