3个版本 (破坏性更新)
0.3.0 | 2023年5月23日 |
---|---|
0.2.0 | 2022年8月26日 |
0.1.1 | 2022年6月2日 |
#280 in WebAssembly
每月 23 次下载
145KB
3.5K SLoC
wasi-vfs
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_PATH
为 wasi-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-ld
和 wasi-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-linking 和 interface-types 被合并,并且 WASI 将采用无共享架构后,此项目将能够支持所有 WASI 应用程序。
依赖关系
~0.5–1MB
~15K SLoC