← 기술 블로그 목록으로 돌아가기
#949 • Storage Telemetry & Fault-Tolerant I/O Architecture

전산실 40대 PC의 스토리지 고갈과 I/O 크래시 조기 경보: ZeliDisk의 DriveInfo 볼륨 텔레메트리와 예외 격리 아키텍처

"컴퓨터실 PC나 국방 서버의 디스크 공간이 가득 차 OS가 멈추거나, 연결되지 않은 외장 하드 때문에 프로그램이 무한 대기에 빠진 적이 있으십니까?" 무거운 상용 디스크 모니터링 도구의 관리자 권한 장벽과 복잡성을 격파하는 Zero-Install 온디바이스 스토리지 인텔리전스 대시보드, DriveInfo.GetDrives() 기반의 시스템 전 드라이브 실시간 텔레메트리, 오프라인 미디어와 미삽입 광학 드라이브를 0초 만에 거르는 IsReady 가용성 사전 검증, 배드 섹터와 BitLocker 보안 격리 환경에서도 무중단 구동을 보장하는 IOException / UnauthorizedAccessException 다중 샌드박싱, B~TB 적응형 바이트 포맷팅과 WindowKit AlwaysOnTop 핀 고정 감시 아키텍처 백서.

"학교 컴퓨터실에서 40대의 PC를 관리하는 정보부장 교사의 가장 큰 골칫거리는 불시에 발생하는 '디스크 0바이트 고갈'입니다. 학생들이 실습용 대용량 영상이나 AI 모델 가중치를 C 드라이브에 다운로드하여 시스템 캐시가 마비되고, 윈도우 디스크 관리자(`diskmgmt.msc`)를 열면 가상 디스크 서비스(VDS) 로딩에만 30초 이상이 소요됩니다. 게다가 손상된 USB나 권한이 잠긴 네트워크 드라이브를 잘못 조회하면 프로그램 전체가 멈춰버립니다. ZeliDisk는 단 1바이트의 외부 설치 없이, 0초 만에 모든 물리·논리 볼륨의 용량과 가용 상태를 파악하고 잠재적인 I/O 크래시를 격리하여 관리자에게 완벽한 온디바이스 스토리지 통제권을 부여합니다."

1. 학교 컴퓨터실과 국방 서버의 디스크 장애 현실: "어느 날 갑자기 찾아오는 0바이트 고갈과 시스템 다운"

전산 교육장과 공공 폐쇄망 환경에서 스토리지는 가장 취약한 인프라 구성 요소 중 하나입니다:

2. 윈도우 기본 디스크 관리 도구(diskmgmt.msc)의 한계: "느린 로딩, 복잡한 UI, 관리자 권한 필수 장벽"

윈도우에 내장된 '디스크 관리' 도구(diskmgmt.msc)는 엔드유저나 바쁜 교사가 일상적인 용량 점검용으로 사용하기에 너무 무겁고 불편합니다:

  1. 가상 디스크 서비스(VDS) 동기화 지연: 프로그램을 실행하면 "가상 디스크 서비스에 연결 중..." 메시지와 함께 모든 물리 버스를 재스캔하느라 수십 초의 딜레이가 발생합니다.
  2. UAC 관리자 권한 필수 요구: 단순한 용량 확인임에도 파티션 수정 권한이 포함된 관리자 권한(UAC)을 요구하여, 일반 학생 계정에서는 실행 자체가 차단됩니다.
  3. 시각적 인지성 부족: 텍스트 중심의 복잡한 표와 파티션 블록만 나열되어 있어, 어느 드라이브가 위험 수준(90% 이상 점유)인지 한눈에 파악하기 어렵습니다.
flowchart TD subgraph INPUT["💻 Windows DriveInfo.GetDrives() 시스템 순회"] D1["로컬 C: (NVMe SSD)"] D2["로컬 D: (SATA HDD)"] D3["외장 E: (USB 미디어)"] D4["가상 F: (BitLocker / 잠김)"] D5["광학 G: (CD-ROM / 미디어 없음)"] end subgraph IS_READY["🛡️ IsReady 가용성 1차 필터"] D1 & D2 & D3 -->|Ready = true| TRY["I/O 계측 시도"] D5 -->|Ready = false| SKIP["즉각 스킵 (0초 통과)"] end subgraph SANDBOX["🔒 다중 예외 격리 샌드박스"] TRY -->|정상 응답| MODEL["DiskItem 인스턴스 생성"] TRY -->|IOException 발생| ERR1["[I/O Error] 배드섹터 격리 기록"] TRY -->|UnauthorizedAccess 발생| ERR2["[Access Denied] 권한 격리 기록"] end subgraph VIEW["📊 WinUI 3 실시간 텔레메트리 대시보드"] MODEL --> UI["용량 프로그레스바 + FormatBytes(B~TB)"] UI --> SUM["Window Title: 전 드라이브 합산 총용량/여유공간 브리핑"] SUM --> PIN["WindowKit AlwaysOnTop 최상단 핀 고정"] end classDef input fill:#0f172a,stroke:#38bdf8,stroke-width:2px,color:#bae6fd; classDef sandbox fill:#1e1b4b,stroke:#818cf8,stroke-width:2px,color:#e0e7ff; classDef view fill:#022c22,stroke:#10b981,stroke-width:2px,color:#a7f3d0; class INPUT input; class SANDBOX sandbox; class VIEW view;

