お金をかけずにサーバーの勉強をしよう

ラズパイにマインクラフトサーバーをやらせる

2022年11月5日

メニューへ戻る

こんにちは。

Raspberry Pi リブート」でラズパイを生き返らせましたので何かサーバーをやらせようと思い、とりあえず前から気になっていたマインクラフトサーバーをやらせてみることにします。

ラズパイに Raspbianという OSが入っていた頃、マインクラフトが入っていたんですよね。

それで「これでマイクラできるならライセンス買わないでラズパイ買った方がお得だよな!」って思って、ラズパイで初めてマイクラに触れたんですけど、いつまで経ってもゾンビとか出てこないしワールドもひどく狭いんですよ。

それで調べてみたら、制限版というか Pythonでコードを書くとマイクラの作業を自動化できる…というものだったかと思います。

その後 Java版のマイクラにお布施しました。


マインクラフトサーバーは Javaが動く環境で稼働させられて、ゲームのライセンスは必要ないようです。

以下からダウンロードができます。
Minecraft: Java Editionのサーバーをダウンロードします

2022年11月4日時点での最新バージョンは 1.19.2 です。
そのため、ダウンロードする対象のリンクは「minecraft_server.1.19.2.jar」となっています。

ダウンロードが完了すると、server.jar というファイルができました。

ラズパイにやらせると遅そうだったので、Lubuntuでダウンロードしてから、scpでラズパイに持っていきました。


インストール方法は以下に書かれています。
Tutorials/Setting up a server

私は大してマインクラフトのゲームの環境について詳しくなく、modを使ったサーバーに遊びにいったりはしませんでしたので、そもそも modをどこから入手するのかも知りませんで、ここではあくまでバニラ(ノーマルのやつ)の環境を作るだけにします。

親子でマルチユーザープレイができれば良いなと。

なので今は気も早りますし、ろくすっぽインストールの方法を読まずにとりあえず動かしてみようって感じで進めます。


まずは前提になる javaが Raspberry Pi OS にデフォルトでインストールされているかを確認します。

subro@raspberrypi:~ $ java -version
openjdk version "17.0.4" 2022-07-19
OpenJDK Runtime Environment (build 17.0.4+8-Raspbian-1deb11u1rpt1)
OpenJDK Client VM (build 17.0.4+8-Raspbian-1deb11u1rpt1, mixed mode, emulated-client)

Open JDK 17が入っていました。
インストールの手間が省けました。

先程ダウンロードしたファイルは、subroユーザーのホームディレクトリに minecraftディクトリを作ってそこに置いてあります。

subro@raspberrypi:~/minecraft $ ls -l
合計 44544
-rw-r--r-- 1 subro subro 45609512 11月  4 12:49 server.jar

ダウンロードページに実行時のコマンドが書いてあるので、そのまんまやってみます。
実行対象のファイル名が server.jar のままやっています。
1GBしかメモリがないマシンで1GBの割り当てをしていますが、どうなることやら。

