Skip to content

백서 ​

이 문서는 WSL Dashboard의 아키텍처 설계, 기술 선택 및 핵심 기능의 기반 구현 로직을 심층적으로 다루며, 개발자와 고급 사용자에게 기술적 심층 관점을 제공합니다.

1. 아키텍처 개요 ​

WSL Dashboard는 고전적인 반응형 UI 주도 + 비동기 백엔드 작업 아키텍처를 채택하고, Rust 언어의 타입 시스템과 소유권 모델을 활용하여 메모리 안전성과 고성능 동시성을 보장합니다.

핵심 구성 요소 ​

  • Frontend (UI): Slint 기반 선언형 인터페이스. UI 스레드가 렌더링과 사용자 상호작용을 담당합니다.
  • Backend (Runtime): Tokio 기반 비동기 런타임. 시스템 명령(CLI)의 배포·실행, 파일 I/O, 네트워크 수신을 담당합니다.
  • Communication: UI 스레드와 비동기 작업은 Channel (MPSC) 및 **Shared State (Arc/Mutex/RwLock)**를 통해 효율적이고 스레드 안전하게 통신합니다.

2. 기술 선택 이유 ​

왜 Rust인가? ​

  • 성능: 제로 코스트 추상화, 네이티브 머신 코드로 컴파일되며 GC 지터가 없습니다.
  • 메모리 안전성: 컴파일 시 버퍼 오버플로와 데이터 경쟁을 제거합니다. 디스크 마이그레이션, 네트워크 구성 등 시스템 저수준 작업과 관련된 도구에게 매우 중요합니다.
  • 바이너리 크기: 모든 종속성을 정적으로 링크하여 단일 파일 포터블 실행 프로그램을 생성합니다.

왜 Slint + Skia인가? ​

  • 선언형 구문: 인터페이스 설명과 로직이 분리되어 코드 유지보수가 쉽습니다.
  • Skia 렌더링: GPU 가속(Skia 엔진 경유)을 직접 활용하여 서브픽셀 수준의 선명한 텍스트와 부드러운 애니메이션 효과를 제공합니다.
  • 낮은 오버헤드: Electron이나 WPF에 비해 Slint의 런타임 오버헤드가 극히 작습니다.

3. 주요 기술 구현 ​

3.1 WSL 인스턴스 탐지 및 파싱 ​

앱은 wsl.exe --list --verbose를 호출하고 그 출력을 파싱(UTF-16 인코딩 처리)하여 인스턴스 상태를 실시간으로 얻습니다.

  • 저수준 디코딩: 자체 개발한 효율적인 인코딩/디코더로 다양한 로케일 설정의 Windows 환경에서도 출력을 올바르게 파싱할 수 있습니다.
  • 상태 동기화: 정기 폴링 + 작업 트리거의 이중 동기화 메커니즘 채택.

3.2 디스크 이미지 마이그레이션 (VHDX Move) ​

마이그레이션 기능은 WSL의 가져오기/내보내기 메커니즘을 활용하지만, 높은 수준으로 추상화되고 원자적으로 처리됩니다.

  • 트랜잭션 보장: 마이그레이션 시작 전에 앱이 뮤텍스(Mutex)로 대상 배포판을 잠가 동시 작업으로 인한 데이터 손상을 방지합니다.
  • 자동 등록: 마이그레이션 완료 후 앱이 VHDX 경로를 자동으로 리디렉션하고 배포판을 다시 등록하므로 사용자의 수동 개입이 필요 없습니다.

3.3 포트 포워딩 및 방화벽 자동화 ​

네트워크 기능은 단순한 netsh interface portproxy 호출이 아닙니다.

  • 규칙 수명 주기 관리: 앱이 기존 방화벽 규칙을 자동으로 감지합니다. 사용자가 포워딩을 생성하면 앱이 Windows API 또는 CLI로 인바운드 예외 규칙을 동기 생성합니다.
  • IP 자동 획득: wsl hostname -I 결과를 파싱하여 호스트와 인스턴스 간의 가상 네트워크 IP를 자동으로 매핑합니다.

3.4 USBIP 통합 ​

usbipd-win의 명령줄 인터페이스를 활용합니다.

  • 권한 상승 처리: 바인딩 작업에는 관리자 권한이 필요하며, 백엔드 로직이 세련된 UAC 권한 상승 요청 전달을 구현합니다.
  • 상태 스테이트 머신: 내부에 USB 장치 연결 상태 머신을 유지하여 Attach/Detach 과정의 추적 가능성을 보장합니다.

3.5 리소스 모니터링 및 경량화 ​

앱은 Windows 네이티브 API(GetProcessMemoryInfo 등)를 호출하여 자체 리소스 사용량을 모니터링합니다.

  • 극한 경량: 트레이 조용한 모드에서 앱이 불필요한 UI 리소스를 적극적으로 해제합니다. 영어 등 표준 문자 세트에서는 메모리 사용량이 10MB까지 낮아질 수 있으며, 한중일 등 복잡한 문자 세트에서는 큰 폰트 렌더링 캐시를 로드해야 하므로 약 38MB 수준입니다.

4. 성능 최적화 지표 ​

지표목표/실측최적화 수단
시작 속도< 500msSlint 인터페이스 사전 컴파일로 런타임 파싱 감소.
기본 메모리(트레이)~10MB백그라운드 폴링 빈도 최소화, 필요 시 렌더링 캐시 해제.
CPU 점유율(정지)< 0.1%Windows 이벤트 구동 모델 사용, 빈 루프 폴링 방지.
렌더링 프레임률60 FPSSkia GPU 가속, 서브픽셀 수준 안티앨리어싱 렌더링.

5. 백엔드 작업 배포 로직 ​

UI의 부드러움을 보장하기 위해 모든 시간이 걸리는 작업(VHDX 내보내기 등)은 비동기 작업으로 배포됩니다:

  1. 요청 캡슐화: UI 스레드가 사용자 작업을 Command 메시지로 캡슐화합니다.
  2. 메시지 채널: tokio::sync::mpsc를 통해 백엔드 작업 처리기로 전송합니다.
  3. 상태 회신: 백엔드 작업 완료 후 콜백 또는 공유 상태로 UI를 업데이트합니다. 이 설계는 수 GB의 백업 작업을 처리하는 중에도 인터페이스가 사용자 클릭에 실시간으로 응답할 수 있게 합니다.

6. 보안 고려 사항 ​

  • 원자적 작업: 중요한 인스턴스 제거 및 마이그레이션에 대해 사전 검증을 구현했습니다.
  • UAC 권한 상승 관리: 필요한 경우(USB 장치 바인딩 등)에만 권한을 요청하며 최소 권한 원칙을 따릅니다.
  • 로컬 저장: 구성은 로컬 ~\.wsldashboard에만 저장되며 클라우드 동기화를 전혀 수행하지 않아 사용자 프라이버시를 보호합니다.