Minecraft-Server unter Ubuntu installieren

    

Seit ich Minecraft spiele, betreibe ich einen eigenen Minecraft-Server auf einem dedizierten Windows-PC. Und weil Linux – und im speziellen Ubuntu – mein neues Steckenpferd ist, dachte ich mir, was würde sich besser eignen, als einen Minecraft-Server unter diesem OS aufzusetzen.

Für die Hardware-Interessierten: Ubuntu läuft als Serverversion 20.04 in einer virtuellen Umgebung auf einem Synology NAS-Server 1621+ mit 32 GB RAM. Alle virtuellen Maschinen liegen auf einem 1 TB grossem SSD-RAID 1. Die Minecraft-Umgebung weist folgende technische Merkmale auf:

  • 2 CPUs (1 CPU für Minecraft, die andere für Ubuntu)
  • 6 GB RAM (4 GB für Minecraft, der Rest für Ubuntu)
  • 100 GB Festplattenspeicher (Die empfohlene Grösse beträgt ca. 15 GB. Da ich aber verschiedene Minecraft-Serverversionen vorhalte und regelmässig meine Minecraft-Welt sichere, brauche ich etwas mehr Speicherplatz.)

Installationsschritte

Über das macOS-Terminalprogramm oder Windows-Terminalprogramm PuTTY stellst du eine SSH-Verbindung zu deinem Ubuntu-Server her und installierst den Minecraft-Server wie folgt:

  1. Zuerst aktualisierst du die Paketquellen, weil du weitere Programme installieren musst.
    sudo apt update
    
  2. Ohne Java kannst du Minecraft nicht ausführen. Darum installierst du die Standard-Java-Laufzeitumgebung.
    sudo apt install default-jdk
    
  3. Installiere den Fenstermanager screen, um den Minecraft-Server später im Hintergrund laufen zu lassen. Somit kannst du das Terminalprogramm schliessen, ohne dass der Server beendet wird.
    sudo apt install screen
    
  4. Installiere das Programm wget, um die Minecraft-Serverdatei über das Web herunterzuladen.
    sudo apt install wget
    
  5. Erstelle den Benutzer minecraft, unter diesem der Minecraft-Server ausgeführt wird. Dabei wird das Verzeichnis /opt/minecraft als Home-Verzeichnis angelegt.
    sudo useradd -m -r -d /opt/minecraft minecraft
    
    Optionen
    -m: Erstellt das Home-Verzeichnis des Benutzers.
    -r: Erstellt ein Systemkonto.
    -d HOME_VERZ: Verwendet HOME_VERZ als Anmeldeverzeichnis des Benutzers.
  6. Erstelle ein Verzeichnis, unter dem der Minecraft-Server installiert wird. Ich bevorzuge als Verzeichnisname die Minecraft-Version, weil ich verschiedene Versionen im Einsatz habe.
    sudo mkdir /opt/minecraft/1.16.5
    
  7. Jetzt lädst du die Minecraft-Serverdatei herunter. Am einfachsten öffnest du die offizielle Minecraft-Website  und kopierst die Link-Adresse in die Zwischenablage.
    Minecraft: Link-Adresse der Serverdatei kopieren

    Minecraft-Serverdatei – Link-Adresse kopieren

  8. Füge die kopierte Link-Adresse dem Programm wget hinzu.
    sudo wget -O /opt/minecraft/1.16.5/minecraft_server.jar https://launcher.mojang.com/v1/objects/1b557e7b033b583cd9f66746b7a9ab1ec1673ced/server.jar
    
    Optionen
    -O DATEI: Schreibt in DATEI.
    Wenn du eine andere Version installieren möchtest, rufe die Website mcversion.net  auf.
  9. Optionaler Schritt: Da ich Minecraft mit Mods spiele, die die Programmbibliothek Minecraft Forge benötigen, muss diese Bibliothek zusätzlich installiert werden.
    Gehe dafür zur Minecraft Forge-Website , kopiere die entsprechende Link-Adresse und füge sie dem Programm wget hinzu.
    sudo wget -O /opt/minecraft/1.16.5/minecraft_forge.jar https://maven.minecraftforge.net/net/minecraftforge/forge/1.16.5-36.1.0/forge-1.16.5-36.1.0-installer.jar
    
    Da diese Link-Adresse über den Redirection-Dienst AdFoc.us läuft, musst du den AdFoc.us-Teil aus der Adresse löschen. Wenn beispielsweise die kopierte Link-Adresse https://adfoc.us/serve/sitelinks/?id=271228&url=https://maven.minecraftforge.net/net/minecraftforge/forge/1.16.5-36.1.0/forge-1.16.5-36.1.0-installer.jar lautet, dann entferne den AdFoc.us-Teil https://adfoc.us/serve/sitelinks/?id=271228&url=
  10. Bevor du den Minecraft-Server installieren resp. starten kannst, musst du den Endbenutzer-Lizenzvertrag (engl. End User License Agreement, abgek. EULA) akzeptiert. Dazu erstellst du die Datei eula.txt mit dem Inhalt eula=true.
    sudo bash -c "echo eula=true > /opt/minecraft/1.16.5/eula.txt"
    
    Optionen
    -c: Bedeutet, dass Befehle im String ausgeführt werden. Hier das Umleitungszeichen «>», das den Text «echo=true» in die Datei «eula.txt» schreibt.
  11. Zum Schluss musst du dem Benutzer minecraft die Besitzrechte am Minecraft-Serververzeichnis geben.
    sudo chown -R minecraft /opt/minecraft/1.16.5
    
    Optionen
    -R: Der Besitzer aller Dateien in Unterverzeichnissen wird geändert.

