Wasmerを使ってサーバー上でWasmを動かしてみる
はじめに
本記事は、以下を試した結果のまとめです。
- Wasmerのインストール
- Wasmの実行
- Rustのインストール
- RustのサンプルプログラムをWasmモジュールにコンパイル
Wasmerとは
WebAssembly(wasm)をサーバー上で実行するためのランタイム
環境
- Ubuntu 22.04
- proxy環境
- Wamer 2.3.0
- rustc 1.64.0 (a55dd71d5 2022-09-19)
作業ログ
Wasmerのインストール
以下を参考に進める。
以下の前提条件がある。
- GLIBC: >= 2.27
- GLIBCXX: >= 3.4.21
確認する。
ubuntu@wasmer:~$ LIBC_PATH=$(gcc --print-file-name=libc.so.6)
Command 'gcc' not found, but can be installed with:
sudo apt install gcc
上記コマンドを実行するには、gccが必要とのこと。
aptのproxy設定
ubuntu@wasmer:~$ cat <<EOF | sudo tee /etc/apt/apt.conf.d/90proxy
> Acquire::http::Proxy "http://172.16.70.1:63128/";
> Acquire::https::Proxy "http://172.16.70.1:63128/";
> EOF
Acquire::http::Proxy "http://172.16.70.1:63128/";
Acquire::https::Proxy "http://172.16.70.1:63128/";
gccのインストール
ubuntu@wasmer:~$ sudo apt update
--- snip ---
ubuntu@wasmer:~$ sudo apt install gcc
--- snip ---
ubuntu@wasmer:~$ LIBC_PATH=$(gcc --print-file-name=libc.so.6)
ubuntu@wasmer:~$ strings $LIBC_PATH | grep -e '^GLIBC'
--- snip ---
GLIBC_2.27
GLIBC_2.28
GLIBC_2.29
GLIBC_2.30
GLIBC_2.31
GLIBC_2.32
GLIBC_2.33
GLIBC_2.34
GLIBC_2.35
GLIBC_PRIVATE
ubuntu@wasmer:~$ LIBCXX_PATH=$(gcc --print-file-name=libstdc++.so.6)
ubuntu@wasmer:~$ strings $LIBCXX_PATH | grep -e '^GLIBCXX'
--- snip ---
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
GLIBCXX_3.4.30
GLIBCXX_DEBUG_MESSAGE_LENGTH
ドキュメントに記載されているコマンドを実行して、wasmerをインストールする。
ubuntu@wasmer:~$ export https_proxy=http://172.16.70.1:63128
ubuntu@wasmer:~$ curl https://get.wasmer.io -sSfL | sh
Welcome to the Wasmer bash installer!
ww
wwwww
ww wwwwww w
wwwww wwwwwwwww
ww wwwwww w wwwwwww
wwwww wwwwwwwwww wwwww
wwwwww w wwwwwww wwwww
wwwwwwwwwwwwww wwwww wwwww
wwwwwwwwwwwwwww wwwww wwwww
wwwwwwwwwwwwwww wwwww wwwww
wwwwwwwwwwwwwww wwwww wwwww
wwwwwwwwwwwwwww wwwww wwww
wwwwwwwwwwwwwww wwwww
wwwwwwwwwwww wwww
wwwwwwww
wwww
downloading: wasmer-linux-amd64
Latest release: 2.3.0
Downloading archive from https://github.com/wasmerio/wasmer/releases/download/2.3.0/wasmer-linux-amd64.tar.gz
######################################################################## 100.0%
installing: /home/ubuntu/.wasmer
Updating bash profile /home/ubuntu/.bashrc
we've added the following to your /home/ubuntu/.bashrc
If you have a different profile please add the following:
# Wasmer
export WASMER_DIR="/home/ubuntu/.wasmer"
[ -s "$WASMER_DIR/wasmer.sh" ] && source "$WASMER_DIR/wasmer.sh"
/home/ubuntu/.wasmer/bin/wasmer: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
error: wasmer was installed, but doesn't seem to be working :(
check: installed successfully ✓
wasmer & wapm will be available the next time you open the terminal.
If you want to have the commands available now please execute:
source /home/ubuntu/.wasmer/wasmer.sh
downloading: wapm-cli-linux-amd64
Latest release: 0.5.6
Downloading archive from https://github.com/wasmerio/wapm-cli/releases/download/v0.5.6/wapm-cli-linux-amd64.tar.gz
######################################################################## 100.0%
installing: /home/ubuntu/.wasmer
途中でerrorが出たが、その後installed successfully
と表示されたのでインストールできたということにして先に進む。
ubuntu@wasmer:~$ wasmer -V
wasmer: command not found
コマンドがない?
ubuntu@wasmer:~$ ll .wasmer/bin/
total 84832
drwxr-xr-x 2 ubuntu ubuntu 4096 Apr 7 15:26 ./
drwxrwxr-x 5 ubuntu ubuntu 4096 May 27 08:22 ../
-rwxr-xr-x 1 ubuntu ubuntu 21846792 Apr 7 15:26 wapm*
-rwxr-xr-x 1 ubuntu ubuntu 63438232 Mar 16 01:48 wasmer*
-rwxr-xr-x 1 ubuntu ubuntu 1567144 Mar 16 01:48 wasmer-headless*
-rwxr-xr-x 1 ubuntu ubuntu 29 Apr 7 15:26 wax*
コマンドはあるからパスが通ってないようである。
ubuntu@wasmer:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
ubuntu@wasmer:~$ cat ~/.bashrc
--- snip ---
# Wasmer
export WASMER_DIR="/home/ubuntu/.wasmer"
[ -s "$WASMER_DIR/wasmer.sh" ] && source "$WASMER_DIR/wasmer.sh"
ubuntu@wasmer:~$ source ~/.bashrc
ubuntu@wasmer:~$ wasmer -V
wasmer: error while loading shared libraries: libxkbcommon.so.0: cannot open shared object file: No such file or directory
コマンドは実行できるようになったが、エラーが出た。
必要なライブラリがないっぽい。
ググったところ、issueが見つかった。
libxkbcommon-x11のパッケージをインストールすればいいようである。
ubuntu@wasmer:~$ apt search libxkbcommon-x11
Sorting... Done
Full Text Search... Done
libxkbcommon-x11-0/jammy 1.4.0-1 amd64
library to create keymaps with the XKB X11 protocol
libxkbcommon-x11-dev/jammy 1.4.0-1 amd64
library to create keymaps with the XKB X11 protocol - development files
ubuntu@wasmer:~$ sudo apt install libxkbcommon-x11-0
--- snip ---
ubuntu@wasmer:~$ wasmer -V
wasmer: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
別のライブラリも必要とのこと。
ubuntu@wasmer:~$ apt search libtinfo5
Sorting... Done
Full Text Search... Done
libtinfo5/jammy 6.3-2 amd64
shared low-level terminfo library (legacy version)
ubuntu@wasmer:~$ sudo apt install libtinfo5
--- snip ---
ubuntu@wasmer:~$ wasmer -V
wasmer 2.3.0
ようやくコマンドが使えるようになった!
Wasmの実行
軽量なjavascriptエンジンであるquickjsを動かしてみる。
wasmerにはwapm (WebAssembly Package Manager)というパッケージ管理のツールが用意されている。
このツールを使ってパッケージをインストールする。ubuntu@wasmer:~$ wapm install -g quickjs
[INFO] Installing saghul/quickjs@0.0.3
Global package installed successfully!
インストールしたモジュールを動かしてみる。
ubuntu@wasmer:~$ qjs
QuickJS - Type "\h" for help
qjs > [1, 2, 3, 4].map(x => x*x)
[1, 2, 3, 4].map(x => x*x)
[ 1, 4, 9, 16 ]
qjs >
Wasmモジュールの作成
wasmでは以下サイトに記載されているようにC/C++, Rustなど複数言語からコンパイルすることが可能。
今回はRustからコンパイルする。
Rustのインストール
rustupというインストーラーを使用する。
ubuntu@wasmer:~$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
--- snip ---
info: downloading installer
Welcome to Rust!
--- snip ---
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>1
--- snip ---
stable-x86_64-unknown-linux-gnu installed - rustc 1.64.0 (a55dd71d5 2022-09-19)
Rust is installed now. Great!
To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).
To configure your current shell, run:
source "$HOME/.cargo/env"
ubuntu@wasmer:~$ rustc --version
Command 'rustc' not found, but can be installed with:
sudo apt install rustc
ubuntu@wasmer:~$ source ~/.bashrc
ubuntu@wasmer:~$ rustc --version
rustc 1.64.0 (a55dd71d5 2022-09-19)
rustをインストールできたようである。
サンプルプログラムの作成
以下を参考に、helloworldのプログラムをつくる。
fn main() {
println!("Hello World!");
}
rustバイナリにコンパイル
wasmモジュールへのコンパイル前にrusuのバイナリにコンパイルしてみる。
ubuntu@wasmer:~$ rustc hello.rs
ubuntu@wasmer:~$ ll hello*
-rwxrwxr-x 1 ubuntu ubuntu 3886920 Oct 13 02:39 hello*
-rw-rw-r-- 1 ubuntu ubuntu 1089 Oct 13 02:39 hello.rs
ubuntu@wasmer:~$ ./hello
Hello World!
wasmモジュールにコンパイル
rustのコードをwasmモジュールにコンパイルするにはいくつかの方法があるようだが、今回は以下を参考にrustcを使った方法で試してみる。
ビルドターゲットの追加
ubuntu@wasmer:~$ rustup target add wasm32-wasi
info: downloading component 'rust-std' for 'wasm32-wasi'
info: installing component 'rust-std' for 'wasm32-wasi'
17.6 MiB / 17.6 MiB (100 %) 9.2 MiB/s in 1s ETA: 0s
ubuntu@wasmer:~$ rustup show
Default host: x86_64-unknown-linux-gnu
rustup home: /home/ubuntu/.rustup
installed targets for active toolchain
--------------------------------------
wasm32-wasi
x86_64-unknown-linux-gnu
active toolchain
----------------
stable-x86_64-unknown-linux-gnu (default)
rustc 1.64.0 (a55dd71d5 2022-09-19)
wasmモジュールにコンパイル
ubuntu@wasmer:~$ rustc hello.rs --target wasm32-wasi
ubuntu@wasmer:~$ ll hello*
-rwxrwxr-x 1 ubuntu ubuntu 3886920 Oct 13 02:44 hello*
-rw-rw-r-- 1 ubuntu ubuntu 45 Oct 13 02:44 hello.rs
-rwxrwxr-x 1 ubuntu ubuntu 2055066 Oct 13 05:08 hello.wasm*
wasmの実行
ubuntu@wasmer:~$ wasmer run hello.wasm
Hello World!
本記事の内容は以上です。
Discussion