🙄

Wasmerを使ってサーバー上でWasmを動かしてみる

2022/10/13に公開

はじめに

本記事は、以下を試した結果のまとめです。

  • Wasmerのインストール
  • Wasmの実行
  • Rustのインストール
  • RustのサンプルプログラムをWasmモジュールにコンパイル

Wasmerとは

WebAssembly(wasm)をサーバー上で実行するためのランタイム
https://docs.wasmer.io/

環境

  • Ubuntu 22.04
  • proxy環境
  • Wamer 2.3.0
  • rustc 1.64.0 (a55dd71d5 2022-09-19)

作業ログ

Wasmerのインストール

以下を参考に進める。
https://docs.wasmer.io/ecosystem/wasmer/getting-started

以下の前提条件がある。

  • 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が見つかった。
https://github.com/kwhat/jnativehook/issues/152
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

別のライブラリも必要とのこと。
https://github.com/wasmerio/wasmer/issues/1651

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を動かしてみる。
https://wapm.io/_/quickjs#explore

wasmerにはwapm (WebAssembly Package Manager)というパッケージ管理のツールが用意されている。
https://wapm.io/
このツールを使ってパッケージをインストールする。

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など複数言語からコンパイルすることが可能。
https://webassembly.org/getting-started/developers-guide/

今回はRustからコンパイルする。

Rustのインストール

rustupというインストーラーを使用する。
https://github.com/rust-lang/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のプログラムをつくる。
https://doc.rust-jp.rs/rust-by-example-ja/hello.html

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を使った方法で試してみる。
https://zenn.dev/shinyay/articles/hello-rust-day020

ビルドターゲットの追加

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