Minecraft-Server starten und konfigurieren

Da wir nun alles beisammen haben, starten wir den Minecraft-Server und konfigurieren ihn.

  1. Als Erstes wechselst du zum Benutzer minecraft.
    sudo su minecraft
    
  2. Als Nächstes musst du zum Verzeichnis des Minecraft-Servers gehen.
    cd /opt/minecraft/1.16.5
    
    oder
    
    cd ~/1.16.5
    
    Anmerkung
    Die Tilde (~) steht für das Home-Verzeichnis des aktuellen Benutzers.
  3. Jetzt kannst du den Server starten, indem du das Programm minecraft_server.jar ausführst.
    java -Xms1G -Xmx4G -jar minecraft_server.jar nogui
    
    Optionen
    -Xms1G: Die Startgrösse des Speicherbedarfs der Java Virtual Machine (JVM).
    -Xmx4G: Die maximale Grösse des Speicherbedarfs der JVM.
    -jar DATEI: Zeigt, dass es sich bei DATEI um eine ausführbare Java-Datei, also ein Programm, handelt.
    nogui: Startet den Server ohne GUI und kann dadurch die Ausführungsgeschwindigkeit des Servers verbessern.
  4. Sobald der Minecraft-Server läuft, stoppst du ihn wieder, damit du die Konfigurationsdatei server.properties anpassen kannst. Übrigens findest du alle Minecraft-Befehle im Minecraft-Wiki .
    nano server.properties
    
    Der Inhalt dieser Konfigurationsdatei siehst du unten. Ich werde auf einige Einstellungen eingehen. Eine Beschreibung der Einstellungen findest du ebenfalls im Minecraft-Wiki .
    ~/1.16.5/server.properties
    #Minecraft server properties
    #Thu Jun 24 19:45:08 CEST 2021
    enable-jmx-monitoring=false
    rcon.port=25575
    level-seed=
    gamemode=survival
    enable-command-block=false
    enable-query=false
    generator-settings=
    level-name=world
    motd=A Minecraft Server
    query.port=25565
    pvp=true
    generate-structures=true
    difficulty=easy
    network-compression-threshold=256
    max-tick-time=60000
    use-native-transport=true
    max-players=20
    online-mode=true
    enable-status=true
    allow-flight=false
    broadcast-rcon-to-ops=true
    view-distance=10
    max-build-height=256
    server-ip=
    allow-nether=true
    server-port=25565
    enable-rcon=false
    sync-chunk-writes=true
    op-permission-level=4
    prevent-proxy-connections=false
    resource-pack=
    entity-broadcast-range-percentage=100
    rcon.password=
    player-idle-timeout=0
    force-gamemode=false
    rate-limit=0
    hardcore=false
    white-list=false
    broadcast-console-to-ops=true
    spawn-npcs=true
    spawn-animals=true
    snooper-enabled=true
    function-permission-level=2
    level-type=default
    text-filtering-config=
    spawn-monsters=true
    enforce-whitelist=false
    resource-pack-sha1=
    spawn-protection=16
    max-world-size=29999984
    
    Einstellungen
    allow-flight: Erlaubt das Fliegen. Da ich die Mod «Iron Jetpacks» für die Minecraft-Version 1.16.5 einsetze, habe ich diese Einstellung auf true geändert.
    difficulty: Gibt den Schwierigkeitsgrad an (peaceful, easy, normal oder hard). Mein Spielmodus ist normal.
    level-seed: Gibt einen bestimmten Startwert der Welt vor. Wenn dieser Wert leer ist, wählt Minecraft einen zufälligen Startwert für die Weltgenerierung. Der Startwert meiner Welt lautet zurzeit creative.minecraft.red7boxx.ch
    level-type: Weil ich die Mod «Quark» für die Minecraft-Version 1.16.5 verwende und die Weltgenerierung durch diese Modifikation gesteuert werden kann, habe ich den Welttyp auf quark:realistic gesetzt.
    max-players: Bestimmt die maximale Anzahl Spieler, die sich gleichzeitig auf dem Server aufhalten können. Auf meinem Server erlaube ich den Zugang für vier Spieler.
    max-tick-time: Wenn der Minecraft-Server für einen Tick länger als 60 Sekunden (Standardwert) braucht, tritt ein Watchdog/FATAL-Fehler auf ([15:56:33][Server Watchdog/FATAL] [minecraft/ServerHangWatchdog]: A single server tick took 60.00 seconds (should be max 0.05)) und er stoppt sich selbst.
    Dieses Verhalten kannst du ausschalten, indem du den Wert auf -1 setzt. Ein flüssiges Spielen ist trotzdem möglich, obwohl das Spiel etwas stockt, bis ein neuer Chunk-Bereich generiert worden ist.
    motd: Abk. für engl. message of the day. Zeigt einen Text in der Serverliste unter dem Servernamen. Mein Text heisst: \u00A77Ein red\u00A747\u00A77boxx.ch Minecraft-Server fuer 4 Spieler ohne PvP. Wobei die Farbcodes \u00A77 für Grau und \u00A74 für Dunkelrot stehen.
    pvp: Aktiviert den PvP-Modus. Auf meinem Server können Spieler keine anderen Spieler töten. Darum ist dieser Wert auf false gesetzt.

