毎年この時期になると Minecraft のアップデートがきてやりたくなるんですけど、
建てるサーバはどこがいいかなーと探していたら
Oracle Cloud Infrastructure (OCI) で AArch64 な 4 OCPU / 24GB RAM な VM が
Always Free で借りれるということで、試してみました。
OS は Ubuntu 22.04 LTS を使います。
まぁ、ただ建てるだけのエントリは他のかたも書いていたりしたので割愛して、
ハマったところだけ書いておきます。
https://ohayoyogi.hatenablog.com/entry/2021/12/13/231826
https://zenn.dev/fuyutsuki/articles/mcbe-adventcalendar-1221_fbe27c857a043c
https://qiita.com/sjchorcl/items/20f6741cc2090a1824c2
(ここらへんを参考にしました。ありがとうございます。)
まず、 Java Edition のサーバはとりあえずアーキテクチャ関係なく動くので、
今回は Bedrock Edition (統合版) のサーバを建ててみました。
Bedrock サーバは x86_64 向けのプログラムなので、もちろん ARM CPU では動きません。
というわけで、 Box64 というエミュレータを使ってみます。
https://github.com/ptitSeb/box64
インストールは簡単。
$ git clone https://github.com/ptitSeb/box64
$ cd box64/
$ mkdir build; cd build; cmake .. -DARM_DYNAREC=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo; make -j$(nproc)
$ sudo make install
$ sudo systemctl restart systemd-binfmt
これだけです。
で、 Bedrock サーバを Minecraft 公式から落としてきて、起動してみる。
$ LD_LIBRARY_PATH=. ./bedrock_server
Error initializing native libssl.so.1 (last dlerror is libssl.so.1.1: cannot open shared object file: No such file or directory)
Error loading needed lib libssl.so.1.1
Error loading one of needed lib
はい、エラーでました。あーあ。
Box64 は動的にリンクされるライブラリはネイティブで動かすっぽいんですが、
エラー内容から libssl.so.1.1
が見つからないようですね。
SSL のライブラリぐらいふつう入ってるやろ、と思うじゃないですか。
なんですけど、使っている OS が Ubuntu 22.04 LTS ということで
標準で OpenSSL 3.0 が入っています!
というわけで、 apt じゃ OpenSSL 1.1.1 が入らないので、ビルドしてインストールします。
$ wget https://www.openssl.org/source/openssl-1.1.1o.tar.gz
$ tar xvf openssl-1.1.1o.tar.gz
$ cd openssl-1.1.1o/
$ ./config --prefix=/opt/openssl-1.1.1
$ make
$ sudo make install
お好みで make test
をやってもいいのではないでしょうか。
インストールはできたけど、共有ライブラリにはなってないので、認識させます。
とりあえず確認してみる。
$ ldconfig -p | grep libssl
libssl3.so (libc6,AArch64) => /lib/aarch64-linux-gnu/libssl3.so
libssl.so.3 (libc6,AArch64) => /lib/aarch64-linux-gnu/libssl.so.3
libssl.so (libc6,AArch64) => /lib/aarch64-linux-gnu/libssl.so
やっぱない。というわけで設定します。
一応 make
前の config
で /opt/openssl-1.1.1
を指定したので、そこにあるはず。
$ sudo vi /etc/ld.so.conf
1 行目にパスを書いておきます。
/opt/openssl-1.1.1/lib
include /etc/ld.so.conf.d/*.conf
で、反映させます。
$ sudo ldconfig
もっかい確認してみます。
$ ldconfig -p | grep libssl
libssl3.so (libc6,AArch64) => /lib/aarch64-linux-gnu/libssl3.so
libssl.so.3 (libc6,AArch64) => /lib/aarch64-linux-gnu/libssl.so.3
libssl.so.1.1 (libc6,AArch64) => /opt/openssl-1.1.1/lib/libssl.so.1.1
libssl.so (libc6,AArch64) => /opt/openssl-1.1.1/lib/libssl.so
libssl.so (libc6,AArch64) => /lib/aarch64-linux-gnu/libssl.so
はい、認識されました。
改めてサーバを起動してみます。
$ LD_LIBRARY_PATH=. ./bedrock_server
Dynarec for ARM64, with extension: ASIMD AES CRC32 PMULL ATOMICS PageSize:4096
Box64 with Dynarec v0.1.9 f78c5a2 built on Jun 20 2022 14:23:18
Using default BOX64_LD_LIBRARY_PATH: ./:lib/:lib64/:x86_64/:bin64/:libs64/
Using default BOX64_PATH: ./:bin/
Counted 28 Env var
Looking for ./bedrock_server
Rename process to "bedrock_server"
Using native(wrapped) libnsl.so.1
Using native(wrapped) libssl.so.1
Using native(wrapped) libcrypto.so.1
Using native(wrapped) libdl.so.2
Using native(wrapped) librt.so.1
Using native(wrapped) libm.so.6
Using native(wrapped) libpthread.so.0
Using emulated /lib/x86_64-linux-gnu/libstdc++.so.6
Using emulated /lib/x86_64-linux-gnu/libgcc_s.so.1
Using native(wrapped) libc.so.6
Using native(wrapped) ld-linux-x86-64.so.2
NO LOG FILE! - setting up server logging...
[2022-06-24 12:19:34:000 INFO] Starting Server
動いた~!
というわけで、お疲れ様でした。と言いたいところなんですが。
クライアントから接続を試してみると…繋がらない!
OCI のコンソールからイングレス・ルールを確認してもばっちりポートは開いている。
(Minecraft Bedrock Edition は 19132/udp を使います。)
$ sudo ufw status
Status: inactive
うーん、なんで~?
ちょっと調べてみた結果、 Ubuntu 22.04 LTS だから完全に油断してたんですが、
OCI はデフォルトで iptables が設定されてるっぽい!
$ sudo iptables -L
確認してみると、ほとんどのポートが閉じてました。
なるほどね、開けます。
$ sudo iptables -I INPUT 5 -p udp --dport 19132 -j ACCEPT
$ sudo /etc/init.d/netfilter-persistent save
$ sudo /etc/init.d/netfilter-persistent reload
クライアントを立ち上げて…再度接続してみます。
…繋がった!
ありがとうございました!
というわけで、 OCI の AArch64 な環境で
Bedrock サーバを建てる際にハマったポイント 2 点でした。
もし誰かの参考になれば幸いです。
とここまで書いておいて余談なんですが…
Java Edition サーバ (PaperMC) + GeyserMC/Floodgate でクロスプレイにしたっていうね。
こっちのほうが色々楽!参考にしてください!