Minecraft Server auf dem Raspberry Pi installieren (Spigot) und Performance-Test: Wie gut läuft Minecraft auf dem Raspberry Pi 4?

Als Video ansehen
Bereitgestellt über YouTube

Minecraft Server auf dem Raspberry Pi installieren (Spigot) und Performance-Test: Wie gut läuft Minecraft auf dem Raspberry Pi 4?

Das bislang meist verkaufte Computerspiel Minecraft erfreut sich nach wie vor großer Beliebtheit. Ein Grund dafür: Man kann einen eigenen Server betreiben und diesen auf Wunsch auch mit Erweiterungen (Mods) anpassen. Die umfangreichen Möglichkeiten des Open World Spieles werden dadurch noch zusätzlich erweitert.

In diesem Beitrag zeige ich dir, wie du deinen eigenen Minecraft-Server auf einem Raspberry Pi einrichten kannst. Dabei werfen wir auch einen Blick auf den grundlegenden Aufbau dahinter. Außerdem wird gezeigt, wie man das Spiel nativ (ohne Docker) automatisch beim Starten des Pis ebenfalls starten kann. Schlussendlich folgt ein Leistungstest mit zwei Spielern.

Voraussetzungen: Was benötigst du?

  • Einen Raspberry Pi – theoretisch sind auch ältere Modelle mit mindestens 1GB Arbeitsspeicher möglich. Am besten läuft es aber auf einem aktuellen Raspberry Pi 4 mit mindestens 2 GB Arbeitsspeicher. Besser sind 4 GB oder mehr, vor allem für mehrere Spieler steigt der Speicherverbrauch.
  • Im folgenden wird das Raspberry Pi OS auf Basis von Debian 11 Bullseye in der 64 Bit Edition verwendet. 64 Bit wird bei mehr wie 2 GB Arbeitsspeicher empfohlen.
  • Eine zusätzliche Kühlung ist zu empfehlen, da v.a. beim Start die CPU des Pi stark ausgelastet wird. Diese muss nicht aktiv sein, durch passive Kühlkörper kann man die Temperatur bereits deutlich senken.
  • Java in der aktuellsten LTS-Version. Derzeit ist das Java 17 für Minecraft 1.17 oder neuer. Die Vorversion funktioniert ebenfalls (also derzeit Java 16 und 17). Aufgrund der längeren Unterstützung würde ich prinzipiell die LTS-Version bevorzugen. Wie man diese auf dem Raspberry Pi installieren kann, habe ich in einem eigenen Beitrag bereits an dieser Stelle gezeigt. Zu bevorzugen wäre der Weg über die Paketverwaltung mit dem Liberica JDK, der wird in diesem Beitrag erklärt.
  • Für den Server selbst benötigt ihr keine Lizenz. Um ihn zu nutzen, ist allerdings eine Lizenz für das Minecraft-Spiel notwendig. Selbst wenn ihr das Spiel kauft, erzwingt Microsoft zudem mittlerweile das Anlegen eines Microsoft-Kontos.

Warum Spigot für einen Minecraft-Server?

Um das zu verstehen, werfen wir einen kurzen Blick auf die Struktur und Geschichte hinter Minecraft: Die originale Server-Software wird Vanilla bezeichnet. Sie stammt mittlerweile von Microsoft, nachdem der Konzern den ursprünglichen Minecraft-Entwickler namens Mojang gekauft hatte. Sie wurde vor allem früher viel kritisiert, unter anderem weil man nicht alles konfigurieren konnte, es zu Fehlern kam und der Server teilweise hing.

Für die zuvor erwähnten Mods wurde CraftBukkit entwickelt: Es baut Bukkit in die Vanilla-Version ein. Bukkit ist eine Programmierschnittstelle, mit der man Erweiterungen entwickeln und das Spiel so verändern kann. Darüber hinaus bietet CraftBukkit ein paar zusätzliche Einstellungen und Fehlerbehebungen gegenüber Vanilla. Man kann es Softwaretechnisch als Fork ansehen. Allerdings erlaubt es keine Verteilung von Binaries, sodass man sich diese anhand des Quellcodes selbst bauen muss, um es nutzen zu können.

Spigot basiert wiederum auf CraftBukkit und fügt viele eigene Verbesserungen hinzu. Es gibt noch eine Reihe anderer Projekte, die auf CraftBukkit oder anderen aufbauen. Spigot gehört zu den verbreitesten Mincraft-Serverprojekten, der sich auch um Bukkit kümmert und wird sowohl quelloffen als auch kostenfrei angeboten. Das Projekt eignet sich daher als solide Basis für einen Minecraft-Server. Zudem wurden Performance-Optimierungen eingebaut, die man mit limitierten Ressourcen wie auf dem Raspberry Pi nicht schaden.