3. DriveInfo.GetDrives()와 IsReady 가용성 필터: 오프라인/미삽입 미디어 0초 필터링

운영체제 레벨에서 디스크 정보를 가져올 때 가장 흔히 발생하는 버그는 **미디어가 들어있지 않은 드라이브**를 조회할 때 생기는 I/O 블로킹입니다. 예를 들어 광학 디스크 드라이브(CD/DVD-ROM)나 카드 리더기는 드라이브 문자(E:, F:)는 존재하지만 실제 매체가 없어, 속성을 조회하려 하면 운영체제가 타임아웃(최대 30초)까지 응답을 멈춥니다.

ZeliDisk는 drive.IsReady 플래그를 가장 먼저 검사하여, 가용하지 않은 드라이브는 0초 만에 스킵함으로써 UI 스레드의 블로킹을 원천적으로 차단합니다:

C# ZeliDisk/Views/ZeliDiskWindow.xaml.cs — GetDrives 및 IsReady 필터
private void LoadDisks()
{
    var items = new ObservableCollection<object>();
    foreach (var drive in DriveInfo.GetDrives())
    {
        // 미디어가 준비되지 않은 드라이브(CD-ROM 미삽입, 빈 카드리더 등)는 0초 스킵
        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);
            }
            // ... 예외 격리 구문 ...
        }
    }
    DiskItemsControl.ItemsSource = items;
}

4. 다중 예외 격리 샌드박싱: IOException(배드섹터)과 UnauthorizedAccessException(권한 거부) 무중단 방어

학교 컴퓨터실 PC에는 물리적으로 손상된 플래시 메모리, 불량 섹터가 발생한 노후 HDD, 또는 BitLocker로 암호화되어 일반 계정에서 접근이 통제된 파티션이 연결되어 있을 수 있습니다. 기존 유틸리티들은 이러한 드라이브를 만나는 순간 크래시가 발생하거나 무한 로딩에 빠집니다.

ZeliDisk는 3단계 계층적 예외 처리 샌드박스를 구축하여, 결함이 있는 특정 드라이브의 에러를 격리하고 정상 드라이브는 완벽하게 화면에 출력합니다:

C# ZeliDisk/Views/ZeliDiskWindow.xaml.cs — I/O 및 권한 거부 다중 격리
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 암호화 볼륨, 시스템 보안 폴더 권한 거부 안전 격리
    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}");
}

5. DiskItem 스토리지 모델링: B~TB 단위 변환과 정밀 사용률(UsagePercentage) 계산 엔진

사용자에게 `250059350016 바이트`라는 숫자는 직관적인 의미를 전달하지 못합니다. DiskItem 모델은 64비트 정수형(long) 바이트 값을 바탕으로 실시간 점유율(%)과 사람이 읽기 쉬운(Human-Readable) 단위로 자동 변환합니다:

C# ZeliDisk/Models/DiskItem.cs — 스토리지 모델 및 바이트 포맷터
public class DiskItem
{
    public string DriveLetter { get; set; }
    public string VolumeLabel { get; set; }

    public long TotalSize { get; set; }
    public long UsedSpace { get; set; }
    public long FreeSpace { get; set; }

    // 점유율 계산 (TotalSize 0 검증 안전망)
    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 = len / 1024;
        }
        return $"{len:0.##} {sizes[order]}";
    }
}

6. 실시간 집계 텔레메트리와 WindowKit AlwaysOnTop 핀 고정 모니터링 UX

수업 진행 중이나 대용량 파일 복사 중에는 창이 다른 프로그램 뒤로 숨겨지지 않고 항상 화면 최상단에 고정되어 실시간으로 디스크 여유 공간 추이를 감시할 수 있어야 합니다.

