Skip to content

Белая книга ​

В этом документе подробно рассматриваются архитектурный дизайн WSL Dashboard, выбор технологий и логика реализации ключевых функций, предоставляя разработчикам и опытным пользователям взгляд с технической глубиной.

1. Обзор архитектуры ​

WSL Dashboard использует классическую архитектуру «реактивный UI + асинхронные фоновые задачи», задействуя систему типов и модель владения Rust для обеспечения безопасности памяти и высокой производительности при параллельной работе.

Ключевые компоненты ​

  • Frontend (UI): декларативный интерфейс на основе Slint. Поток UI отвечает за отрисовку и взаимодействие с пользователем.
  • Backend (Runtime): асинхронный рантайм на основе Tokio. Отвечает за распределение и выполнение системных команд (CLI), файловый ввод-вывод и сетевое прослушивание.
  • Communication: поток UI и асинхронные задачи обмениваются данными через Channel (MPSC) и Shared State (Arc/Mutex/RwLock) — эффективно и потокобезопасно.

2. Обоснование выбора технологий ​

Почему Rust? ​

  • Производительность: абстракции с нулевой стоимостью, компиляция в нативный машинный код, без пауз из-за сборщика мусора.
  • Безопасность памяти: переполнение буфера и гонки данных исключаются на этапе компиляции — это критически важно для инструмента, работающего с низкоуровневыми системными операциями (перенос дисков, настройка сети).
  • Размер бинарного файла: статическая компоновка всех зависимостей даёт один портативный исполняемый файл.

Почему 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 Мониторинг ресурсов и лёгкость ​

Приложение контролирует собственное потребление ресурсов, вызывая нативные API Windows (например, GetProcessMemoryInfo).

  • Максимальная лёгкость: в тихом режиме трея приложение активно освобождает ненужные ресурсы UI. Для стандартных наборов символов, таких как английский, потребление памяти может составлять всего 10 МБ; для сложных наборов символов (китайский, японский, корейский) из-за загрузки крупного кэша отрисовки шрифтов потребление составляет около 38 МБ.

4. Показатели оптимизации производительности ​

ПоказательЦель/фактМетод оптимизации
Скорость запуска< 500 мсПредкомпиляция интерфейса Slint, уменьшение разбора во время выполнения.
Базовая память (трей)~10 МБМинимизация частоты фоновых опросов, освобождение кэша отрисовки по требованию.
Загрузка CPU (в покое)< 0,1%Использование событийной модели Windows, отсутствие пустых циклов опроса.
Частота кадров отрисовки60 FPSАппаратное ускорение Skia на GPU, субпиксельное сглаживание.

5. Логика распределения фоновых задач ​

Для обеспечения плавности UI все трудоёмкие операции (например, экспорт VHDX) распределяются через асинхронные задачи:

  1. Инкапсуляция запроса: поток UI инкапсулирует действие пользователя в сообщение Command.
  2. Канал сообщений: отправка через tokio::sync::mpsc обработчику фоновых задач.
  3. Обратная передача состояния: после завершения фоновой задачи UI обновляется через обратный вызов или общее состояние. Такая конструкция гарантирует мгновенную реакцию интерфейса на клики пользователя даже при обработке задач резервного копирования объёмом в несколько ГБ.

6. Вопросы безопасности ​

  • Атомарные операции: для ключевых операций удаления и переноса экземпляров реализована предварительная проверка.
  • Управление повышением прав UAC: права запрашиваются только при необходимости (например, при привязке USB-устройств), соблюдается принцип минимальных привилегий.
  • Локальное хранение: конфигурация хранится только локально в ~\.wsldashboard, без какой-либо облачной синхронизации, защищая конфиденциальность пользователя.