【开发者自荐】WSL Dashboard 一款WSL2的可视化管理工具

我一直把 WSL 当作 Windows 上最“超值”的开发能力:轻量、快速、足够接近原生 Linux。但在日常使用里,WSL 的管理体验却很容易被细碎的命令和流程拖慢:查看状态、切换默认发行版、迁移磁盘、克隆备份、导出归档……它们都能做,但不够直观,也不够适合高频。

于是我做了 WSL Dashboard:一个面向日常工作流的 WSL 管理面板。它的目标并不是把所有命令“包个壳”,而是把最常见、最容易出错、最影响效率的链路做成一套可视化、可恢复、可持续维护的产品化体验。

项目地址:https://github.com/owu/wsl-dashboard

我在做一个什么样的工具

WSL Dashboard 是一个现代原生桌面应用:Rust + Slint + Skia + Tokio(见 Cargo.toml)。它的核心特性是:

  • 现代原生 UI:轻量、响应快、动效自然,支持深色/浅色模式。
  • WSL 一站式管理:启动/停止/重启、默认发行版、迁移/克隆/导出、安装等高频操作聚合在一处。
  • 系统托盘与静默常驻:适合作为“后台面板型工具”长期运行(入口在 main.rs、托盘实现位于 tray.rs)。
  • 国际化与 RTL 适配:界面支持 29 种语言,并对阿拉伯语/乌尔都语/希伯来语等 RTL 语言做了布局适配(i18n 入口位于 i18n/mod.rs,UI 侧位于 theme.slint 与各 Slint 组件)。

如果你把它当作“WSL 的图形化控制台”,你会发现它更像一个为工作流打磨过的产品:减少命令记忆成本,避免在迁移/克隆这类重操作上踩坑,并尽量让系统状态与 UI 状态保持一致。

为什么它能做到“顺滑且不易卡”

WSL Dashboard 的性能策略,核心是把“慢的、不确定的、可能卡死的”事情从 UI 线程里彻底隔离出去,并且对并发与刷新频率做硬约束。

1) 所有 WSL 调用都是异步执行,并且可控地并发

WSL 的底层调用通过 wsl.exe 完成,但我不希望 UI 因为一次耗时命令变得不可用,所以执行层做了几件关键事情(见 executor.rs):

  • Tokio 异步进程:使用 tokio::process::Command 执行 wsl.exe,读取 stdout/stderr,避免阻塞。
  • 超时与取消:对不同类型命令设置不同超时(重操作最长可到 30 分钟),并启用 kill_on_drop(true),保证取消/超时不会留下“僵尸 wsl.exe”。
  • 并发限流:用信号量限制同时在跑的 WSL 命令数量,避免在高频操作下把系统资源打满,连带 UI 受影响。
  • 输出解码与体积上限:输出做解码与截断上限,避免异常输出把内存和日志撑爆。

这套策略的目标不是“跑得更快”,而是“再怎么用也不容易拖垮 UI”。

2) 状态刷新是事件驱动 + 节流的

“卡顿”的另一大来源是刷新逻辑:频繁刷新 = 频繁跑命令 = 频繁改模型 = UI 压力。这里我把刷新做成两条线(见 tasks.rswsl/dashboard/mod.rs):

  • 周期监测:以固定间隔触发,但只在相关 Tab 可见时刷新,减少无效工作。
  • 状态变更通知:当发行版列表发生变化时,用通知机制触发 UI 更新,而不是一股脑轮询。
  • Debounce 节流:对 UI 刷新做最小间隔限制,降低频繁更新导致的内存压力。

同时,WslDashboard 维护了“手动重操作”计数与“重操作锁”,避免迁移/克隆期间系统自动刷新造成的额外负担,并在操作结束后做一次最终同步。

国际化不是“加个翻译表”,而是完整的产品能力

我在 v0.4.0 里把国际化作为一个完整工程来做:从资源组织、构建校验、到 UI 的 RTL/字体策略,都需要闭环。