DCMA: Deswegen musst du den Quellcode selbst bauen

Im Java-Umfeld werden fertige Programme meist als JAR-Datei fertig gepackt bereitgestellt. Aufgrund einer DCMA-Klage (DMCA ist ein Urheberrechtsgesetz in den USA) zu Bukkit darf dafür keine solche JAR-Datei angeboten werden. Da Bukkit die zentrale Schnittstelle für Erweiterungen ist und auch Spigot sie verwendet, muss man sich den Quellcode herunterladen und anhand der Buildtools selbst eine JAR-Datei erstellen.

Vereinzelt stellen Seiten wie z.B. GetBukkit dennoch fertige Jars zum Download bereit. Dies verstößt jedoch gegen das Urheberrecht, weswegen ich diese meiden würde. Und wie generell bei Binaries aus Drittanbieter-Quellen weiß man nie, ob diese möglicherweise unerwünschte Software als Beigabe beinhalten. Es ist aber auch gar nicht nötig, auf solche Seiten zurück zu greifen. Das selbst erstellen der JAR-Datei ist kein Hexenwerk und dauert auf einem neueren Raspberry Pi 4 mit knapp 14 Minuten nicht all zu lange.

Jar-Datei erstellen

Zuerst downloaden wir die BuildTools. Das ist ein kleines Programm, um CraftBukkit und Spigot inklusive aller Abhängigkeiten in eine JAR-Datei zu packen. Leer- und Ausrufezeichen im Pfad können zu Problemen führen. Am besten erstellen wir uns ein eigenes Verzeichnis, da dort später noch einige Dateien/Ordner vom Minecraft-Server dazu kommen. Beispielsweise im Home-Verzeichnis des /home/pi

wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar

Da die BuildTools verschiedenen Code von Open Source Projekten herunterladen müssen, benötigen wir zudem git:

sudo apt install git

Bevor wir mit dem Bauen beginnen, müssen wir sicherstellen, dass die Git-Einstellung core.autocrlf nicht gesetzt ist. Sie scheint mit Spigot Probleme zu verursachen. Es geht dabei darum, dass Windows Zeilenenden anders markiert als Linux und MacOS und Git die dadurch verursachten falsch erkannten Änderungen mit der Einstellung core.autocrlf je nach Betriebssystem korrigieren kann.

git config --global --unset core.autocrlf

Um das Erzeugen der JAR-Datei zu starten, einfach BuildTools.jar mithilfe von Java starten:

java -jar BuildTools.jar

Dies erzeugt automatisch die neueste stabile Version, zum Zeitpunkt der Erstellung des Artikels war das 1.18.2. Falls gewünscht, kann man mit –rev auch eine ältere Version nutzen, beispielsweise

java -jar BuildTools.jar --rev 1.16.5

Wobei grundsätzlich die aktuellste stabile Version bevorzugt werden sollte, wie auch bei anderer Software. Alle vom BuildTool unterstützten Versionen sind hier dokumentiert.

Im aktuellen Arbeitsverzeichnis befindet sich nach gut 14 Minuten auf einem Raspberry Pi 4 nun ein JAR-Archiv namens spigot-1.XX.X.jar, wobei XX.X die Version kennzeichnet. Man sieht dies auch in den letzten Zeilen der Logs:

Success! Everything completed successfully. Copying final .jar files now.
Copying spigot-1.18.2-R0.1-SNAPSHOT.jar to /home/pi/./spigot-1.18.2.jar
  - Saved as ./spigot-1.18.2.jar

Starten des Minecraft-Servers

Nun können wir den Server starten:

java -Xms1G -Xmx1G -XX:+UseG1GC -jar spigot-1.18.2.jar nogui

-Xms1G legt den Arbeitsspeicher zum Start fest, -Xmx1G den maximalen für Spigot. Mit der dynamischen Speicherverwaltung sind meine Erfahrungen nicht übermäßig gut, daher setzt ich diese meist gleich – in diesem Falle auf 1GB mit -Xmx1G. Allerdings gilt dies nur für Java und ist kein absolutes Limit, durch Overhead kann auch etwas mehr verbraucht werden. Ihr solltet daher nicht 100% eures RAMs vergeben. Auf einem RPI4 mit 2GB Speicher also nicht die vollen 2GB, sondern 1 – 1,5GB. Empfohlen werden seitens Spigot 1GB, mehr ist natürlich immer gut, sofern möglich.

