今回の記事では64bit ARMプロセッサの上で x84_64 のバイナリを動作させることができる「box64」というソフトウェアを使用して、 本来 x86_64 でしか動作しないマインクラフト統合版のサーバー「Minecraft Bedrock Dedicated Server」を立ち上げてみます。
はじめに
「64bit ARM 4コア 24GB RAMのVMが無料!」
そんなニュースが出てから約半年が経過しようとしていますが、みなさん有効活用されてますでしょうか。グローバルIPがもらえることもあり、自分はVPNのサーバーとして使って自宅LANに入ったり自宅サーバーを公開したりするのに使っています(かなりオーバースペックだけど
久々にマインクラフトをやりたくなった!
どういうわけか最近、放置気味だったマインクラフトをやりたくなりました。以前も寒い時期にやっていた気がするし、冬ってマインクラフトをやりたくなる時期なんでしょうか(Log4jの脆弱性で取り沙汰されて目にしたからかもしれません)
我が家のマインクラフト環境は過去に記事にしたように、Intel CPUのノートパソコンに導入してConoHa上にwireguardで構築したVPNから公開して遊んでいました。
ちょっとやらなくなってしまってからはノートパソコンを電源いれっぱにして置いておくのもうるさかったので停止してしまい、 一緒に遊んでいた人も当然ログインできなくなってしまいました。
今回もノートパソコンで立ち上げてもよかったのですが、ほったらかしでも動作するようにクラウド上に上げてしまえー、ということでちょうど無料枠を持て余していたOracle Cloudにやってもらおうという魂胆でした。
ARMなCPUで実行する2つの方法
やり方としては2つあるかなと思います。
1. JAVA版マインクラフトのサーバを動作させる
本家マインクラフトはJavaで実装されているため、様々なプラットフォームで動作させることができます。Javaのランタイムが入っていさえすれば動作可能で、64bit ARMはスマートフォンで経験済みです。
Androidスマホでマイクラサーバー動いたわ。 pic.twitter.com/IzGO0GV4Bz
— おはよう君 (@ohayoyogi) 2021年2月2日
プラグインを導入することで、マインクラフト統合版からでも本家JAVAマインクラフトサーバーに接続して遊ぶことができます。
UserLAndで動かしたマイクラサーバーにアプリから入ってみた。なぜかLANゲームから入れる pic.twitter.com/4pvvLkgpFV
— おはよう君 (@ohayoyogi) 2021年2月2日
2. ARM CPU上でx86_64をエミュレートする
「QEMU」といったものを導入すればいろんなアーキテクチャ向けに作成されたソフトウェアを動作させることができることは知っていたのですが、最近「box86(box64)」というものが流行っているようで、巷では「Wine on Box64 on ARM64」という遊びが流行っているようです。
box86(box64) とは
低レイヤー全然わからないマンなので公式を見てください。
わからないなりにわかったことを書くと、ライブラリなど動的にリンクされるものについてはエミュレーションをせず、そのままネイティブにビルドされたライブラリを使用するのが特徴のようです(従来のエミュレータがどうなっているのかは知らないで言ってる)。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の導入
公式からサーバーのバイナリを落としてきて…(右側
展開して実行します
LD_LIBRARY_PATH=. ./bedrock_server
そして我が家!!(遠征して避難場所としてここ作った気がするんだけど、何やってたのか完全に忘れた…)
もうちっとだけ続くんじゃ
「ハイ、動きましためでたしめでたし」 という記事を書きたかったわけじゃないんだ…
実はこの内容、昨日の夜にbox64の解説 読んでて「あーもしかしてwrapper書けば動くんじゃね?」って思い立って実装したら動くようになったものでして… 昨日までは動きませんでした記事のはずだったんですよね。
それがなんと マージされてしまう という事態に。([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
あたりを追加していきます。
wrapperは GO
マクロを使用して GO(<関数名>, <関数の型>)
という形で列挙していきます。
例えば、 EVP_PKEY_verify_init
は int EVP_PKEY_verify_init(EVP_PKEY_CTX *);
なので、GO(EVP_PKEY_verify_init, iFp)
EVP_PKEY_verify
は int EVP_PKEY_verify(EVP_PKEY_CTX *, const unsigned char *, size_t, const unsigned char *, size_t);
なので、GO(EVP_PKEY_verify, iFppLpL)
といった感じです。
先頭の i
は戻り値が int型であること、 F
は関数であること。残りの文字は引数の型です。詳細は以下の公式のブログをどうぞ。
そんな感じで、出てくるエラーを片っ端から潰していったら動くようになりましたとさ、ちゃんちゃん。
終わりに
というわけで、今回の記事は「自分のリポジトリにあるオレオレbox64を使えばマイクラ統合版動かせるぜ」記事だったはずなんですが、 「box64でマイクラ統合版動くぜ」記事になりました。
ちなみに、個人的なオススメマイクラ統合版クライアントは「Kindle Fire HD10」+「DualShock 4」の組み合わせです。
みなさまもよきマイクラ統合版ライフを!