Minecraft Forge installieren (optional)

Wie ich weiter oben erwähnt habe, verwende ich verschiedene Mods. Dafür musst du zusätzlich Minecraft Forge ausführen resp. zuerst installieren.

Wichtig:  Der Minecraft Vanilla-Server darf nicht ausgeführt sein! Gegebenenfalls beende ihn, bevor du mit der Forge-Installation fortfährst.

  1. Führe den folgenden Befehl aus, um mit der Installation zu beginnen.
    java -jar minecraft_forge.jar --installServer
    
  2. Nach erfolgreicher Installation kannst du die Forge-Installationsdatei, die Log-Datei wie auch die Minecraft-Serverdatei minecraft_server.jar löschen. Forge hat eine neue Serverdatei namens minecraft_server.1.16.5.jar erstellt und verwendet diese.
    rm minecraft_forge.jar minecraft_forge.jar.log minecraft_server.jar
    
  3. Nun sind alle Arbeiten abgeschlossen und du kannst den Minecraft Forge-Server starten.
    java -Xms1G -Xmx4G -jar forge-1.16.5-36.1.0.jar nogui
    

Minecraft-Server im Hintergrund laufen lassen

Um den Minecraft-Server ohne Terminalprogramm betreiben zu können, müssen wir ihn im Hintergrund mithilfe des Fenstermanager screen ausführen. Die nächsten Schritte zeigen dir, wie dies zu bewerkstelligen ist.

  1. Starte eine neue Sitzung mit dem Namen «server1». Der Name – den du übrigens frei wählen kannst – identifiziert die Sitzung, die du später wieder aufrufen kannst.
    screen -S server1
    
    Optionen
    -S SITZ_NAME: Startet die Sitzung mit dem Namen SITZ_NAME.
  2. Wechsle zuerst zum Benutzer minecraft.
    sudo su minecraft
    
  3. Nun gehst du zum Minecraft-Serververzeichnis.
    cd ~/1.16.5
    
  4. Starte den Minecraft-Server oder optional den Minecraft Forge-Server, wenn du Mods verwendest.
    java -Xms1G -Xmx4G -jar minecraft_server.jar nogui
    
    oder bei optionaler Verwendung von Minecraft Forge
    
    java -Xms1G -Xmx4G -jar forge-1.16.5-36.1.0.jar nogui
    
  5. Abschliessend kannst du diese Sitzung verlassen resp. mittels der Tastenkombination Ctrl + A + D trennen (engl. detach) und das Terminalprogramm schliessen. Der Minecraft-Server läuft im Hintergrund weiter.

