加载中...

基于 Rust 的 Wasm/Wasi 开发探索与实践(Linux开发环境)

基于 Rust 的 Wasm/Wasi 开发探索与实践(Linux开发环境)

一、Linux 镜像版本

CentOS-7-x86_64-DVD-2009.iso,Virtual Box 7.0

选择 GNOME Desktop 版本,

New Image

New Image

配置远程连接(可选),

nmtui

New Image

New Image

激活连接 enp0s3 ,查看 ip 地址,

New Image

绑定端口转发, 

New Image

通过 ssh 连接,

New Image

ftp 连接,

New Image

New Image

  1. # 也可以手动修改配置文件
  2. # cd /etc/sysconfig/network-scripts/
  3. # vim vi ifcfg-xxx
  4. # ONBOOT=yes 则会自动开启网络

二、安装Rust

  1. # 官网 https://www.rust-lang.org/
  2. curl --proto ''=https'' --tlsv1.2 -sSf https://sh.rustup.rs | sh

New Image

 输入 1 默认安装就好。

New Image

修改 Rust 镜像源,

  1. # $CARGO_HOME/.cargo/ 下创建 config.toml
  2. $ touch config.toml
  3. # 添加以下内容
  4. [source.crates-io]
  5. replace-with = ''ustc''
  6. [source.ustc]
  7. registry = "git://mirrors.ustc.edu.cn/crates.io-index"

New Image

三、更换软件源

  1. # 更换阿里源 https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b11e44Xyj
  2. # 备份
  3. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
  4. # 拉取源文件
  5. wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  6. # 生成缓存
  7. yum makecache

New Image

四、安装 WASMER

  1. # 官网 https://wasmer.io/
  2. # windows
  3. iwr https://win.wasmer.io -useb | iex
  4. # linux
  5. curl https://get.wasmer.io -sSfL | sh -s "v3.3.0"
  6. # 使用 cargo 安装
  7. # cargo install wasmer-cli

New Image

遇到问题:version ·CLIBC_2.29· not found

New Image

  1. 解决方案:升级glibc
  2. wget http://ftp.gnu.org/gnu/glibc/glibc-2.31.tar.gz
  3. tar -xf glibc-2.31.tar.gz
  4. cd glibc-2.31
  5. mkdir build
  6. cd build
  7. ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
  8. make -j 8 --jobserver-style=pipe
  9. make install
  10. strings /lib64/libc.so.6 | grep GLIBC
  11. make localedata/install-locales
  12. ldd --version

New Image

又遇到编译器版本过低问题,

New Image

只能先按照提示,把软件都安装升级一下;

New Image

在安装了 python3 、升级了 gmake 、gcc 之后,再执行安装,无报错,

  1. # 参考以下连接
  2. # GCC 升级 https://blog.csdn.net/carefree2005/article/details/117559312
  3. # MAKE 升级 https://blog.csdn.net/fengqiangname/article/details/121655919
  4. # GLIBCXX问题解决 https://blog.csdn.net/qq_22948593/article/details/110877000
  5. # 缺少libstdc++.so.6 库 https://blog.csdn.net/qianjiu520/article/details/129417730
  6. # Cannot open jobserver 解决 https://github.com/crosstool-ng/crosstool-ng/issues/1858

New Image

最终安装成功,

New Image

有时候GitHub连不上,多试几次就好了,wapm 可以不用安装, 

# 下载地址 https://github.com/wasmerio/wasmer/releases/download/v3.3.0/wasmer-linux-amd64.tar.gz

首次安装后,需要重开一个终端打开才生效,

wasmer

New Image

五、安装 Visual Studio Code

  1. # 官网 https://code.visualstudio.com/
  2. sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
  3. sudo sh -c ''echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo''
  4. yum check-update
  5. sudo yum install code

New Image

New Image

六、安装 wasm 编译环境

  1. # 新增 nightly 编译模式
  2. rustup default nightly

New Image

  1. # 新增编译目标
  2. rustup target add wasm32-unknown-unknown
  3. rustup target add wasm32-wasi

New Image

  1. # 安装 wasm 绑定
  2. cargo install wasm-pack
  3. # cargo install https

New Image