subro@raspberrypi:~/minecraft $ java -Xmx1024M -Xms1024M -jar server.jar nogui
Unpacking 1.19.2/server-1.19.2.jar (versions:1.19.2) to versions/1.19.2/server-1.19.2.jar
Unpacking com/github/oshi/oshi-core/5.8.5/oshi-core-5.8.5.jar (libraries:com.github.oshi:oshi-core:5.8.5) to libraries/com/github/oshi/oshi-core/5.8.5/oshi-core-5.8.5.jar
Unpacking com/google/code/gson/gson/2.8.9/gson-2.8.9.jar (libraries:com.google.code.gson:gson:2.8.9) to libraries/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar
Unpacking com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar (libraries:com.google.guava:failureaccess:1.0.1) to libraries/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar
Unpacking com/google/guava/guava/31.0.1-jre/guava-31.0.1-jre.jar (libraries:com.google.guava:guava:31.0.1-jre) to libraries/com/google/guava/guava/31.0.1-jre/guava-31.0.1-jre.jar
Unpacking com/mojang/authlib/3.11.49/authlib-3.11.49.jar (libraries:com.mojang:authlib:3.11.49) to libraries/com/mojang/authlib/3.11.49/authlib-3.11.49.jar
Unpacking com/mojang/brigadier/1.0.18/brigadier-1.0.18.jar (libraries:com.mojang:brigadier:1.0.18) to libraries/com/mojang/brigadier/1.0.18/brigadier-1.0.18.jar
Unpacking com/mojang/datafixerupper/5.0.28/datafixerupper-5.0.28.jar (libraries:com.mojang:datafixerupper:5.0.28) to libraries/com/mojang/datafixerupper/5.0.28/datafixerupper-5.0.28.jar
Unpacking com/mojang/javabridge/1.2.24/javabridge-1.2.24.jar (libraries:com.mojang:javabridge:1.2.24) to libraries/com/mojang/javabridge/1.2.24/javabridge-1.2.24.jar
Unpacking com/mojang/logging/1.0.0/logging-1.0.0.jar (libraries:com.mojang:logging:1.0.0) to libraries/com/mojang/logging/1.0.0/logging-1.0.0.jar
Unpacking commons-io/commons-io/2.11.0/commons-io-2.11.0.jar (libraries:commons-io:commons-io:2.11.0) to libraries/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar
Unpacking io/netty/netty-buffer/4.1.77.Final/netty-buffer-4.1.77.Final.jar (libraries:io.netty:netty-buffer:4.1.77.Final) to libraries/io/netty/netty-buffer/4.1.77.Final/netty-buffer-4.1.77.Final.jar
Unpacking io/netty/netty-codec/4.1.77.Final/netty-codec-4.1.77.Final.jar (libraries:io.netty:netty-codec:4.1.77.Final) to libraries/io/netty/netty-codec/4.1.77.Final/netty-codec-4.1.77.Final.jar
Unpacking io/netty/netty-common/4.1.77.Final/netty-common-4.1.77.Final.jar (libraries:io.netty:netty-common:4.1.77.Final) to libraries/io/netty/netty-common/4.1.77.Final/netty-common-4.1.77.Final.jar
Unpacking io/netty/netty-handler/4.1.77.Final/netty-handler-4.1.77.Final.jar (libraries:io.netty:netty-handler:4.1.77.Final) to libraries/io/netty/netty-handler/4.1.77.Final/netty-handler-4.1.77.Final.jar
Unpacking io/netty/netty-resolver/4.1.77.Final/netty-resolver-4.1.77.Final.jar (libraries:io.netty:netty-resolver:4.1.77.Final) to libraries/io/netty/netty-resolver/4.1.77.Final/netty-resolver-4.1.77.Final.jar
Unpacking io/netty/netty-transport/4.1.77.Final/netty-transport-4.1.77.Final.jar (libraries:io.netty:netty-transport:4.1.77.Final) to libraries/io/netty/netty-transport/4.1.77.Final/netty-transport-4.1.77.Final.jar
Unpacking io/netty/netty-transport-classes-epoll/4.1.77.Final/netty-transport-classes-epoll-4.1.77.Final.jar (libraries:io.netty:netty-transport-classes-epoll:4.1.77.Final) to libraries/io/netty/netty-transport-classes-epoll/4.1.77.Final/netty-transport-classes-epoll-4.1.77.Final.jar
Unpacking io/netty/netty-transport-native-epoll/4.1.77.Final/netty-transport-native-epoll-4.1.77.Final-linux-x86_64.jar (libraries:io.netty:netty-transport-native-epoll:4.1.77.Final:linux-x86_64) to libraries/io/netty/netty-transport-native-epoll/4.1.77.Final/netty-transport-native-epoll-4.1.77.Final-linux-x86_64.jar
Unpacking io/netty/netty-transport-native-epoll/4.1.77.Final/netty-transport-native-epoll-4.1.77.Final-linux-aarch_64.jar (libraries:io.netty:netty-transport-native-epoll:4.1.77.Final:linux-aarch_64) to libraries/io/netty/netty-transport-native-epoll/4.1.77.Final/netty-transport-native-epoll-4.1.77.Final-linux-aarch_64.jar
Unpacking io/netty/netty-transport-native-unix-common/4.1.77.Final/netty-transport-native-unix-common-4.1.77.Final.jar (libraries:io.netty:netty-transport-native-unix-common:4.1.77.Final) to libraries/io/netty/netty-transport-native-unix-common/4.1.77.Final/netty-transport-native-unix-common-4.1.77.Final.jar
Unpacking it/unimi/dsi/fastutil/8.5.6/fastutil-8.5.6.jar (libraries:it.unimi.dsi:fastutil:8.5.6) to libraries/it/unimi/dsi/fastutil/8.5.6/fastutil-8.5.6.jar
Unpacking net/java/dev/jna/jna/5.10.0/jna-5.10.0.jar (libraries:net.java.dev.jna:jna:5.10.0) to libraries/net/java/dev/jna/jna/5.10.0/jna-5.10.0.jar
Unpacking net/java/dev/jna/jna-platform/5.10.0/jna-platform-5.10.0.jar (libraries:net.java.dev.jna:jna-platform:5.10.0) to libraries/net/java/dev/jna/jna-platform/5.10.0/jna-platform-5.10.0.jar
Unpacking net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar (libraries:net.sf.jopt-simple:jopt-simple:5.0.4) to libraries/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar
Unpacking org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar (libraries:org.apache.commons:commons-lang3:3.12.0) to libraries/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar
Unpacking org/apache/logging/log4j/log4j-api/2.17.0/log4j-api-2.17.0.jar (libraries:org.apache.logging.log4j:log4j-api:2.17.0) to libraries/org/apache/logging/log4j/log4j-api/2.17.0/log4j-api-2.17.0.jar
Unpacking org/apache/logging/log4j/log4j-core/2.17.0/log4j-core-2.17.0.jar (libraries:org.apache.logging.log4j:log4j-core:2.17.0) to libraries/org/apache/logging/log4j/log4j-core/2.17.0/log4j-core-2.17.0.jar
Unpacking org/apache/logging/log4j/log4j-slf4j18-impl/2.17.0/log4j-slf4j18-impl-2.17.0.jar (libraries:org.apache.logging.log4j:log4j-slf4j18-impl:2.17.0) to libraries/org/apache/logging/log4j/log4j-slf4j18-impl/2.17.0/log4j-slf4j18-impl-2.17.0.jar
Unpacking org/slf4j/slf4j-api/1.8.0-beta4/slf4j-api-1.8.0-beta4.jar (libraries:org.slf4j:slf4j-api:1.8.0-beta4) to libraries/org/slf4j/slf4j-api/1.8.0-beta4/slf4j-api-1.8.0-beta4.jar
Starting net.minecraft.server.Main
[21:29:06] [ServerMain/INFO]: Building unoptimized datafixer
[21:29:21] [ServerMain/ERROR]: Failed to load properties from file: server.properties
[21:29:21] [ServerMain/WARN]: Failed to load eula.txt
[21:29:21] [ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info

どんなもんか全部載せてみました。
途中で何やら展開している模様。

結果ディレクトリの中はこんな風に。

subro@raspberrypi:~/minecraft $ ls -l
合計 44564
-rw-r--r-- 1 subro subro      158 11月  4 21:29 eula.txt
drwxr-xr-x 8 subro subro     4096 11月  4 21:28 libraries
drwxr-xr-x 2 subro subro     4096 11月  4 21:28 logs
-rw-r--r-- 1 subro subro 45609512 11月  4 12:49 server.jar
-rw-r--r-- 1 subro subro     1238 11月  4 21:29 server.properties
drwxr-xr-x 3 subro subro     4096 11月  4 21:28 versions

最後がエラーで終わっています。
eula.txt ファイルを見ろとありますので、見てみます。
(そういやできています)

subro@raspberrypi:~/minecraft $ cat eula.txt
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).
#Fri Nov 04 21:29:21 JST 2022
eula=false

