3个版本 (破坏性更新)

0.3.0 2023年5月23日
0.2.0 2022年8月26日
0.1.1 2022年6月2日

#280 in WebAssembly

每月 23 次下载

Apache-2.0 WITH LLVM-exception

145KB
3.5K SLoC

Rust 3K SLoC // 0.0% comments • Rust 包仓库 C 478 SLoC // 0.1% comments • Rust 包仓库 Shell 35 SLoC • Rust 包仓库 Ruby 17 SLoC • Rust 包仓库

wasi-vfs

Crates.io

WASI的虚拟文件系统层。

注意:此项目目前仅支持基于 wasi-libc 的WASI应用程序

此项目为WASI提供了一种语言和宿主无关的虚拟文件系统层。

支持的文件系统

  • 嵌入式文件系统:嵌入在.wasm二进制文件中的只读文件系统。
  • 待实现...

安装

二进制文件

从发布二进制文件进行典型安装可能如下所示

$ export WASI_VFS_VERSION=0.3.0

# For x86_64 Linux host machine
$ curl -LO "https://github.com/kateinoigakukun/wasi-vfs/releases/download/v${WASI_VFS_VERSION}/wasi-vfs-cli-x86_64-unknown-linux-gnu.zip"
$ unzip wasi-vfs-cli-x86_64-unknown-linux-gnu.zip

# For x86_64 macOS host machine
$ curl -LO "https://github.com/kateinoigakukun/wasi-vfs/releases/download/v${WASI_VFS_VERSION}/wasi-vfs-cli-x86_64-apple-darwin.zip"
$ unzip wasi-vfs-cli-x86_64-apple-darwin.zip

# For arm64 macOS host machine
$ curl -LO "https://github.com/kateinoigakukun/wasi-vfs/releases/download/v${WASI_VFS_VERSION}/wasi-vfs-cli-aarch64-apple-darwin.zip"
$ unzip wasi-vfs-cli-aarch64-apple-darwin.zip

# See release page for more platforms: https://github.com/kateinoigakukun/wasi-vfs/releases

$ mv wasi-vfs /usr/local/bin/wasi-vfs

Homebrew

$ brew tap kateinoigakukun/wasi-vfs https://github.com/kateinoigakukun/wasi-vfs.git
$ brew install kateinoigakukun/wasi-vfs/wasi-vfs

构建

要构建该项目,您需要安装版本14.0或更高版本的wasi-sdk

$ git clone https://github.com/kateinoigakukun/wasi-vfs.git --recurse-submodules
$ cd wasi-vfs
$ export WASI_VERSION=14
$ export WASI_VERSION_FULL=${WASI_VERSION}.0

# For x86_64 Linux host machine
$ curl -LO https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_VERSION}/wasi-sdk-${WASI_VERSION_FULL}-linux.tar.gz
$ tar xvf wasi-sdk-${WASI_VERSION_FULL}-linux.tar.gz

# For x86_64 and arm64 macOS host machine (since wasi-sdk doesn't provide prebuilt binaries for M1, so use x64 binaries on Rosetta)
$ curl -LO https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_VERSION}/wasi-sdk-${WASI_VERSION_FULL}-macos.tar.gz
$ tar xvf wasi-sdk-${WASI_VERSION_FULL}-macos.tar.gz

$ export WASI_SDK_PATH=$PWD/wasi-sdk-${WASI_VERSION_FULL}
$ cargo build --target wasm32-unknown-unknown

演示

先决条件

设置环境变量 $WASI_SDK_PATHwasi-sdk (版本14或更高) 的路径。

构建和运行WASI应用程序

$ git clone https://github.com/kateinoigakukun/wasi-vfs.git --recurse-submodules
$ cd wasi-vfs

# Build libwasi_vfs.a
$ cargo build --target wasm32-unknown-unknown

# Build a WASI app with libwasi_vfs.a
$ $WASI_SDK_PATH/bin/clang -target wasm32-unknown-wasi -o getline.wasm examples/getline.c ./target/wasm32-unknown-unknown/debug/libwasi_vfs.a

# Run the WASI app with --mapdir
$ wasmtime run --mapdir /::./examples/mnt getline.wasm -- /hello.txt
Hello

# Pack ./examples/mnt directory into a WASM binary
$ cargo run -p wasi-vfs-cli -- pack getline.wasm --mapdir /::./examples/mnt -o getline.packed.wasm

# Run the WASM binary again without --mapdir
$ wasmtime run getline.packed.wasm -- /hello.txt
Hello

测试

单元测试

$ CARGO_TARGET_WASM32_WASI_RUNNER=wasmtime cargo test --target wasm32-wasi

端到端测试

$ cargo build --target wasm32-unknown-unknown
$ LIB_WASI_VFS_A=$PWD/target/wasm32-unknown-unknown/debug/libwasi_vfs.a ./tools/run-make-test.sh

它是如何工作的?

wasi- 命令是 wizer 的包装器,它是一个Wasm应用程序的预初始化器。初始化过程扫描映射的目录,然后将它们复制到内存中的虚拟文件系统中。

限制

目前,由于以下原因,此项目仅支持基于wasi-libc的WASI应用程序

此项目依赖于 wasm-ldwasi-libc 的导入符号行为。 wasi-libc 声明了一些外部符号,如下所示以在 C 中导入 WASI 函数。当 __imported_wasi_snapshot_preview1_fd_read 在任何输入对象文件中没有定义时,wasm-ld 生成一个 (导入 "wasi_snapshot_preview1" "fd_read") 条目。这就是 wasi-libc 调用 WASI 函数的方式。

int32_t __imported_wasi_snapshot_preview1_fd_read(int32_t arg0, int32_t arg1, int32_t arg2, int32_t arg3) __attribute__((
    __import_module__("wasi_snapshot_preview1"),
    __import_name__("fd_read")
));

此项目通过在 libwasi_vfs.a 中定义这些外部符号来利用它们以挂钩 WASI 函数调用。如果这些符号被定义,wasm-ld 不会生成导入条目,它将正常链接符号。

因此,此项目目前不支持直接调用 WASI 函数而不使用 wasi-libc 的 Rust 应用程序。

module-linkinginterface-types 被合并,并且 WASI 将采用无共享架构后,此项目将能够支持所有 WASI 应用程序。

依赖关系

~0.5–1MB
~15K SLoC