七、安装 Node.js

  1. # 下载
  2. wget https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-x64.tar.gz
  3. # 解压
  4. tar -zxvf node-v18.16.0-linux-x64.tar.gz
  5. # 新建安装目录
  6. sudo mkdir /usr/local/nodejs
  7. # 移动到 /usr/local/nodejs
  8. sudo mv node-v18.16.0-linux-x64/* /usr/local/nodejs
  9. # 建立软链接
  10. sudo ln -s /usr/local/nodejs/bin/node /usr/local/bin/node
  11. sudo ln -s /usr/local/nodejs/bin/npm /usr/local/bin/npm
  12. # 测试
  13. node -v
  14. npm -v
  15. # 安装 cnpm
  16. npm install -g cnpm --registry=https://registry.npm.taobao.org
  17. sudo ln -s /usr/local/nodejs/bin/cnpm /usr/local/bin/cnpm
  18. # 更换下载源
  19. npm config set registry http://registry.npm.taobao.org

New Image

八、安装脚手架 cargo-generate

  1. # 必须安装 openssl-devel
  2. sudo yum install -y openssl-devel
  3. # cargo-generate 用于快速生成 WASM 项目的脚手架(类似 create-react-app)
  4. cargo install cargo-generate

New Image

九、创建一个 WASM 项目 

  1. # 使用模板生成
  2. cargo generate --git https://github.com/rustwasm/wasm-pack-template
  3. # 打包
  4. wasm-pack build --target web

New Image

New Image

可以看到在 pkg 下生成了 wasm 文件和胶水 js 代码。

十、创建一个 Vue 项目

  1. # 使用 Vite
  2. cnpm create vite@latest

New Image

将 pkg 文件夹复制到前端项目根路径下,

[sam@localhost wasm-web-demo]$ cp -r ../wasm-demo/pkg/* pkg

 页面引用 wasm 文件,

  1. <script setup lang="ts">
  2. import { onMounted, ref } from ''vue''
  3. import init, { greet } from ''../../pkg/mydemo.js''
  4. defineProps<{ msg: string }>()
  5. const count = ref(0)
  6. onMounted(async () => {
  7. await init()
  8. greet()
  9. })
  1. # 开放端口
  2. sudo iptables -I INPUT -p tcp --dport 5500 -j ACCEPT
  3. sudo iptables -I INPUT -p tcp --dport 5173 -j ACCEPT
  4. iptables -L -n

New Image

十一、编译运行

  1. npm run build
  2. npm run dev

New Image

宿主主机访问,chrome,正常

New Image

Firefox,报错,低版本火狐浏览器不兼容正则表达式,

New Image

New Image

New Image

把  gs 改成 g 即可,

解决方案参考 https://blog.csdn.net/qq_33183172/article/details/127770780

或者选择升级火狐浏览器,

  1. # 下载
  2. waget https://download-ssl.firefox.com.cn/releases/firefox/113.0/zh-CN/Firefox-latest-x86_64.tar.bz2
  3. # 解压
  4. tar -xjvf Firefox-latest-x86_64.tar.bz2
  5. # 删除系统默认旧版本的 Firefox
  6. sudo rm -rf /usr/lib64/firefox
  7. # 将解压后的新版本 Firefox 移动到 /usr/lib64
  8. sudo mv firefox /usr/lib64
  9. # 创建一个新的软链接
  10. cd /usr/bin
  11. sudo rm firefox
  12. sudo ln -s /usr/lib64/firefox/firefox /usr/bin/firefox

New Image

New Image

New Image

十二、Rust + WASI【运行在浏览器之外】

  1. # 必须先添加 wasm32-wasi
  2. rustup target add wasm32-wasi
  3. # 使用 wasm 运行时 wasmer
  4. iwr https://win.wasmer.io -useb | iex
  5. # 创建项目
  6. cargo new wasi-demo
  7. # 编译
  8. cargo build --release --target wasm32-wasi
  9. # 运行
  10. wamser run

New Image

十三、通过 Wasmer 访问 OS 资源 

  1. use std::fs;
  2. use std::io::prelude::*;
  3. fn main() {
  4. let mut file = fs::File::create("/path/test.txt").unwrap();
  5. let mut array = String::new();
  6. array.push_str("你好,世界!");
  7. write!(file, "{}", array).unwrap();
  8. }

运行时,因为wamser相当于一个容器,容器内的路径要绑定映射到宿主主机的路径,才能访问到宿主主机的资源,

wasmer run -h

New Image

  1. # 编译
  2. cargo build --release --target wasm32-wasi
  3. # 运行
  4. wasmer run --mapdir /path:. target/wasm32-wasi/release/wasi-demo.wasm

New Image

十四、编译成二进制可执行文件 

New Image

  1. wasmer create-exe -o testexe target/wasm32-wasi/release/wasi-demo.wasm
  2. # wasmer 下载地址 https://github.com/wasmerio/wasmer/releases/download/v3.3.0/wasmer-linux-amd64.tar.gz

New Image

  1. # 遇到一个错误 error: cannot get prefix for atom wasi-demo
  2. # 在 issue 上找到解决方案 https://github.com/wasmerio/wasmer/issues/3834
  3. # 解决方案:需要将命名中的 - 改成 _
  4. mv target/wasm32-wasi/release/wasi-demo.wasm target/wasm32-wasi/release/wasi_demo.wasm
  5. # 如果遇到 fatal error: wasmer.h: No such file or directory ,则需要导入环境变量
  6. # export WASMER_DIR=/home/user/.local/share/wasmer/
  7. # 如果还是报 fatal error: wasmer.h: No such file or directory ,就把安装目录下的 include 文件夹所有文件复制到 /usr/include

New Image

New Image

可以看到,编译为可执行文件成功,

New Image

执行 testexe 成功!