ファイルには https://aka.ms/MinecraftEULA という URLがありますが、実際にアクセスしたらば、上のリンクと同じところにリダイレクトされました。

ダウンロードサイトに、サーバーを稼働させるには以下2つに同意する必要があるとありました。

EULA(End User License Agreement)というのは前者のことで、EULAに同意するなら、eula.txt をこう直せということのようです。

eula=false
 ↓
eula=true

ファイルを直して、改めて実行してみました。

subro@raspberrypi:~/minecraft $ java -Xmx1024M -Xms1024M -jar server.jar nogui
Starting net.minecraft.server.Main
[21:47:07] [ServerMain/INFO]: Building unoptimized datafixer
[21:47:21] [ServerMain/INFO]: Environment: authHost='https://authserver.mojang.com', accountsHost='https://api.mojang.com', sessionHost='https://sessionserver.mojang.com', servicesHost='https://api.minecraftservices.com', name='PROD'
[21:47:43] [ServerMain/INFO]: Loaded 7 recipes
[21:47:45] [ServerMain/INFO]: Loaded 1179 advancements
[21:47:58] [Server thread/INFO]: Starting minecraft server version 1.19.2
[21:47:58] [Server thread/INFO]: Loading properties
[21:47:58] [Server thread/INFO]: Default game type: SURVIVAL
[21:47:58] [Server thread/INFO]: Generating keypair
[21:48:02] [Server thread/INFO]: Starting Minecraft server on *:25565
[21:48:02] [Server thread/INFO]: Using default channel type
[21:48:03] [Server thread/INFO]: Preparing level "world"
[21:57:51] [Server thread/INFO]: Preparing start region for dimension minecraft:overworld
[21:58:06] [Worker-Main-3/INFO]: Preparing spawn area: 0%
[21:58:06] [Worker-Main-3/INFO]: Preparing spawn area: 0%
[21:58:06] [Worker-Main-1/INFO]: Preparing spawn area: 0%
[21:58:06] [Worker-Main-1/INFO]: Preparing spawn area: 0%