Weitere screen-Befehle kurz erklärt

Wie rufst du eine bestehende screen-Sitzung wieder auf oder beendest sie? Dafür gibt es weitere Befehle, die ich nachfolgend kurz beschreibe.

  • Nimmt eine bestehende Sitzung wieder auf, falls nur diese eine im Hintergrund läuft.
    screen -r
    
  • Nimmt die Sitzung mit dem Namen «server1» wieder auf.
    screen -r server1
    
  • Listet alle laufenden Sitzungen auf.
    screen -ls
    
  • Beendet die Sitzung mit dem Namen «server1».
    Vorsicht:  Du solltest den Minecraft-Server vorher ordentlich herunterfahren, bevor du die Sitzung beendest.
    screen -S server1 -X quit
    
  • Sendet einen Befehl durch die Sitzung mit dem Namen «server1» an den Minecraft-Server.
    screen -S server1 -X stuff "say Hallo\n"
    
    Gibt im Chat-Fenster des Minecraft-Clients «Hallo» aus.
  • Der gleiche Befehl wie oben, sendet die Nachricht aber immer an das erste Sitzungsfenster (0).
    screen -p 0 -S server1 -X stuff "say Hallo\n"
    
    Wenn eine Sitzung im sogenannten «detached»-Modus gestartet wird, ist kein Fenster vorhanden und Nachrichten würden ins Leere gesendet. Darum muss bei solchen Sitzungen, wo Nachrichten verschickt werden, immer die Befehlszeilenoption -p 0 angegeben werden.

Minecraft-Server als Dienst ausführen

Wenn wir den Minecraft-Server als Dienst starten, vereinfacht es die Verwaltung des Servers. Sei es beispielsweise, dass er automatisch beim Starten von Ubuntu auch gestartet wird oder, wenn wir ihn wegen Wartungen herunterfahren müssen, er automatisch eine entsprechende Meldung an die Minecraft-Clients sendet.

