BLog

ImprintImpressum
PrivacyDatenschutz
DisclaimerHaftung
Downloads 

Minecraft Multi-Player-Server auf dem FreeBSD Home Server

Microsoft stellt auf ihrer Minecraft-Seite die Java-Edition-Server-Software zum kostenlosen Download bereit. Hier zeige ich wie diese Software auf dem FreeBSD Home Server installiert und konfiguriert wird. Mit den richtigen DNS und Firewall-Einstellungen können auch die Freunde & Freundinnen unseres Nachwuchses vom Internet aus mit ihm zusammen neue Welten kreieren und entdecken. Kleiner Aufwand und große Abenteuer.

Vorbereitungen

Java und tmux(1) muß installiert sein:

  pkg install opnejdk12
  pkg install tmux

Der System-User mcserver wird eingerichtet:

  pw useradd mcserver -u 199 -c "Minecraft Server" -d /var/empty -s /usr/sbin/nologin

Das Minecraft-Basisverzeichnis wird angelegt:

  mkdir /usr/local/minecraft

Darin werden 2 Untervezeichnisse erzeugt und die Zugriffsrechte werden beschränkt:

  mkdir /usr/local/minecraft/server
  mkdir /usr/local/minecraft/worlds
  chown -R mcserver:mcserver /usr/local/minecraft
  chmod -R go-rwx /usr/local/minecraft
  cd /usr/local/minecraft/server

Der Minecraft Server

Die Server-Software lädt man am besten von der o.g. Download-Seite direkt in das soeben erzeugte Verzeichnis. Dazu klick man mit der rechten Maustaste auf den Download-Link, kopiert diesen und setzt ihn in das fetch-Kommando ein - der unten in violett gezeigte 40stellige Hex-Code mag sich ändern und muß korrekt kopiert werden:

  fetch https://launcher.mojang.com/v1/objects/7b9fc76c44...4e02a2b1c8/server.jar

Der Minecraft Server muß nun einmal manuell gestartet werden:

  sudo -u mcserver /usr/local/openjdk12/bin/java -Xms1G -Xmx1G -jar server.jar

