Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

PowerShell로 로컬·원격 Windows 서버의 디스크 여유 공간과 사용량 확인하는 방법

이 글에서는 PowerShell을 활용해 로컬 또는 원격 Windows 호스트의 디스크 여유 공간과 디스크 사용량을 확인하는 방법을 소개합니다. 나아가 여유 공간이 설정한 임계값 이하로 떨어졌을 때 팝업 알림이나 이메일로 관리자에게 자동 통보하도록 구성하는 방법까지 함께 살펴보겠습니다.

WMI와 PowerShell로 드라이브 여유 공간 확인하기

Windows에서 논리 드라이브 정보를 조회하려면 Win32_LogicalDisk WMI 클래스를 사용하면 됩니다. 아래 명령어를 실행하면 컴퓨터에 연결된 모든 논리 드라이브에 대한 상세 정보를 확인할 수 있습니다.

Get-WmiObject -Class Win32_LogicalDisk

PowerShell Core 7.x 사용 시 주의사항

최신 PowerShell Core 7.x를 사용 중이라면 주의가 필요합니다. PowerShell Core는 .NET Core 기반이기 때문에 기존 WMI cmdlet을 지원하지 않습니다. Get-WmiObject를 실행하면 다음과 같은 오류가 발생합니다.

'Get-WmiObject' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행 프로그램 이름으로 인식되지 않습니다.

이 경우 WMI 대신 CIM을 사용하면 됩니다.

Get-CimInstance win32_logicaldisk

여유 공간을 GB와 백분율(%)로 변환하여 표시하기

조회 결과의 FreeSpace 속성에는 각 드라이브의 남은 여유 공간이 바이트 단위로 담겨 있습니다. 가독성을 높이려면 이 값을 GB 단위로 변환하고, 전체 디스크 크기 대비 여유 공간 비율(%)도 함께 표시하는 것이 좋습니다. 다음 PowerShell 스크립트를 활용해 보세요.

Get-WmiObject -Class Win32_LogicalDisk |
Select-Object -Property DeviceID, VolumeName, @{Label='FreeSpace (Gb)'; expression={($_.FreeSpace/1GB).ToString('F2')}},
@{Label='Total (Gb)'; expression={($_.Size/1GB).ToString('F2')}},
@{label='FreePercent'; expression={[Math]::Round(($_.freespace / $_.size) * 100, 2)}}|ft

이 스크립트를 실행하면 논리 드라이브 목록과 함께 각 드라이브의 전체 크기, 여유 공간 백분율이 표 형태로 출력됩니다. PowerShell Core 환경에서 사용하려면 Get-WmiObjectGet-CimInstance로 바꾸기만 하면 됩니다.

임계값 초과 시 알림 표시하기

단순히 여유 공간 정보를 보여주는 것을 넘어, 지정한 임계값보다 여유 공간이 부족할 때 이메일 전송이나 팝업 메시지 표시 같은 특정 동작을 수행하도록 만들 수도 있습니다. 아래 스크립트를 참고하세요.

$percentWarning = 20
$percentCritcal = 5
$ListDisk = Get-WmiObject -Class Win32_LogicalDisk
Foreach($Disk in $ListDisk){
if ($Disk.size -ne $NULL) {
$DiskFreeSpace = ($Disk.freespace/1GB).ToString('F2')
$DiskFreeSpacePercent = [Math]::Round(($Disk.freespace/$Disk.size) * 100, 2)
if($DiskFreeSpacePercent -lt $percentWarning){
$Message= "Warning!"
if($DiskFreeSpacePercent -lt $percentCritcal){
$Message= "Alert!"
}
$wshell = New-Object -ComObject Wscript.Shell
$Output = $wshell.Popup("Disk $($Disk.DeviceID) has only $DiskFreeSpace GB of free space left",0,$Message,48)
}
}
}

이 스크립트는 디스크 여유 공간 임계값을 각각 20%(경고)와 5%(위험)로 설정합니다. 어떤 드라이브든 여유 공간이 이 값 미만으로 떨어지면 모달 방식의 정보 창이 화면에 표시됩니다. 팝업 알림 대신 즉시 디스크 정리 도구(cleanmgr.exe)를 실행하도록 수정할 수도 있습니다.

SMTP를 통해 관리자에게 이메일 보내기

문제 발생 시 관리자에게 이메일로 알리고 싶다면 SMTP 서버(Exchange 호스트나 일반 SMTP 서비스, Windows Server에 내장된 SMTP 역할도 가능)를 통해 Send-MailMessage cmdlet으로 메일을 전송하면 됩니다.

Send-MailMessage -To "srv_admin@woshub.com" -From "$env:computername@woshub.com" -Subject "Insufficient disk space on server $env:computername" -Body "Disk $($Disk.DeviceID) has only $DiskFreeSpace GB left" -Credential (Get-Credential) -SmtpServer smtp.woshub.com -Port 587

위 예제에서는 SMTP 호스트에 접속할 때 자격 증명을 대화형으로 입력해야 합니다. 운영 환경에서는 신뢰할 수 있는 호스트로부터 인증 없이 메일을 수신하도록 SMTP 서버를 구성하거나, 파일에 저장해 둔 자격 증명으로 SMTP 인증을 설정하는 방법을 권장합니다. 참고로 그룹 관리 서비스 계정(gMSA)은 메일 전송용으로 사용할 수 없습니다.

작성한 PowerShell 스크립트는 작업 스케줄러(Task Scheduler)에 등록해 주기적으로 실행하거나 Windows 서비스 형태로 구성할 수 있습니다. 이렇게 하면 해당 Windows 호스트의 여유 공간이 부족해질 때마다 관리자가 자동으로 알림을 받게 됩니다.

원격 Windows 호스트의 디스크 여유 공간 조회하기

Invoke-Command cmdlet을 사용하면 원격 컴퓨터에서 여유 공간 확인 PS 스크립트를 실행할 수 있습니다.

Invoke-Command -ComputerName srv01,srv02,srv03 -FilePath "C:\PS\checkfreespace.ps1"

점검 대상 서버들이 도메인에 속해 있다면 Get-ADComputer cmdlet으로 Active Directory에서 서버 목록을 가져온 뒤, 각 호스트에 대해 스크립트를 일괄 실행할 수 있습니다.

$computers = (Get-ADComputer -Filter 'operatingsystem -like "*Windows Server*" -and enabled -eq "true"').Name
Invoke-Command -ComputerName $computers -FilePath "C:\PS\checkfreespace.ps1" -ErrorAction SilentlyContinue

원격 컴퓨터에서 WMI 데이터를 직접 가져오는 방법도 있습니다.

Get-WmiObject -Class Win32_logicalDisk -ComputerName srv01,srv02,srv03

마무리: 모니터링 규모에 따른 선택

지금까지 소개한 방법은 직접 만들 수 있는 가장 간단한 디스크 공간 모니터링 솔루션입니다. 다만 모니터링해야 할 호스트가 많다면 Zabbix, Icinga, PRTG, Nagios 같은 본격적인 모니터링 시스템을 도입하는 편이 더 효율적입니다.