WebVM:无需后端服务器直接在浏览器中实现的无服务器环境


我们创建了一个无服务器的虚拟 Linux 环境,在浏览器中运行未经修改的 Debian 二进制文件。这由 WebAssembly 虚拟化平台 CheerpX 提供支持。
WebAssembly 为浏览器世界带来了真正的创新,以及视角和责任的转变。
我们相信 JIT编译的 WebAssembly 是实现在浏览器中运行任何应用程序愿景的真正关键。
们的使命是让现有应用程序能够运行:

  • 无需修改;
  • 无需重新编译;
  • 完全客户端。

几个月前,我们发布了REPL 演示,证明我们的 CheerpX x86-to-WebAssembly 虚拟化技术可用于在浏览器中运行多个不同的 REPL,而无需任何特定于语言的干预。
今天,我们自豪地宣布朝着实现我们的愿景迈出了重要一步:WebVM,一个在浏览器中运行的基于 Debian 的完整虚拟机,由 CheerpX 提供支持。
 
什么是 CheerpX?
CheerpX是一个 x86 虚拟机,用 C++ 编写,并通过Cheerp编译器编译为 JavaScript 和 WebAssembly 的组合。
CheerpX 已经开发了三年多,它已经作为CheerpX for Flash的一部分在生产中使用,这是一种运行旧版 Adob​​e Flash 内容的企业解决方案。
在高层次上,CheerpX 由
  • 一种高效的 x86 解释器,用于运行很少执行的代码并发现热代码的结构,以指导 JIT 编译
  • 一个复杂的 x86-to-Wasm JIT 编译器,可以从热 x86 代码动态生成新的 WebAssembly 模块。尽管 JIT 编译器有一些 x86 专用逻辑,但它大多与目标无关。
  • Linux 系统调用仿真层用于弥合未修改的 x86 二进制文件和 Web 环境之间的差距。
  • 一个基于块的文件系统后端,基于 Ext2。磁盘映像是通过 HTTP 和 CloudFlare CDN 分发的静态资源。选择 Ext2 是因为它经过验证的设计和可扩展性,我们可以随着时间的推移轻松扩展其功能,以兼容更现代的 Ext3 和 Ext4 格式,而无需完全重写。
  • 基于 IndexedDB的修改块的隐私保护存储。这种仅限客户端的技术允许对文件系统所做的任何修改都是持久的,但仅限于浏览器。我们不会看到或存储您的任何数据。

CheerpX 是一个非常复杂的系统,具有许多活动部件。它可以正确处理棘手的情况,例如自修改代码、多线程、多处理和进程间通信。尽管有这种复杂性,CheerpX 已经达到了高度的稳定性。
现在感觉是发布我们迄今为止最复杂的演示的最佳时机:WebVM。
 
什么是 WebVM?
如果您看过我们之前的 REPL 演示,您可能会注意到 WebVM 在概念上并没有太大的不同。使用相同的核心组件:
  • CheerpX作为执行引擎。JavaScript API,尤其是 cx.run(…),用于启动(并在需要时重新启动)bash进程。然后 bash 可以在用户键入命令时启动其他进程。
  • Xterm.js作为主要的 UI 组件。Xterm.js 负责解释vim 等应用程序使用的终端转义,并将用户输入发送回 CheerpX。输入通过应用程序的标准输入文件描述符提供给应用程序。
  • 一个 Debian buster 磁盘映像,采用 ext2 格式并安装了一堆软件包。这分布在 CDN 上,以最大限度地提高可扩展性。

WebVM 实际上是无服务器的,并且没有活动的服务器端组件。所有用户都从 CDN 访问同一个磁盘映像,他们的个人更改被本地保存到浏览器。这意味着我们可以以最少的成本和资源支持甚至数百万并发用户。