1) 资源组织与加载:英语兜底 + 语言覆盖

  • 翻译资源位于 assets/i18n/*.toml,运行时由 RustEmbed 内嵌进二进制(见 i18n/mod.rs)。
  • 加载逻辑是“先加载英文,再覆盖目标语言”,从而做到缺失 key 时至少不至于空白。
  • 语言 code 做了归一化处理(例如 zh-Hans/zh_CN 等),减少系统语言差异导致的错配。

2) 编译期完整性校验:缺 key 直接在构建阶段暴露

我不希望 i18n 的质量完全依赖手工检查,所以在构建脚本里加了 i18n 完整性检查(见 build.rs):以 en.toml 为基准,扫描所有语言文件,输出缺失 key 的警告。这样每次发布前,翻译缺失会被尽早发现。

3) RTL 与复杂脚本的 UI 策略

RTL 支持不是“把文字右对齐”就完事了:很多布局需要镜像,控件的 padding、icon 与文字位置、标题栏按钮顺序都要统一策略。项目里通过全局 AppI18n.is-rtl 控制 UI 分支(见 theme.slint 与各 Slint 组件)。

此外,复杂脚本(阿拉伯语/乌尔都语/希伯来语、印地语、孟加拉语等)在可读性上对字号更敏感,因此 UI 侧提供了 font-scale,根据语言自动放大字体,以减少“看得见但读不舒服”的情况(见 theme.slint)。

同时,为了兼容“西方语言系统环境下显示 CJK 大字体”的问题,应用会根据语言选择合适的默认字体,避免出现中文/日文/韩文渲染不友好的情况(见 data.rs)。

迁移/克隆这些重操作,我做了哪些工程化保护

迁移、克隆、导出这些功能,真正麻烦的是“长链路”和“不确定性”:磁盘空间是否足够?临时文件放哪里?操作是否会与其他任务打架?

我在实现上做了两个偏工程化的选择:

  • C 盘空间探测与临时路径策略:在需要临时文件的操作里,会先探测 C 盘剩余空间;当空间不足时,把临时目录放到更合适的位置,降低失败概率(见 system.rsdistro/mod.rs)。
  • 重操作锁与并发约束:对“重操作”路径做锁与限流,避免用户高频点击或批量操作时造成资源争抢,从而把 UI 拖慢或把操作拖死(见 wsl/dashboard/mod.rsexecutor.rs)。

这些“看起来不显眼”的策略,决定了它是否适合长期使用、是否能承受高频场景。

代码结构:我希望它既能跑,也能持续迭代

如果你想快速理解项目结构,从这里开始会很顺:

  • 启动与装配main.rs 负责配置加载、日志、i18n、UI 初始化、事件注册与后台任务启动。
  • WSL 领域层src/wsl/* 是对 wsl.exe 的抽象、解析与操作封装;WslDashboard 负责状态管理与变更通知。
  • UI 层src/ui/app.slint 为根 UI,src/ui/components/src/ui/views/ 组织界面;src/ui/handlers/ 负责把 UI 事件路由到 Rust 逻辑。
  • 配置与持久化config/mod.rs 管理 ~/.wsldashboard/settings.tomlinstances.toml,包含迁移逻辑与目录创建。

我希望它对用户是“即开即用的单文件应用”,对贡献者则是“结构清晰、好定位、好扩展”的 Rust 桌面工程。

我希望你怎么用它 / 怎么加入它

如果你是 WSL 重度用户,它会帮你把日常管理从“命令 + 记忆”变成“面板 + 流程”。如果你是桌面应用开发者,它也可以作为一个 Rust 原生 UI 项目样板:Slint + Skia 的 UI 实践、Tokio 驱动的系统调用、以及 i18n 工程化策略。

我也非常欢迎贡献:

  • 新语言翻译与术语校对(配合构建期校验能更安心地扩展语言)。
  • 更复杂的 WSL 场景支持(例如迁移策略、安装来源、异常恢复)。
  • UI 体验细节(RTL/复杂脚本在更多控件上的一致性、可访问性等)。

如果你愿意一起把 WSL 的体验做得更“像一个现代工具”,那我们就很适合一起做这件事。


新版本v0.5.0 功能预告:USB设备管理(基于usbipd-win将windows系统插入的usb设备,提供给WSL2中的linux使用)


demo

5 个赞

感觉用来装微软商店里没有的发行版还挺有用的,比如Linux mint之类的,如果能获取出rootfs的话

看起来非常符合我日常使用的需求。

不过怎么感觉正文关于技术细节的介绍是让 AI 读完代码后总结的 :thinking:

1 个赞

我倒是好好用过 WSL2 一段时间,最后还是关掉了 Windows 的 Hyper-V 引擎用 VMWare WorkStation 的自带引擎了,VMWare 对网络控制更好,内存占用也更低,控制感也更强,起码它只带一个管理界面,而 WSL2 得装类似你的这个软件的界面才用得舒服

这工具很不错
下载了用下

感谢支持,需要什么功能,可以在这里回帖评论 或者 提交 issue

3. 主要功能特性:

  • 一站式管理: 支持启动、停止、重启 WSL;设置默认发行版;安装、克隆、导出及迁移发行版。
  • 即将推出的新功能(v0.5.0): USB 设备管理(基于 usbipd-win,让 WSL 也能使用 Windows 上的 USB 硬件)。

我感觉切换default、克隆、安装、启停 都是低频操作。。。可能是我 wsl 用的不够深入?

我用 wsl 最大的感觉就是无感使用。

很棒的工作

v0.5.0 更新日志:

1、设置界面增加WSL2全局设置入口(~/.wslconfig)。
2、发行版配置 /etc/wsl.conf 。
3、优化已安装的发新版列表刷新策略(侧边栏选中首页,且非关闭至系统栏托盘,才会定时刷新)。
4、USB设备管理(基于usbipd-win提供Windows系统插入的USB给WSL中的Linux使用;刷新策略与发新版列表一致)。
5、设置界面下拉菜单交互优化。
6、启动流程优化,去除冗余逻辑。

下一个版本初步计划 : 网络 或 Docker


对于我来说wsl就是docker启动器,但是我没用docker desktop按照用的是命令行安装
如果能直接管理docker就好了

docker 的管理,在开发计划中,可以保持关注

WSL Dashboard v0.5.1 开源更新, Bug专场&新功能预告

今天是3月12日植树节,让我们一起为地球添点绿。祝您节日快乐,心想事“橙”!

A、更新日志
1、优化vscode打开发行版的启动方式(VS Code安装WSL插件后,基本上100%能正常打开)。
2、微软商店安装发行版卡顿问题修复。
3、移动,克隆发行版,同时处理厂商图标。

B、功能预告
网络功能开发中,预计三月底—四月底发布(网络功能及交互相对比较复杂,预留足够时间开发测试)

C、新功能提交
有什么新功能诉求,可以在下方评论 或者 提交 issues。

D、重要的事情
项目主页 : GitHub - owu/wsl-dashboard: A GUI manager for WSL. A modern, high-performance, and lightweight WSL instance management dashboard. · GitHub

如果项目对您有帮助,请帮我加一个星标(大佬们,帮我助力一把,争取早日突破一千个星标)。

E、伙伴邀请
如果您对Rust 及 开源 充满兴趣,可以沟通加入一起开发该工具。

1 个赞

卡巴斯基好像会报可疑特征,用之前还是得注意加白

有个疑问。我自己的VSCode已经安装了WSL,并且已经在运行了,但软件没有检测出来。有可能是因为我用的VSCode是scoop里面安装的?不清楚这里检测的原理是什么

开源代码,exe文件由github action 的 workfollow 编译,所以值得信赖。

端口转发功能预览,预计在 4 月中下旬发布

1 个赞

使用vscode打开发行版,需要安装下面的插件

{
"name":" Microsoft WSL(Identifier:ms-vscode-remote.remote-wsl)",
"url":"https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl"
}

点击vscode按钮,会执行下面的命令判定windows安装的vscode是否安装了必须的插件

code --list-extensions | grep "ms-vscode-remote.remote-wsl"
1 个赞