Zabbix signale : « Windows FS [Partages(E:)]: Space is critically low (used>90%, total 100.0GB) », hôte VM-WinSrv25-JP, apparue à 14h50.
BC02 · Scripts et automatisation
INC-06 Alerte Zabbix : le volume du partage E: est presque plein
Azur · administrateur WindowsRien n'a été supprimé sans un accord écrit. Et comme la dernière sauvegarde datait d'avant les fichiers, cet accord était la seule garantie.
Get-Volume -DriveLetter E : 100 Go, 8,8 Go libres (91,2 % occupés).
Get-FsrmQuota : un seul quota, sur E:\Informatique (5 Go, rien d'utilisé). Il n'explique pas la saturation.
Get-ChildItem E:\ -Recurse -File | Sort-Object Length -Descending | Select-Object -First 10 : 9 fichiers de 10 240 Mo, export_1.bak à export_9.bak, dans E:\Temp_Migration, tous créés à 14h45. Total : 92 160 Mo.
J'applique le script de rapport prévu dans mon runbook de stockage, en lecture seule (voir le script plus bas) : deux fichiers CSV horodatés, les plus gros fichiers et la taille de chaque dossier. Testé d'abord sur un petit dossier (15h21), puis lancé sur tout le volume (15h29). Ils gardent une preuve datée de l'état avant intervention.
Le volume des partages est occupé à 91,2 % : il reste 8,8 Go. Les fichiers datent tous du même jour, je ne peux donc pas dire quand le volume sera plein. À 100 %, les partages deviendraient inutilisables : c'est pourquoi le ticket est en priorité Haute. Le dossier E:\Temp_Migration occupe 92 160 Mo. Je ne supprime rien sans ton accord. Peux-tu m'indiquer, pour chaque fichier : à garder, à archiver ailleurs ou à supprimer ?
export_2.bak à export_9.bak : à supprimer, ce sont des exports temporaires de migration. export_1.bak : à conserver jusqu'à vendredi pour une vérification. Rien d'autre ne doit être supprimé. Confirme-moi l'espace libéré et le retour à la normale de l'alerte.
wbadmin get versions : la dernière sauvegarde date de 14h40, avant la création des fichiers (14h45). Aucune restauration possible : la suppression sera irréversible, l'accord écrit est la seule garantie.
Simulation d'abord : 2..9 | ForEach-Object { Remove-Item -LiteralPath "E:\Temp_Migration\export_$_.bak" -WhatIf } (export_2 à export_9 listés, export_1 écarté). Puis la suppression, et la preuve : Get-ChildItem E:\Temp_Migration ne montre plus qu'export_1.bak ; Get-Volume : 88,8 Go libres.
Cause : neuf fichiers d'export de migration de 10 Go chacun occupaient le volume des partages, à 91,2 %.
Correction : avec l'accord écrit du responsable, suppression de export_2.bak à export_9.bak après une simulation -WhatIf ; export_1.bak conservé.
Vérification : espace libre passé de 8,8 Go à 88,8 Go ; alerte Zabbix passée à Résolu.
Recommandation : un quota FSRM sur ce dossier pour éviter la récidive (proposé, à valider par le responsable).
# Rapport-Espace-Partage.ps1 - LECTURE SEULE : ne supprime rien
# Exporte les plus gros fichiers et la taille des dossiers de premier niveau.
param(
[string]$Racine = 'E:\',
[int]$Nombre = 30,
[string]$Sortie = 'C:\Outils\Rapports'
)
# 1. Verifications
if (-not (Test-Path -LiteralPath $Racine)) {
Write-Error "Racine introuvable : $Racine"
exit 1
}
New-Item -ItemType Directory -Path $Sortie -Force | Out-Null
$h = Get-Date -Format 'yyyyMMdd-HHmm'
$ea = 'SilentlyContinue'
# 2. Traitement : les plus gros fichiers
$fichiers = Get-ChildItem -LiteralPath $Racine -Recurse -File -ErrorAction $ea |
Sort-Object Length -Descending |
Select-Object -First $Nombre |
ForEach-Object {
[pscustomobject]@{
Chemin = $_.FullName
TailleMo = [math]::Round($_.Length / 1MB, 1)
Proprietaire = (Get-Acl -LiteralPath $_.FullName -ErrorAction $ea).Owner
Modifie = $_.LastWriteTime
Cree = $_.CreationTime
}
}
# 3. Traitement : taille de chaque dossier de premier niveau
$dossiers = Get-ChildItem -LiteralPath $Racine -Directory -ErrorAction $ea |
ForEach-Object {
$sous = Get-ChildItem -LiteralPath $_.FullName -Recurse -File -ErrorAction $ea
$somme = ($sous | Measure-Object Length -Sum).Sum
[pscustomobject]@{
Dossier = $_.FullName
TailleMo = [math]::Round($somme / 1MB, 1)
}
} |
Sort-Object TailleMo -Descending
# 4. Export et message de fin
$f1 = Join-Path $Sortie "gros-fichiers-$h.csv"
$f2 = Join-Path $Sortie "tailles-dossiers-$h.csv"
$fichiers | Export-Csv -Path $f1 -NoTypeInformation -Encoding UTF8 -Delimiter ';'
$dossiers | Export-Csv -Path $f2 -NoTypeInformation -Encoding UTF8 -Delimiter ';'
Write-Output "Rapports : $f1 et $f2"
Extrait du rapport produit (lancement sur tout le volume, 15h29)
| Dossier | TailleMo |
|---|---|
| E:\Temp_Migration | 92160 |
| E:\Commun | 0 |
| E:\Informatique | 0 |
| Chemin | TailleMo | Propriétaire | Créé |
|---|---|---|---|
| E:\Temp_Migration\export_1.bak | 10240 | BUILTIN\Administrateurs | 14:45:06 |
| E:\Temp_Migration\export_2.bak | 10240 | BUILTIN\Administrateurs | 14:45:06 |
| E:\Temp_Migration\export_3.bak | 10240 | BUILTIN\Administrateurs | 14:45:06 |
| … export_4.bak à export_9.bak, même taille, même heure | |||
Ce que je défends dans ce script : il annonce « lecture seule » dès la première ligne, il vérifie la racine avant d'agir, ses paramètres permettent de le tester sur un petit dossier, et ses rapports horodatés gardent une preuve de l'état avant intervention.