Für diese Aufgabe setzen wir den System- und Dienstmanager systemd ein. Er ist unter anderem verantwortlich für alle unter einem Linux-System wie Ubuntu laufenden Dienste vom Startvorgang bis zum Herunterfahren.

  1. Für die korrekte Dienstausführung müssen wir eine sogenannte Konfigurationsdatei erstellen.
    Gib folgenden Befehl ein, um eine neue Konfigurationsdatei zu erstellen und sie für die Bearbeitung zu öffnen.
    sudo nano /etc/systemd/system/minecraft@.service
    
    Anmerkungen
    Das @-Zeichen im Dateinamen minecraft@.service zeigt, dass systemd Argumente erwartet. In diesem Fall übergeben wir als Argument den Verzeichnisnamen 1.16.5 unserer Minecraft-Serverinstallation.
  2. Erfasse folgenden Text in der geöffneten Konfigurationsdatei.
    /etc/systemd/system/minecraft@.service
    [Unit]
    Description=Minecraft-Server %i
    After=network.target
    
    [Service]
    WorkingDirectory=/opt/minecraft/%i
    
    User=minecraft
    Group=minecraft
    
    Restart=always
    KillSignal=SIGCONT
    
    ExecStart=/usr/bin/screen -DmS mc-%i /usr/bin/java -Xms1G -Xmx4G -jar minecraft_server.jar nogui
    
    ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say Der Server wird in 30 Sekunden heruntergefahren. Begib dich an einen sicheren Ort."\015'
    ExecStop=/bin/sleep 5
    ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say Noch 25 Sekunden bis der Server heruntergefahren wird."\015'
    ExecStop=/bin/sleep 5
    ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say Noch 20 Sekunden bis der Server heruntergefahren wird."\015'
    ExecStop=/bin/sleep 5
    ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say Noch 15 Sekunden bis der Server heruntergefahren wird."\015'
    ExecStop=/bin/sleep 5
    ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say Noch 10 Sekunden bis der Server heruntergefahren wird."\015'
    ExecStop=/bin/sleep 5
    ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say Noch 5 Sekunden bis der Server heruntergefahren wird."\015'
    ExecStop=/bin/sleep 1
    ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say Noch 4 Sekunden bis der Server heruntergefahren wird."\015'
    ExecStop=/bin/sleep 1
    ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say Noch 3 Sekunden bis der Server heruntergefahren wird."\015'
    ExecStop=/bin/sleep 1
    ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say Noch 2 Sekunden bis der Server heruntergefahren wird."\015'
    ExecStop=/bin/sleep 1
    ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "say Noch 1 Sekunden bis der Server heruntergefahren wird."\015'
    ExecStop=/bin/sleep 1
    
    ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "save-all"\015'
    ExecStop=/usr/bin/screen -p 0 -S mc-%i -X eval 'stuff "stop"\015'
    
    [Install]
    WantedBy=multi-user.target
    
    Anmerkungen
    %i: Ein Platzhalterzeichen, das das übergebene Argument aufnimmt. Hier der Verzeichnisname 1.16.5 unserer Minecraft-Serverinstallation.
    Description: Beschreibt den Dienst. Die Beschreibung setzt sich aus dem Textteil «Minecraft-Server» und dem übergebenen Verzeichnisname 1.16.5 zusammen.
    After: Enthält das Ziel, das dieser Dienst erwartet. Und da es in unserem Fall um einen Minecraft-Server handelt, der seine Funktionen über das Netzwerk bereitstellt, ist das Ziel selbstverständlich das Netzwerk (network.target).
    WorkingDirectory: Bestimmt das Verzeichnis, wo dieser Dienst den Minecraft-Server ausführen wird. Auch hier ergänzen wir das Verzeichnis mit dem übergebenen Verzeichnisname 1.16.5.
    User, Group: Definiert den Benutzer und die Benutzergruppe, die dieser Dienst verwendet, um den Minecraft-Server auszuführen.
    Restart: Legt fest, dass dieser Dienst neu gestartet wird, wenn der Prozess selbst beendet oder unerwartet geschlossen wurde oder ein Time-out aufgetreten ist.
    KillSignal: Stellt sicher, dass dieser Dienst erst beendet wird, wenn der Minecraft-Server beendet wurde.
    ExecStart: Führt den Minecraft-Server im Hintergrund aus, wenn dieser Dienst gestartet wird.
    -DmS mc-%i: Startet eine neue Sitzung mit dem Namen mc-%i und trennt sie sogleich, um den Minecraft-Server im Hintergrund auszuführen.
    minecraft_server.jar: Wenn du optional Minecraft Forge einsetzt, musst du anstelle von minecraft_server.jar forge-1.16.5-36.1.0.jar verwenden.
    ExecStop: Führt den angegebenen Befehl aus, wenn dieser Dienst gestoppt wird. Zu Beginn veranlassen wir, dass der Minecraft-Server die Nachricht, dass der Server in 30 Sekunden heruntergefahren wird, an die Clients sendet (say-Befehl). Das wiederholen wir mit den entsprechenden Pausen (sleep-Befehl), bis die Zeit abgelaufen ist. Dann speichern wir die Welt (save-all-Befehl) und stoppen schliesslich den Minecraft-Server (stop-Befehl).
    eval: Untersucht den Text (zum Beispiel 'stuff "say Noch 10 Sekunden…"\015') und führt jedes Argument als separaten Befehl (stuff, siehe auch Weitere screen-Befehle kurz erklärt) aus.
    \015: Oktal-Code für Enter.
    WantedBy: Legt fest, wann dieser Dienst gestartet wird (multi-user.target: für Mehrbenutzersysteme mit oder ohne grafische Anmeldung).
  3. Nachdem du die Konfigurationsdatei erstellt hast, lädst du den System- und Dienstmanager neu.
    sudo systemctl daemon-reload
    
  4. Jetzt startest du den Minecraft-Serverdienst und aktivierst ihn, damit er beim Booten von Ubuntu automatisch ausgeführt wird.
    sudo systemctl start minecraft@1.16.5
    sudo systemctl enable minecraft@1.16.5
    
    Anmerkungen
    1.16.5: Der Verzeichnisnamen unserer Minecraft-Serverinstallation.
  5. Den Dienststatus rufst du wie folgt auf.
    sudo systemctl status minecraft@1.16.5
    
  6. Um den Dienst zu stoppen, gibst du folgenden Befehl ein.
    sudo systemctl stop minecraft@1.16.5
    
  7. Wenn du nachträglich die Konfigurationsdatei änderst, musst du den System- und Dienstmanager neu laden.
    sudo systemctl daemon-reload