1. 학생 40명의 AI 가중치 다운로드와 C: 드라이브 100% 포화 재앙
최근 초·중·고 컴퓨터실과 대학교 실습실에서 온디바이스 AI(sLM, 확산 모델) 실습이 본격화되면서 새로운 치명적인 시스템 장애가 빈번히 발생하고 있습니다. 학생 40명이 수 기가바이트(GB)에 달하는 GGUF 모델 가중치나 파이썬 가상환경을 다운로드받다가 운영체제 시스템 드라이브(C:)의 여유 공간이 0바이트로 고갈되는 사태입니다.
윈도우 OS는 페이징 파일(pagefile.sys)이나 임시 폴더를 쓸 공간이 사라지는 순간 즉시 프리징(Freezing)되거나 블루스크린(BSOD)을 띄우며 크래시됩니다. 국방 지휘 단말기나 작전 서버 역시 전술 영상 데이터와 로그가 예고 없이 스토리지를 잠식할 경우 중대한 시스템 다운타임으로 이어집니다.
ZeliDesk의 ZeliDisk는 이러한 스토리지 고갈을 사전에 감지하고 직관적으로 통제하기 위해,
"윈도우 커널 DriveInfo 기반의 무지연(Zero-Latency) 볼륨 계측,
오프라인/BitLocker 드라이브에 대한 3단계 I/O 예외 샌드박싱,
WindowKit 가상 화면 영속화 및 Always-On-Top 실시간 스토리지 HUD 아키텍처"를 구축했습니다.
2. 윈도우 커널 DriveInfo 무지연 볼륨 텔레메트리와 IsReady 검증
디스크 용량을 조사하기 위해 WMI(Windows Management Instrumentation)나 PowerShell 명령을 호출하면
수 초의 프로세스 부팅 오버헤드가 발생하여 즉각적인 진단이 불가능합니다.
ZeliDiskWindow.xaml.cs는 .NET의 순수 System.IO.DriveInfo 커널 래퍼를 사용하여
단 5ms 이내에 시스템의 모든 물리/논리 볼륨 메타데이터를 일괄 스캔합니다.
private void LoadDisks()
{
var items = new ObservableCollection<object>();
// 1) 운영체제에 마운트된 모든 논리/물리 드라이브 순회
foreach (var drive in DriveInfo.GetDrives())
{
// ★ 핵심 가드: 미디어 삽입 여부 검증 (빈 CD-ROM, 플로피, 분리된 외장 리더기 블로킹 방어)
if (drive.IsReady)
{
try
{
var item = new DiskItem
{
DriveLetter = drive.Name.Trim('\\'),
VolumeLabel = drive.VolumeLabel,
TotalSize = drive.TotalSize,
FreeSpace = drive.TotalFreeSpace,
UsedSpace = drive.TotalSize - drive.TotalFreeSpace
};
items.Add(item);
}
catch (IOException ex)
{
// 디스크 물리 I/O 에러 또는 섹터 불량 격리
System.Diagnostics.Debug.WriteLine($"[ZeliDisk] Disk I/O Error {drive.Name}: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{
// BitLocker 잠금 드라이브 또는 보안 ACL 접근 거부 격리
System.Diagnostics.Debug.WriteLine($"[ZeliDisk] Access Denied {drive.Name}: {ex.Message}");
}
catch (Exception ex)
{
// 기타 예상치 못한 커널 예외 방어
System.Diagnostics.Debug.WriteLine($"[ZeliDisk] Disk Load Error {drive.Name}: {ex.Message}");
}
}
}
DiskItemsControl.ItemsSource = items;
// 2) 전체 드라이브 용량 실시간 합산 집계
if (items.Count > 0)
{
long totalAll = items.Cast<DiskItem>().Sum(d => d.TotalSize);
long usedAll = items.Cast<DiskItem>().Sum(d => d.UsedSpace);
long freeAll = items.Cast<DiskItem>().Sum(d => d.FreeSpace);
this.Title = $"ZeliDisk — {items.Count}개 드라이브 | 총 {DiskItem.FormatBytes(totalAll)}, 여유 {DiskItem.FormatBytes(freeAll)}";
}
}
컴퓨터실 PC에는 빈 CD/DVD 드라이브나 SD카드 슬롯, 매핑만 되어 있고 끊어진 네트워크 드라이브(Z:)가 종종 존재합니다.
IsReady를 확인하지 않고 drive.TotalSize를 직접 읽으려 하면
OS 레벨에서 타임아웃이 발생하거나 윈도우 탐색기 에러 팝업("디스크를 넣으십시오")이 발생하며
스레드가 수십 초간 블로킹됩니다.
ZeliDisk는 IsReady == true인 준비된 볼륨만 정밀 선별하여 무지연 렌더링을 보장합니다.
3. 3단계 I/O 예외 샌드박싱: BitLocker 잠금과 물리 배드섹터 방어
국방부 보안 단말기나 교육청 감사용 PC는 C: 드라이브 외에 외장 하드나 USB에 BitLocker 드라이브 암호화가 걸려 있거나, 특정 파티션에 엄격한 관리자 ACL이 적용되어 일반 권한 프로세스의 메타데이터 읽기를 거부합니다.
ZeliDisk는 예외를 포괄적으로 뭉뚱그려 잡지 않고, 세 단계로 정밀 분기하여 로그를 추적하고 시스템을 보호합니다:
| 예외 계층 | 발생 원인 및 시나리오 | 격리 처리 방식 | 시스템 영향도 |
|---|---|---|---|
IOException |
외장 디스크 불완전 탈착, I/O 버스 지연, 물리 배드섹터 | 해당 드라이브만 건너뛰고 정상 볼륨 계속 수집 | 0ms (크래시 없음) |
UnauthorizedAccessException |
BitLocker 잠금 볼륨, 관리자 전용 숨김 파티션(Recovery) | 접근 거부 로그 기록 후 안전하게 스킵 | 0ms (보안 격리) |
Exception (Fallback) |
가상 디스크 드라이버 오류, 서드파티 암호화 필터 드라이버 충돌 | 최상위 안전망에서 예외 흡수하여 전체 런처 보호 | 100% 무결 구동 |
4. 가변 단위 바이트 포맷팅과 그래픽 게이지 모델링 (DiskItem)
64비트 정밀 정수(long)로 주어지는 디스크 바이트를 사용자가 한눈에 이해할 수 있도록
DiskItem.cs는 O(1) 1024 루프 스케일링을 통해 B, KB, MB, GB, TB로 자동 포맷팅합니다.
public class DiskItem
{
public string DriveLetter { get; set; } // 예: "C:"
public string VolumeLabel { get; set; } // 예: "시스템 드라이브"
public long TotalSize { get; set; }
public long UsedSpace { get; set; }
public long FreeSpace { get; set; }
// 0으로 나누기(Divide-by-zero) 예외를 방어한 사용률 백분율
public double UsagePercentage => TotalSize == 0 ? 0 : ((double)UsedSpace / TotalSize) * 100;
public string FormattedTotal => FormatBytes(TotalSize);
public string FormattedUsed => FormatBytes(UsedSpace);
public string FormattedFree => FormatBytes(FreeSpace);
public string FormattedPercent => $"{UsagePercentage:F1}%";
public string DisplayName => string.IsNullOrEmpty(VolumeLabel)
? $"로컬 디스크 ({DriveLetter})"
: $"{VolumeLabel} ({DriveLetter})";
public static string FormatBytes(double len)
{
string[] sizes = { "B", "KB", "MB", "GB", "TB" };
int order = 0;
while (len >= 1024 && order < sizes.Length - 1)
{
order++;
len /= 1024;
}
return $"{len:0.##} {sizes[order]}";
}
}
5. 교실 수업과 대용량 작업 중 실시간 감시: Always-On-Top 핀 & WindowKit
디스크 용량 확인 도구는 파일 복사나 AI 가중치 다운로드 중에도 다른 창에 가려지지 않아야 가치가 있습니다.
ZeliDisk는 WinUI 3 OverlappedPresenter.IsAlwaysOnTop 토글과
WindowKit.Attach(this, "zelidisk")를 결합하여 데스크톱 스토리지 HUD로 진화했습니다.
public ZeliDiskWindow()
{
this.InitializeComponent();
// 1) WindowKit을 통해 창 위치와 크기를 멀티 모니터 가상 좌표계에 원자적 영속화
ZeliDesk.Services.WindowKit.Attach(this, "zelidisk");
ExtendsContentIntoTitleBar = true;
SetTitleBar(AppTitleBar);
if (AppWindow != null)
{
// 950x800의 시원한 와이드 대시보드 뷰 할당
AppWindow.Resize(new SizeInt32(950, 800));
// 창 생성 시 기본 Always-On-Top 핀 활성화
if (AppWindow.Presenter is OverlappedPresenter presenter)
{
presenter.IsAlwaysOnTop = true;
}
}
LoadDisks();
}
이를 통해 교사는 빔프로젝터로 수업을 진행하거나 대용량 영상 렌더링 작업을 수행하면서도, 화면 한구석에 콤팩트하게 띄워둔 ZeliDisk HUD를 통해 C: 드라이브의 위험 수위(예: 잔여 용량 5GB 미만)를 실시간으로 직관 감시할 수 있습니다.
6. 종합 아키텍처 다이어그램
ZeliDisk의 커널 볼륨 스캔 및 UI 바인딩 파이프라인 전체 구조도입니다:
┌────────────────────────────────────────────────────────────────────────────────────────┐
│ ZeliDisk Engine Host │
│ │
│ [ Windows Kernel I/O ] ──► DriveInfo.GetDrives() (Zero-Latency Kernel Interop) │
│ │ │
│ ▼ │
│ [ drive.IsReady == true ? ] │
│ │ │
│ ┌───────────────┴───────────────┐ │
│ ▼ ▼ │
│ [ Yes: Active Volume ] [ No: Skip Volume ] (CD-ROM/Offline) │
│ │ │
│ [ 3-Tier Sandbox ] │
│ ├── IOException ───────────────► Skip & Log Bad Sector │
│ ├── UnauthorizedAccessException ► Skip & Log BitLocker/ACL Locked │
│ └── Generic Exception ─────────► Top-level Crash Barrier │
│ │ │
│ ▼ │
│ [ DiskItem Model ] ──► UsagePercentage = (Used / Total) * 100 │
│ FormatBytes() ➔ "238.4 GB / 476.8 GB (50.0%)" │
│ │ │
│ ▼ │
│ [ WinUI 3 Dashboard ] ◄──────┴──────► [ WindowKit Persistence & AlwaysOnTop Pin HUD ] │
└────────────────────────────────────────────────────────────────────────────────────────┘
7. 결론: 가장 단순한 지표가 가장 치명적인 다운타임을 막는다
시스템 엔지니어링에서 가장 위험한 순간은 복잡한 알고리즘의 버그가 아니라, "디스크 공간이 가득 찼다"는 가장 기초적인 사실을 제때 인지하지 못했을 때 발생합니다.
ZeliDisk는 복잡한 설치나 무거운 백그라운드 데몬 없이, 단 5ms 만에 시스템의 모든 드라이브 상태를 커널 레벨에서 낚아채어 명확한 시각적 언어로 전달합니다. 이 견고하고 가벼운 스토리지 거버넌스 엔진이 자리 잡고 있기에, 전국 학교 컴퓨터실과 군사 작전 단말기는 어떠한 대용량 AI 실습 환경에서도 안정적인 무중단 컴퓨팅을 유지할 수 있습니다.