〜〜〜 以降延々と続く 〜〜〜

さっきと違っていかにも動いていそうです。


マインクラフトを立ち上げます。

お馴染みの画面で、マルチプレイを押します。
マインクラフトのローカルサーバーにアクセス 1

サーバーを追加を押します。
マインクラフトのローカルサーバーにアクセス 2

[サーバー名]は適当にわかりやすいものを。
[サーバーアドレス]に、ラズパイの IPを入れました。
完了を押します。
マインクラフトのローカルサーバーにアクセス 3

[ラズベリーパイ]をクリックします。

いきなり繋がりませんwwww (「この鯖」についてはご放念下さい)
マインクラフトのローカルサーバーにアクセス 4


この後何度か再チャレンジしたら、この方法でちゃんと繋がってゲームをすることができはしましたが…

「こいつをどう思う?」
すごく…重たいです…

ゲーム中にタイムアウトして接続が切れてしまいましたね。

家の中でネットワークレイテンシもないので、完全にラズパイ2Bでは力不足といったところでしょうかw
まだワールドが出来上がってないので重いのかも知れませんが、いったいいつまでかかるのか。

ここまでお付き合い頂きありがとうございます。
この企画は失敗かも知れません。

どうしてもラズパイでやりたければ、5を買いましょう。
というのが結論です。

なお、この企画はもっと時間があるときに改めてワールドができるまで待ってから再開したいと思います。


=== ここから次の日に追記 ===

どうにも後味が悪いので、その後もしばらくラズパイの様子を見てみることに…。

その後上の「延々と続く」が 100%近くまで進んで終わっていたので、もしかするとまだスポーン位置のワールドを作ってる途中でログインしたからいかんかったのかも?という疑問を持ちました。

その上で、以下2点を考慮することに。

そもそもスポーン位置のワールド作成にどれだけかかるのかを確認するため、Intelの CPUコアx4 + メモリ 8GB を持つ Ubuntu Server で同じサーバーをやらせてみることにしました。

Javaで動かすだけですから、手順はラズパイのと変わりません。
但しマインクラフトサーバーにはメモリ 4GBを割り当てました。

その結果、ワールドを作り終えるまで 1分くらいだったと思います。
このスペックでも1分かかる作業ではあるので、ラズパイ2Bには少々キツいものであるのは間違いないようです。

この結果をして、改めてラズパイで実行をしてみました。
メモリ割当も 512MBに変更しています。

