おは代々木ダイアリー

いろいろ試したメモを書きます

AArch64 な Oracle Cloud Infrastructure で Minecraft統合版サーバーを動かす!【box86/box64】

今回の記事では64bit ARMプロセッサの上で x84_64 のバイナリを動作させることができる「box64」というソフトウェアを使用して、 本来 x86_64 でしか動作しないマインクラフト統合版のサーバー「Minecraft Bedrock Dedicated Server」を立ち上げてみます。

はじめに

「64bit ARM 4コア 24GB RAMのVMが無料!」

そんなニュースが出てから約半年が経過しようとしていますが、みなさん有効活用されてますでしょうか。グローバルIPがもらえることもあり、自分はVPNのサーバーとして使って自宅LANに入ったり自宅サーバーを公開したりするのに使っています(かなりオーバースペックだけど

prtimes.jp

久々にマインクラフトをやりたくなった!

どういうわけか最近、放置気味だったマインクラフトをやりたくなりました。以前も寒い時期にやっていた気がするし、冬ってマインクラフトをやりたくなる時期なんでしょうか(Log4j脆弱性で取り沙汰されて目にしたからかもしれません)

我が家のマインクラフト環境は過去に記事にしたように、Intel CPUのノートパソコンに導入してConoHa上にwireguardで構築したVPNから公開して遊んでいました。

ohayoyogi.hatenablog.com

ちょっとやらなくなってしまってからはノートパソコンを電源いれっぱにして置いておくのもうるさかったので停止してしまい、 一緒に遊んでいた人も当然ログインできなくなってしまいました。

今回もノートパソコンで立ち上げてもよかったのですが、ほったらかしでも動作するようにクラウド上に上げてしまえー、ということでちょうど無料枠を持て余していたOracle Cloudにやってもらおうという魂胆でした。

ARMなCPUで実行する2つの方法

やり方としては2つあるかなと思います。

1. JAVA版マインクラフトのサーバを動作させる

本家マインクラフトはJavaで実装されているため、様々なプラットフォームで動作させることができます。Javaのランタイムが入っていさえすれば動作可能で、64bit ARMはスマートフォンで経験済みです。

プラグインを導入することで、マインクラフト統合版からでも本家JAVAマインクラフトサーバーに接続して遊ぶことができます。

2. ARM CPU上でx86_64をエミュレートする

QEMU」といったものを導入すればいろんなアーキテクチャ向けに作成されたソフトウェアを動作させることができることは知っていたのですが、最近「box86(box64)」というものが流行っているようで、巷では「Wine on Box64 on ARM64」という遊びが流行っているようです。

box86(box64) とは

低レイヤー全然わからないマンなので公式を見てください。

box86.org

わからないなりにわかったことを書くと、ライブラリなど動的にリンクされるものについてはエミュレーションをせず、そのままネイティブにビルドされたライブラリを使用するのが特徴のようです(従来のエミュレータがどうなっているのかは知らないで言ってる)。32bit版が box86 で 64bit版が box64 と考えればよさそう。

box64 の導入

導入するのはARM64環境なので box64 を導入していきます。

box64/COMPILE.md at main · ptitSeb/box64 · GitHub

git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DRPI4ARM64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4
sudo make install
sudo systemctl restart systemd-binfmt

なんか深夜だったので適当にRaspberry Pi 4の手順たどってしまったが本来はこれ を辿るべきだったのかも。

まぁでもうごいた(おい

Bedrockの導入

公式からサーバーのバイナリを落としてきて…(右側

www.minecraft.net

展開して実行します

LD_LIBRARY_PATH=. ./bedrock_server

f:id:ohayoyogi:20211213223557p:plain
動きます

f:id:ohayoyogi:20211213223737p:plain
我が家!

そして我が家!!(遠征して避難場所としてここ作った気がするんだけど、何やってたのか完全に忘れた…)

もうちっとだけ続くんじゃ

「ハイ、動きましためでたしめでたし」 という記事を書きたかったわけじゃないんだ…

実はこの内容、昨日の夜にbox64の解説 読んでて「あーもしかしてwrapper書けば動くんじゃね?」って思い立って実装したら動くようになったものでして… 昨日までは動きませんでした記事のはずだったんですよね。

github.com

それがなんと マージされてしまう という事態に。([WIP]のつもりだったのにw)

というわけで、mainブランチをビルドして導入するとBedrockサーバーが動くARM64環境が手に入ります。

ちょっと解説

昨日までのビルドでは この人と同じエラーが出ていました。

Trying to run the bedrock official server, newbie here · Issue #138 · ptitSeb/box64 · GitHub

Error: PltResolver: Symbol EVP_PKEY_verify_init(ver 2: EVP_PKEY_verify_init@OPENSSL_1_1_0) not found, cannot apply R_X86_64_JUMP_SLOT 0x510a8b0 (0x40c936) in ./bedrock_server

EVP_PKEY_verify_init を参照しようとして見つけられなかった的なエラーです。EVP_PKEY_verify_init とは何ぞや?ということで調べてみると、どうもlibsslがらみっぽいぞ?というところがわかってきました。

https://www.openssl.org/docs/man1.1.1/man3/EVP_PKEY_verify_init.html

で、コミットログを見てみると他にもライブラリを導入しているっぽいコミット があり、これを参考に実装すればあわよくば動くようになるんじゃね?と思って解説記事を読んだ、というわけです。

wrapperを作ろう

前の説明で、「box64ではネイティブにビルドされたライブラリを使用している」という説明をしましたが、それを実現するのが wrapper です。

libssl周りのwrapperは wrappedcrypto_private.h あたりに定義があります。一部はすでに定義されているようでしたので、今回足りないと出た EVP_PKEY_verify_init あたりを追加していきます。

f:id:ohayoyogi:20211213225659p:plain
EVP_PKEY_verify_init定義

wrapperは GOマクロを使用して GO(<関数名>, <関数の型>) という形で列挙していきます。

例えば、 EVP_PKEY_verify_initint EVP_PKEY_verify_init(EVP_PKEY_CTX *); なので、GO(EVP_PKEY_verify_init, iFp) EVP_PKEY_verifyint EVP_PKEY_verify(EVP_PKEY_CTX *, const unsigned char *, size_t, const unsigned char *, size_t); なので、GO(EVP_PKEY_verify, iFppLpL) といった感じです。

先頭の i は戻り値が int型であること、 F は関数であること。残りの文字は引数の型です。詳細は以下の公式のブログをどうぞ。

box86.org

そんな感じで、出てくるエラーを片っ端から潰していったら動くようになりましたとさ、ちゃんちゃん。

終わりに

というわけで、今回の記事は「自分のリポジトリにあるオレオレbox64を使えばマイクラ統合版動かせるぜ」記事だったはずなんですが、 「box64でマイクラ統合版動くぜ」記事になりました。

ちなみに、個人的なオススメマイクラ統合版クライアントは「Kindle Fire HD10」+「DualShock 4」の組み合わせです。

みなさまもよきマイクラ統合版ライフを!