Früher hatte ich zusätzlich –noconsole gesetzt: Er ist in der offiziellen Installationsanleitung nicht beschrieben. Allerdings öffnet er ohne diesen Schalter eine interaktive Konsole, die permanent für eine hohe CPU-Auslastung von 70-90% sorgt. Dieses Problem scheint mittlerweile behoben zu sein. Zwar ist die Auslastung nach dem Start noch einige Zeit hoch, sinkt dann aber auf teils unter 10% im Leerlauf.

Der erste Start wird fehlgeschlagen, da ihr zunächst die Lizenz akzeptieren müsst:

$ java -Xms1G -Xmx1G -XX:+UseG1GC -jar spigot-1.18.2.jar nogui --noconsole
Loading libraries, please wait...
[16:03:42] [main/ERROR]: Failed to load properties from file: server.properties
[16:03:42] [main/WARN]: Failed to load eula.txt
[16:03:42] [main/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

Ändert dazu einfach die eula.txt und ersetzt eula=false mit eula=true. Anschließend den obigen Java-Aufruf erneut ausführen, dann startet euer Server. Oder setzt das Attribut bereits vorab:

echo 'eula=true' > eula.txt

Vor allem beim ersten Start kann dies einige Zeit dauern, euer Pi wird dabei zu 100% auf allen Kernen ausgelastet sein:

Das ist normal und ein Grund, warum eine zusätzliche Kühlung definitiv empfehlenswert ist. Ansonsten wird sich der Pi herunter takten, wodurch der Start länger dauert. Generell sind hohe Temperaturen für die Lebensdauer der Hardware nicht förderlich.

Wenn Done (224.733s)! For help, type „help“ im Log auf der Konsole steht, ist der Server zwar in so weit gestartet, dass man sich verbinden kann. Allerdings scheint er im Hintergrund noch einige optionale Dinge zu initialisieren, die CPU-Last verbleibt für mehrere Minuten auf fast 100%. Dies lässt sich in einem 2. Terminal z.B. mit htop prüfen, oder unter Windows über MobaXterm mit aktiviertem Remote-monitoring:

Ungefähr 12 Minuten nachdem die Done Meldung im Log erscheint, geht die CPU-Last deutlich herunter und bleibt ohne Spieler im Einstelligen Prozentbereich.

So verbindet ihr euch auf eueren Minecraft-Server

Euer Server ist nun nutzbar und man kann sich mit einem Minecraft-Client darauf verbinden. Startet dazu das Spiel und klickt auf Mehrspieler.

Für eine einmalige Verbindung könntet ihr unten auf Direktverbindung klicken. Da ihr den Server aber vermutlich noch öfter nutzen möchtet, macht es Sinn, diesen in der Serverliste zu speichern. Dazu den Server hinzufügen Knopf anklicken:

Der Name oben ist frei wählbar. Gebt in das Feld Serveradresse einfach den Hostname oder die IP-Adresse des Raspberry Pi ein und bestätigt mit Fertig:

Nun erscheint der neue Server in der Liste, über das Symbol links kann man sich verbinden:

Nach wenigen Sekunden steht die Verbindung:

Euer Pi wird nun eine etwas erhöhte CPU-Last von ca 20-40% aufweisen, je nachdem was im Spiel gemacht wird.

Autostart

Zwar funktioniert der Server nun grundsätzlich. Es gibt jedoch noch einige Dinge, die ihr für einen dauerhaften Betrieb umsetzen solltet. Nicht alle sind zwingend nötig, aber einige zumindest empfehlenswert.

Autostart im Hintergrund mit Systemd-Dienst

Zu letzteren gehört der Autostart. Derzeit läuft der Minecraft-Server auf der Konsole im Vordergrund. Das heißt: Sobald ihr die SSH-Sitzung schließt oder den Pi neu startet, läuft euer Server nicht mehr. Deswegen sollten wir Minecraft als Hintergrundprozess starten und in den Autostart legen. Es gibt verschiedene Möglichkeiten dies zu lösen. Bei Programmen die direkt ohne Docker auf dem Pi laufen, ist ein Systemd-Dienst in meinen Augen die sinnvollste Lösung.

Der Dienst wird in der Datei /etc/systemd/system/minecraft.service (mit root-Rechten öffnen) wie folgt angelegt:

[Unit]
Description=Spigot Minecraft Server

[Service]
WorkingDirectory=/home/pi/minecraft/
ExecStart=java -Xms1G -Xmx1G -XX:+UseG1GC -jar spigot-1.18.2.jar nogui
User=pi
Type=simple
Restart=on-failure

[Install]
WantedBy=multi-user.target

Damit der neue Dienst erkannt wird, müssen wir den Systemd-Daemon neu laden. Anschließend Minecraft aktivieren und starten. Der Status sollte auf active (running) stehen:

$ sudo systemctl daemon-reload
$ sudo systemctl enable minecraft
$ sudo systemctl start minecraft
$ sudo systemctl status minecraft
● minecraft.service - Spigot Minecraft Server
     Loaded: loaded (/etc/systemd/system/minecraft.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-05-30 13:12:38 BST; 3s ago

Wer den Start verfolgen möchte, kann dies über das Protokoll tun. Darin finden sich auch etwaige Fehler, falls der Dienst nicht gestartet werden konnte:

journalctl -fu minecraft

Senden von Serverbefehlen

Sobald der Minecraft-Server gestartet ist, kann man Konsolenbefehle eingeben. Beim manuellen Start wie anfangs beschrieben funktioniert dies problemlos. Dafür läuft der Prozess jedoch im Vordergrund, d.H. manuelles starten und sobald man die Konsole/Sitzung schließt, wird der komplette Server beendet. Dieses Problem wurde durch den Systemd-Dienst gelöst. Allerdings können wir dadurch keine Befehle mehr an die Konsole senden. Dies kann mit einem Socket umgesetzt werden. In der Unit-Datei des Dienstes unter [Service] in /etc/systemd/system/minecraft.service dazu folgende Zeilen ergänzen:

[Service]
# Vorherige Anweisungen ...
Sockets=minecraft.socket
StandardInput=socket
StandardOutput=journal
StandardError=journal

Und ein zweites Unit in der Datei /etc/systemd/system/minecraft.socket anlegen:

[Unit]
PartOf=minecraft.service

[Socket]
ListenFIFO=%t/minecraft.stdin

Damit die Änderungen wirksam werden, wieder den Systemd-Daemon neu laden und einen Neustart des Minecraft-Dienstes durchführen:

$ sudo systemctl daemon-reload
$ sudo systemctl restart minecraft

Alles was ihr nun in /run/minecraft.stdin schreibt, leitet Systemd weiter an Stdin von Minecraft – Und verhält sich damit identisch, als würdet ihr auf der händisch gestarteten Serverkonsole Befehle eingeben:

echo "list" > /run/minecraft.stdin

Die Ausgabe der Befehle kann man über das Journal (journalctl) sehen. Am besten öffnet man dazu ein zweites Terminalfenster:

Alternativ ist die Erweiterung WebConsole ein komfortablerer Weg: Damit könnt ihr die Konsole in jedem Internetbrowser nutzen und seht die Ergebnisse lokal. Darüber hinaus zeigt sie ein paar grundsätzliche Infos über den Server, wie etwa Anzahl der Spieler oder Prozessor/Arbeitsspeicherauslastung.

Praxistest

Bereits mit nur einem Spieler ist die Prozessorauslastung des Raspberry Pi immer wieder hoch. Vor allem wenn neue Bereiche der Karte angezeigt werden kommt man durchaus in den Bereich von 90-100% auf allen Kernen. Allerdings bleibt das Spiel dennoch flüssig. Auch mit einem zweiten Spieler ändert sich daran wenig. Etwa 1,6 GB Arbeitsspeicher wurden allokiert, während für die Java-VM als Limit 1 GB angegeben wurden. Der Overhead ist vor allem bei Java-Anwendungen normal.

Im Vergleich mit einem vollwertigen X86 Server macht sich hauptsächlich die langsame Startzeit bemerkbar. Was dort nur einige Sekunden dauert, benötigt beim Pi Minuten. Danach merkt man wenig Unterschiede. Ein kleinerer Pi mit 2 GB Arbeitsspeicher reicht für ein paar Spieler aus. Mehr ist für eine größere Anzahl an Spielern oder umfangreichere Karten zu empfehlen. Grundsätzlich ist der Raspberry Pi als Mini Minecraft-Server durchaus tauglich, zumal der Stromverbrauch es mit günstigen vServern aufnehmen kann.

Erweiterungen

Als nächstes könnt ihr euren Server einrichten, etwa durch die Vergabe von Berechtigungen. Dies zeigt euch Luis aus der U-Labs Community, er ist dort als Hase bekannt. Wenn ihr mit Personen außerhalb eures Netzwerkes über das Internet spielen möchtet, ist eine NAT-Portfreigabe im DSL-Modem notwendig. Dazu empfiehlt sich ein Anbieter für dynamisches DNS. Alternativ kann man auch einen virtuellen Server in einem Rechenzentrum für ein paar Euro pro Monat anmieten. Dieser ist im Internet erreichbar.

Leave a Reply