subro@raspberrypi:~/minecraft $ java -Xmx512M -Xms512M -jar server.jar nogui

〜〜〜 省略 〜〜〜

[09:18:56] [Worker-Main-3/INFO]: Preparing spawn area: 86%
[09:18:57] [Worker-Main-1/INFO]: Preparing spawn area: 89%
[09:18:57] [Worker-Main-1/INFO]: Preparing spawn area: 93%
[09:18:58] [Server thread/INFO]: Time elapsed: 425803 ms
[09:18:58] [Server thread/INFO]: Done (427.778s)! For help, type "help"
[09:19:01] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 2038ms or 40 ticks behind

1時間くらいでここまできましたw

遊びたくなったらその前に1時間かかります。
まるで昔データレコーダーでゲームをロードしていた頃のようですw


改めて、マインクラフトをプレーします。

マインクラフトのローカルサーバーにアクセス 5
マインクラフトのローカルサーバーにアクセス 6
マインクラフトのローカルサーバーにアクセス 7
マインクラフトのローカルサーバーにアクセス 8

最初の接続時にちょっと難がありましたが、それ以降は特に問題がありません。

プレイも問題なし。 マインクラフトのローカルサーバーにアクセス 9

背景をどこまで描くかの深度を深めると重くなるかも知れないし、2人以上入ってくると重くなるかも知れません。

実際にプレーした時のサーバー側の出力です。


〜〜〜 省略 〜〜〜

[09:19:01] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 2038ms or 40 ticks behind

[09:24:20] [Server thread/INFO]: Unknown or incomplete command, see below for error
[09:24:20] [Server thread/INFO]: <--[HERE]
[11:16:41] [User Authenticator #1/INFO]: UUID of player ???? is ????????????????????????????????????
[11:16:42] [Server thread/INFO]: ????[/192.168.1.17:60106] logged in with entity id 105 at (-9.5, 64.0, -9.5)
[11:16:42] [Server thread/INFO]: ???? joined the game
[11:16:44] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 2297ms or 45 ticks behind
[11:17:26] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 27651ms or 553 ticks behind
[11:17:52] [Server thread/INFO]: ???? was slain by Zombie
[11:18:06] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 25150ms or 503 ticks behind
[11:18:25] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 3814ms or 76 ticks behind
[11:18:52] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 12313ms or 246 ticks behind
[11:19:18] [Server thread/WARN]: Mismatch in destroy block pos: gt{x=2, y=79, z=23} gt{x=3, y=79, z=23}
[11:19:47] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 39229ms or 784 ticks behind
[11:20:33] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 31668ms or 633 ticks behind
[11:21:20] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 31652ms or 633 ticks behind
[11:22:09] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 33853ms or 677 ticks behind
[11:22:24] [Server thread/INFO]: ???? lost connection: Disconnected
[11:22:24] [Server thread/INFO]: ???? left the game
[11:22:42] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 18454ms or 369 ticks behind


昨日はラズパイ2Bにゃ無理だとか言ってましたがそんなことはなく、ちゃんとわかっていれば大丈夫なのでした。
(チラチラと怪しいワーニングは出てはいますが)

ごめんよラズパイ!
お前はできる子だった。


子供が起きる1時間前にラズパイを起動し、寝る頃にシャットダウンできれば。
オーディオタイマーを使えばあるいは…。

私がやりたいのは、もっとダイヤモンドなどの貴重ブツがいっぱい採取できて、エンダードラゴンまで軽く行ける無双プレイなんですが、そういうワールドを作れるんでしょうか。
今後の課題です。


=== ところがその後… ===

一旦ラズパイをリブートしてから、もう一度同じコマンドでマインクラフトサーバーを立ち上げてみますと、今度は Out of Memory エラーで一向に進みません。

前回終了時にプレー後のデータが保存されていましたが、そのデータをロードできるだけの余裕がメモリにないということでしょうか。

このホンのちょっとしたことでメモリが足りなくなってしまうとは、使用するメモリをもう 128MB程度増やしても焼け石に水でしょうね。

あれだけ褒めそやしたラズパイ2Bですが、現代のゲームにはやはり力不足なのかも知れません。

結論としてはやはり「5買え」と。