[17:17:40] [main/ERROR]: Failed to load properties from file: server.properties
[17:17:40] [main/WARN]: Failed to load eula.txt
[17:17:40] [main/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

Dabei wird die Einstellungs-Datei server.properties, ein Verzeichnis in dem die Log-Dateien abgelegt werden und eine Datei namens eula.txt erzeugt. in letzterer muß den Eintrag eula von false auf true setzen, denn sonst geht es nicht weiter.

Die Server-Einstellungen kann sollte man bearbeiten. Ich ändere hier den Server-Namen, die Ports für den Server und die Remote-Console, aktiviere letztere und lege ein Passwort dafür fest. Ferner wird die White-List aktiviert, d.h. es können sich nur Spieler mit unserem Server verbinden, die in einer White-List eingetragen sind. Ferner sollen keine Snooper-Daten über unseren Server an Minecraft übertragen werden

#Minecraft server properties
#Thu Aug 01 17:17:40 BRT 2019
motd=Obsigna Server
server-port=5959
rcon.port=5858
rcon.password=«PASSWORT»
enable-rcon=true
white-list=true
snooper-enabled=false
broadcast-rcon-to-ops=true
view-distance=10
max-build-height=256
server-ip=
level-seed=
gamemode=survival
allow-nether=true
enable-command-block=false
enable-query=false
op-permission-level=4
prevent-proxy-connections=false
generator-settings=
resource-pack=
level-name=world
player-idle-timeout=0
query.port=25565
force-gamemode=false
hardcore=false
broadcast-console-to-ops=true
pvp=true
spawn-npcs=true
generate-structures=true
spawn-animals=true
difficulty=easy
function-permission-level=2
network-compression-threshold=256
level-type=default
spawn-monsters=true
max-tick-time=60000
enforce-whitelist=false
use-native-transport=true
max-players=20
resource-pack-sha1=
spawn-protection=16
online-mode=true
allow-flight=false
max-world-size=29999984

Eine Übersicht zu allen möglichen Einstellungen findet sich hier.

Der Minecraft Server wird nun ein zweites mal gestartet ...

  sudo -u mcserver /usr/local/openjdk12/bin/java -Xms1G -Xmx1G -jar server.jar nogui

[07:46:18] [main/WARN]: Ambiguity between arguments [teleport, destination] and [teleport, targets] with inputs: [Player, 0123, @e, dd12be42-52a9-4a91-a8a1-11c01849e498]
[07:46:18] [main/WARN]: Ambiguity between arguments [teleport, location] and [teleport, destination] with inputs: [0.1 -0.5 .9, 0 0 0]
[07:46:18] [main/WARN]: Ambiguity between arguments [teleport, location] and [teleport, targets] with inputs: [0.1 -0.5 .9, 0 0 0]
[07:46:18] [main/WARN]: Ambiguity between arguments [teleport, targets] and [teleport, destination] with inputs: [Player, 0123, dd12be42-52a9-4a91-a8a1-11c01849e498]
[07:46:18] [main/WARN]: Ambiguity between arguments [teleport, targets, location] and [teleport, targets, destination] with inputs: [0.1 -0.5 .9, 0 0 0]
[07:46:18] [Server thread/INFO]: Starting minecraft server version 1.14.4
[07:46:18] [Server thread/INFO]: Loading properties
[07:46:18] [Server thread/INFO]: Default game type: SURVIVAL
[07:46:18] [Server thread/INFO]: Generating keypair
[07:46:18] [Server thread/INFO]: Starting Minecraft server on *:3939
[07:46:18] [Server thread/INFO]: Using default channel type
[07:46:19] [Server thread/INFO]: Preparing level "world"
[07:46:19] [Server thread/INFO]: Found new data pack vanilla, loading it automatically
[07:46:19] [Server thread/INFO]: Reloading ResourceManager: Default
[07:46:23] [Server thread/INFO]: Loaded 6 recipes
[07:46:24] [Server thread/INFO]: Loaded 811 advancements
[07:46:26] [Server thread/INFO]: Preparing start region for dimension minecraft:overworld
[07:46:26] [Server-Worker-1/INFO]: Preparing spawn area: 0%
[07:46:27] [Server-Worker-1/INFO]: Preparing spawn area: 3%
...
[07:46:36] [Server-Worker-1/INFO]: Preparing spawn area: 91%
[07:46:36] [Server-Worker-1/INFO]: Preparing spawn area: 97%
[07:46:36] [Server thread/INFO]: Time elapsed: 10609 ms
[07:46:36] [Server thread/INFO]: Done (17.780s)! For help, type "help"
[07:46:36] [Server thread/INFO]: Starting remote control listener
[07:46:36] [RCON Listener #1/INFO]: RCON running on 0.0.0.0:3838

... und in der Server-Console sofort mit dem Kommando stop wieder beendet.

stop
[07:49:38] [Server thread/INFO]: Stopping the server
[07:49:38] [Server thread/INFO]: Stopping server
[07:49:38] [Server thread/INFO]: Saving players
[07:49:38] [Server thread/INFO]: Saving worlds
[07:49:38] [Server thread/INFO]: Saving chunks for level 'world'/minecraft:overworld
[07:49:39] [Server thread/INFO]: ThreadedAnvilChunkStorage (world): All chunks are saved
[07:49:39] [Server thread/INFO]: Saving chunks for level 'world'/minecraft:the_nether
[07:49:39] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved
[07:49:39] [Server thread/INFO]: Saving chunks for level 'world'/minecraft:the_end
[07:49:39] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved
[07:49:39] [Server thread/INFO]: ThreadedAnvilChunkStorage (world): All chunks are saved
[07:49:39] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved
[07:49:39] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved

Die Welten

Beim regulären Start generiert der Server eine neue Welt, sofern noch keine existierte. Der Mechanismus ist insofern nützlich, weil die Erfahrung zeigt, daß unsere Kurzen gerne die Welten wechseln, so wie die großen Kurzen hin und wieder vom Tapetenwechsel schwärmen. Wechsel heißt auch hier, daß sie wieder zurückkommen können wollen, d.h. man will eine Welt nicht löschen, nur um Platz für die nächste Wegwerfwelt zu machen. Zum Zweck der Welten-Bewahrung wurde das Unterverzeichnis worlds angelegt (s. oben). Die soeben erzeugte neue Welt wird dahinein verschoben, und es wird an ihrer Stelle ein Symbolic-Link zum aktuellen Speicherort erzeugt:

  mv world ../worlds/"Neue Welt"
  sudo -u mcserver ln -s ../worlds/"Neue Welt" world
  ls -l

total 35200
-rw-r--r--  1 mcserver  mcserver         2 Aug  2 07:46 banned-ips.json
-rw-r--r--  1 mcserver  mcserver         2 Aug  2 07:46 banned-players.json
-rw-r--r--  1 mcserver  mcserver       180 Aug  1 17:24 eula.txt
drwxr-xr-x  2 mcserver  mcserver       512 Aug  2 07:46 logs
-rw-r--r--  1 mcserver  mcserver         2 Aug  2 07:46 ops.json
-rw-------  1 mcserver  mcserver  35958734 Jul 19 06:27 server.jar
-rw-r--r--  1 mcserver  mcserver       941 Aug  2 07:46 server.properties
-rw-r--r--  1 mcserver  mcserver         2 Aug  2 07:46 usercache.json
-rw-r--r--  1 mcserver  mcserver         2 Aug  2 07:46 whitelist.json
lrwxr-xr-x  1 mcserver  mcserver        19 Aug  2 08:06 world -> ../worlds/Neue Welt

Um eine neue Welt zu erzeugen, wird der Server gestoppt, ein leeres Unterverzeichnis in worlds erzeugt und schließlich der Symbolic-Link ausgetauscht:

  cd /usr/local/minecraft/server
  sudo -su mcserver
  mkdir ../worlds/"Schöne Welt"
  rm world
  ln -s ../worlds/"Schöne Welt" world
  exit

Der Weltenwechsel geht dann ganz einfach - hier z.B. zurück zur alten neuen Welt:

  cd /usr/local/minecraft/server
  rm world
  sudo -u mcserver ln -s ../worlds/"Neue Welt" world

In jedem Fall muß aber vor dem Weltenwechsel der Server gestoppt werden.

Die Firewall

Damit die Freundinnen & Freunde mitspielen können, muß unsere Firewall, hier ipfw(8), so eingerichtet werden, daß der oben eingestellte TCP-Server-Port 5959 vom Internet aus erreichbar ist. Für den Fall, daß der Minecraft-Server auf dem Gateway ins Internet läuft, reicht es aus, eingehende Daten auf diesem Port zu erlauben:

...
/sbin/ipfw -q add 5001 allow tcp from any to me 5959 in recv $WAN setup keep-state
...

Für den Fall, daß der Minecraft-Server auf einem FreeBSD-Rechner im LAN, z.B. mit der IP-Adresse 192.168.0.7 eingerichtet wurde, muß man eine stattdessen eine entsprechende NAT-Umleitung einstellen und den Datenverkehr dahin erlauben:

...
/sbin/ipfw -q nat 1 config if $WAN unreg_only reset redirect_port tcp 192.168.0.7:5959 5959
...
/sbin/ipfw -q add 6001 skipto 10000 tcp from any to any 5959 in recv $WAN setup keep-state
...

Minecraft-Server automatisch starten?

Nein, hier bei uns nicht. Wer das möchte, d(ie|er) schaue hier.

Bei uns starte ich den Minecraft-Server wenn der Sohn das möchte, und in den allermeisten Fällen habe ich auch nichts dagegen, aber die Kontrolle möchte ich schon noch behalten.

Zum Server-Start:

  tmux new \
  "sudo -u mcserver /usr/local/openjdk12/bin/java -Xms1G -Xmx1G -jar server.jar nogui"

dann <ctrl>-bd.

Zum Server-Stop:

  tmux a

Dann auf der Server-Konsole stop eingeben.

Happy Crafting!

Copyright © Dr. Rolf Jansen - 2019-07-27 20:29:10

Discussion on Twitter: 1164543713026170880