ZeliDisk는 WindowKit.Attach(this, "zelidisk")를 통해 창의 이전 위치와 크기를 완벽히 복원하며, BtnPin_Click을 통한 WinUI 3 OverlappedPresenter.IsAlwaysOnTop 토글을 기본 제공합니다. 또한 전체 드라이브의 합산 총용량과 잔여 용량을 윈도우 타이틀바에 실시간 요약 브리핑합니다:

C# ZeliDisk/Views/ZeliDiskWindow.xaml.cs — 타이틀 요약 브리핑 및 AlwaysOnTop 제어
// 드라이브 전체 집계 요약 브리핑
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)}";
}

// 창 최상단 핀 고정 토글
private void BtnPin_Click(object sender, RoutedEventArgs e)
{
    if (AppWindow?.Presenter is not OverlappedPresenter presenter) return;
    _isPinned = !_isPinned;
    presenter.IsAlwaysOnTop = _isPinned;
    TxtPin.Opacity = _isPinned ? 1.0 : 0.5;
    PinBg.Color = _isPinned
        ? Windows.UI.Color.FromArgb(0x35, 0x0E, 0xA7, 0x6C)
        : Windows.UI.Color.FromArgb(0x15, 0xFF, 0xFF, 0xFF);
}

7. 디스크 모니터링 도구(CrystalDiskInfo vs diskmgmt.msc vs TreeSize vs ZeliDisk) 비교 분석

공교육 및 공공 기관의 환경에 맞추어 기존 도구들과 비교 분석한 결과는 다음과 같습니다:

비교 항목 Windows diskmgmt.msc CrystalDiskInfo (상용/서드파티) TreeSize Free ZeliDisk (온디바이스)
배포 및 설치 방식 OS 내장 (느린 VDS 로딩) 설치 필요 (인스톨러) 설치형 또는 포터블 Zero-Install 무설치 네이티브
관리자 권한(UAC) 요구 관리자 권한 필수 SMART 조회 시 필수 일부 필요 일반 사용자 권한 0초 즉시 실행
IsReady 사전 검증 타임아웃 대기 발생 SMART 미지원 시 오류 순회 중 에러 발생 미삽입 미디어 0초 즉각 스킵
I/O 에러 / 권한 격리 전체 창 일시 동결 장치 미인식 경고 팝업 연속 발생 IOException 샌드박스 무중단 보호
AlwaysOnTop 핀 고정 미지원 일부 지원 미지원 원클릭 최상단 핀 고정 대시보드
라이선스 단속 위험 무관 상업/공공 이용 조건 확인 기업/공공 라이선스 유료 완전 무상 보급 / 100% 라이선스 프리

8. 결론: "외부 설치와 관리자 권한 없는 학교·국방을 위한 가장 신속한 온디바이스 스토리지 인텔리전스"

스토리지는 컴퓨터 시스템의 토대입니다. 토대가 흔들리면 아무리 뛰어난 AI 모델이나 교육용 소프트웨어도 작동할 수 없습니다. 윈도우 관리자 권한이 없다는 이유로, 혹은 프로그램이 너무 무겁다는 이유로 디스크 상태를 방치하는 것은 더 큰 시스템 붕괴를 부릅니다.

ZeliDesk의 ZeliDisk는 마이크로소프트의 DriveInfo API를 가장 안전하고 우아하게 래핑하여, 결함 있는 드라이브를 스스로 격리하고 전체 볼륨의 상태를 0.1초 만에 한눈에 펼쳐 보입니다. 이제 전국의 학생, 교사, 국방 전산 담당자들은 소프트웨어 라이선스 걱정 없이 언제든 안전하게 시스템 스토리지 거버넌스를 완수할 수 있습니다.

← 이전 기술 백서 #950 부팅 10초 단축과 악성 지속성(Persistence) 0초 차단: ZeliStartup의 HKCU·HKLM 4대 시작프로그램 순회와 비파괴적 레지스트리 거버넌스 아키텍처 다음 기술 백서 → #948 디지털 교과서(AIDT) 원격 수업 지연과 학내망 병목 0초 진단: ZeliSpeed의 ICMP 지터(Jitter) 계측과 비동기 스트리밍 대역폭 텔레메트리 아키텍처
💾 ZeliDesk ZeliDisk 온디바이스 스토리지 대시보드 체험하기
단 하나의 클릭으로 40대 PC의 드라이브 용량과 가용 상태를 0초 만에 브리핑받으세요.
72종 유틸리티 전체 둘러보기 →