WebVM - Virtual Machine for the Web
WebVM 是一个无服务器虚拟环境,基于 HTML5/WebAssembly 在浏览器中完整运行未修改的 Debian Linux。它由 CheerpX 引擎驱动,提供 x86-to-WebAssembly JIT 编译器、虚拟块文件系统、Linux 系统调用模拟和安全的沙箱执行,并支持 Tailscale 网络集成与 Claude AI 集成。
社区作者 · zZz
它解决什么问题
WebVM 是一个完全在浏览器客户端运行的 Linux 虚拟机,使用 HTML5/WebAssembly 技术,无需服务器即可运行未修改的 Debian 发行版及众多原生开发工具链。其核心是 CheerpX 虚拟化引擎,包含 x86-to-WebAssembly JIT 编译器、基于虚拟块的文件系统、Linux 系统调用模拟器以及安全的沙箱执行环境。WebVM 支持 Tailscale 集成,用户可以通过浏览器 VM 访问私有网络,并通过配置出口节点访问公共互联网。
此外,项目还提供了 Claude AI 集成,允许用户通过 Anthropic API 密钥在 WebVM 中与 Claude 交互,辅助完成如 CTF 挑战等任务。WebVM 可通过 GitHub Pages 进行简单部署,也支持本地构建和自定义镜像。项目采用 Apache License 2.0 发布,但 CheerpX 的公开部署仅限个人免费使用,组织或商业用途需要另行获得许可。
— 本文由 AI 根据公开来源辅助整理,命令、版本与许可证请在使用前到原始页面复核。
安装 / 开始使用
克隆仓库:
- 本地部署:
git clone https://github.com/leaningtech/webvm.gitcd webvm- 准备自定义磁盘镜像:
- 将 .ext2 镜像放入 custom-disk-images/ 目录。
- 官方 Debian mini 镜像可从 Releases 下载:debian_mini_20230519_5022088024.ext2
- 也可以放入自己构建的镜像。
编辑 config_public_terminal.js:
- 配置 WebVM 指向本地镜像:
export const diskImageUrl = "/custom-disk-images/debian_mini_20230519_5022088024.ext2";export const diskImageType = "bytes";- 安装依赖并构建:
npm installnpm run buildnginx -p . -c nginx.conf 然后打开 http://127.0.0.1:8081 即可使用本地 WebVM。
- 启动 Nginx 并访问:
- 部署到 GitHub Pages:
- Fork 本仓库。
- 在 fork 的仓库中进入 Settings → Pages,将 Source 设为 "GitHub Actions"。
- 在 Actions 中运行 Deploy workflow。
- 完成后,打开 deploy_to_github_pages job 显示的 URL。
- 该 workflow 也会从 Dockerfile 构建自定义 .ext2 磁盘镜像;可指向 dockerfiles/debian_mini 或其他 Dockerfile,并将结果发布为 GitHub Release 资产或部署 Pages。
- 注意:dockerfiles/debian_large 镜像太大,不适合 GitHub Pages。
- Claude AI 集成:
- 注册 Anthropic 账户并获取 API Key。
- 在 WebVM 页面悬停机器人图标,打开 Claude AI Integration 面板,可点击右上角固定按钮保持面板。
- 输入你的 Claude API Key 即可开始使用。例如提问:"Solve the CTF challenge at /home/user/chall1.bin. Note that the binary reads from stdin."
- API Key 仅存储在本地浏览器中,项目方无法访问。
- 常见问题:
- 默认用户有 root 权限,但未安装 sudo,可在 Dockerfile 中自行添加。
部分底层网络操作(如 ping 所需的 ICMP)不可用,连通性检查请使用 curl 或
wget。
- 可通过 Tailscale 集成访问私有网络;配置 exit node 可访问公共互联网。
- 可在 URL fragment 中传递 Tailscale auth key 或自定义控制服务器,例如:https://webvm.io/#authKey=<your-ephemeral-key>,多个参数用 & 分隔。