PocketMine-MPがraspberry piで動かないので、コンパイルしてみた

#初めに
子供がJava版マインクラフトからマインクラフトBEに乗り換えてしばらく経ち、サーバを立ち上げてほしいと言ってきました。BE向けのサーバはPocketMine-MPというオープンソースなのですが、Raspberry Pi 4で動かすのに少々手間がかかったので、メモを作りました。

#経緯
　まず、[PocketMine-MP公式](https://www.pocketmine.net/?lang=ja)ではLinuxがサポートされているといっております。そのなかの[インストールページ](https://pmmp.readthedocs.io/en/rtfd/installation/get-dot-pmmp-dot-io.html)に従ってやっても、スクリプトが途中終了して動作しません。（curlもwgetも同じ結果。あたりまえですが・・・）動いたとのページも引っ掛かりますが、その状態からは何もできません。ちなみにPC-Linuxからはさくっと動きます。これは64bit linuxといえどもarmは対応していないとの結論に至りました。
　次に[ラズパイ3で、MinecraftPEサーバ(arm64版Ubuntu 18.04 + DockerでPocketMine-MPを動かす)](https://qiita.com/mt08/items/0405840eaf642295e61d)というページに行き当たり、dockerをインストールして、やってみました。すると見事起動しました。しかし、以下のようなメッセージがでて、マインクラフトBEからはログインできません。どうやらバージョンがobsoleteのようです。

```
[06:22:03] [Server thread/WARNING]: ----- PocketMine-MP Auto Updater -----
[06:22:03] [Server thread/WARNING]: Your version of PocketMine-MP is out of date. Version 3.12.0 was released on Fri Apr 17 05:46:48 2020
[06:22:03] [Server thread/WARNING]: Details: https://jenkins.pmmp.io/job/PocketMine-MP/1793/
[06:22:03] [Server thread/WARNING]: Download: https://jenkins.pmmp.io/job/PocketMine-MP/1793//artifact/PocketMine-MP.phar
[06:22:03] [Server thread/WARNING]: ----- -------------------------- -----
[06:26:57] [Server thread/INFO]: [/192.168.XX.XX:56079] が 互換性のないプロトコ ルバージョンです（390） によってログアウトされました
```

でも、PocketMine-MPが動作していた前歴があるということと、動作したイメージがつかめたので、自分でコンパイルできないかと調べるとgitにソース(?)があったので、なんとか動かしたという次第です。

#前提システム

- Raspberry Pi 4 4GBモデル　（rpi 3でも動作確認済）
- SDカード 32GB　（16GBでもいいですが、OSに余裕持たせた）
- ubuntu server 20.04 64bit　（18.04でも動作確認）
- 有線LAN　（セットアップしていれば無線でもOKかと）

#インストール

まず、前提となるのは、64bit linuxであることです。今のところ、64bitカーネルはubuntuとarch linux(rpi3のみ)しかありません。raspbianやarch linux(rpi4)は4GB RAMをサポートしていますが、カーネルは32bitのようです。PocketMine-MPは64bit前提なので、rpi4ではubuntu一択となっております。（2020/5/1現在）
まずは準備体操。

```
$ sudo apt update
$ sudo apt upgrade
```

以下のモジュールをインストールします。

```
$ sudo apt install git cmake pkg-config autoconf automake m4 bison libtool libtool-bin
```

gitから環境をクローンします。

```
$ git clone --recursive https://github.com/pmmp/PocketMine-MP.git
```

コンパイルするディレクトリに移って、以下のオプションでコンパイルします。少々時間がかかります。20分くらい。ちなみに-sオプションは本来必要ないと思われるのですが、オプションが無いとコンパイル済のlibzipライブラリが無いと言われ落ちます。直接の解決方法はわかりませんでした。rpi3で行う場合は、-j4ではなく-j2の方が安全かもしれません。

```
$ cd PocketMine-MP/build/php/
$ ./compile.sh -t aarch64 -l -s -j4
```

コンパイルが成功すると、最後に以下のメッセージが出ます。

```
[PHP] checking... compiling... installing... generating php.ini... done!
[INFO] Cleaning up... done!
[PocketMine] You should start the server now using "./start.sh".
[PocketMine] If it doesn't work, please send the "install.log" file to the Bug Tracker.
```

次に自分のcomposerを作ります。（ここは本当に必要か不明）

```
$ curl -sS https://getcomposer.org/installer | ./bin/php7/bin/php
```

$ composer.pharを実行

```
$ ./composer.phar install
```

インストーラを動かします。-uをつけないと、コンパイルした結果が上書きされます。必ずつけてください。

```
$ ./installer.sh -c -u
```

実行結果が以下のようになればOKです。特に最後のeverything done!が無ければ、インストールは失敗しています。

```
[*] Retrieving latest build data for channel "stable"
[*] Found PocketMine-MP 3.12.0 (build 1793) for Minecraft: PE v1.14.60 (PHP 7.3)
[*] This stable build was released on Sat Apr 18 02:46:48 JST 2020
[-] This channel should have a signature, none found
[*] Installing/updating PocketMine-MP on directory ./
[1/3] Cleaning...
[2/3] Downloading PocketMine-MP phar... done!
[3/3] Skipping PHP recompilation due to user request
[*] Everything done! Run ./start.sh to start PocketMine-MP
```

これで実行可能となりました。
以下で起動してください。

```
$ ./start.sh
```

初回起動時はいろいろ聞かれます。最初はjpnを選択して、ライセンスにはyを選択して、あとは自分の好みでカスタマイズしてください。それが終わると以下のようなログが出力されます。マインクラフトBEからサーバが見えるようになっているはずです。
終了はctrl-Cです。

```
[01:51:42] [Server thread/INFO]: Loading resource packs...
[01:51:42] [Server thread/INFO]: ワールド「world」を準備しています
[01:51:42] [Server thread/INFO]: GS4 ステータスリスナーを開始しています
[01:51:42] [Server thread/INFO]: Query ポートを 19132 に設定しています
[01:51:42] [Server thread/INFO]: Query は 0.0.0.0:19132 で動作しています
[01:51:42] [Server thread/INFO]: デフォルトのゲームタイプ：サバイバルモード
[01:51:42] [Server thread/INFO]: If you find this project useful, please consider donating to support development: https://patreon.com/pocketminemp
[01:51:42] [Server thread/INFO]: 完了（2.624 秒）！ヘルプについては「help」また は「?」を入力してください
```

ついでなので、サービス化して常駐します。
pmmp.serviceを作成します。ここでは、ユーザ名：pi、PocketMine-MPディレクトリは、piのホームにある前提で書いてあります。パスは適宜自分の環境に直してください。

```[pmmp.service]
[Unit]
Description=PocketMine-MP_server
After=syslog.target network-online.target

[Service]
Type=simple
ExecStart=/home/pi/pocketmine/PocketMine-MP/build/php/start.sh
Restart=on-failure
RestartSec=10
KillMode=process
WorkingDirectory=/home/pi/pocketmine/PocketMine-MP/build/php

[Install]
WantedBy=multi-user.target
```

以下を実行します。

```
$ sudo cp pmmp.service /etc/systemd/system/
$ sudo systemctl start pmmp
$ sudo systemctl status pmmp
$ sudo systemctl enable pmmp
```

statusのところで、サービスがactiveになっていることを確認してください。

#最後に
raspberry piでのMinecraftBEサーバは、動かしてみると地形の生成など追いつかないところがありますが、常時動かしていても電気代が気にならないところが魅力です。ぜひ試してみてください。ただ、とりあえず動作する条件を出してみたというところなので、もし他に動作する条件等わかりましたら、お知らせください。