TinyGo编译Go到Wasm后Wasmtime执行出现errno76目录访问错误排查
问题:WASI环境下读取已存在目录失败(errno 76)
问题详情
测试代码:
func main() { path, err := os.Getwd() log.Println(path, err) files, err := ioutil.ReadDir("/etc/dse") log.Println(files, err) }
编译命令:
tinygo build -target wasi -o list.wasm list.go
执行命令:
wasmtime list.wasm
执行输出:
2023/05/05 16:00:50 / <nil> 2023/05/05 16:00:50 [] open /etc/dse: errno 76
已知主机上/etc/dse目录实际存在且权限为777,询问错误原因及解决方法。
错误原因
WASI(WebAssembly System Interface)是沙箱化运行环境,默认不会将主机文件系统的任何目录暴露给Wasm实例。即使主机上/etc/dse存在,Wasm进程在沙箱内无法访问该路径,因此抛出errno 76(对应WASI的ERROR_NOENT,即文件/目录不存在)的错误。
解决方法
通过wasmtime的--dir参数,将主机上的目标目录挂载到Wasm实例的沙箱中,让实例可以访问该路径:
- 直接挂载
/etc/dse目录到实例的对应路径:wasmtime --dir /etc/dse list.wasm - 如果需要访问整个
/etc目录,可挂载整个目录:wasmtime --dir /etc list.wasm - 若需将主机目录映射到实例内的其他路径,可使用
源路径:目标路径的格式,例如:
此时Wasm实例访问wasmtime --dir /host/etc/dse:/etc/dse list.wasm/etc/dse时,实际对应主机的/host/etc/dse路径。
内容的提问来源于stack exchange,提问作者0x11111
相关产品推荐
相关产品推荐

