Upgrade einer Minecraft-Welt erzwingen

Meine mittlerweile über fünfzehnjährige Minecraft-Welt Akaria, belegt speichertechnisch bereits etliche Gigabyte auf der Festplatte. Allerdings ist dies bei solchen gewachsenen Welten nicht unbedingt das Problem. Bedingt durch viele Upgrades der Minecraft-Server-Versionen und damit einhergehenden Änderungen, wie z.B. am Chunk-Format, befindet sich irgendwann ein buntes Sammelsurium an Daten in den Weltordnern. An sich ist dies kein Problem, da Chunks beim Laden im Spiel automatisch konvertiert werden.

Ein Teil der Minecraft-Welt Akaria

Allerdings kann dies bei vielen Chunks mit Performanceeinbußen verbunden sein und die Chunks könnten teilweise noch Daten enthalten, die nur aufgrund vorheriger Versionen in diesen schlummern, aber in dieser Form nicht mehr benötigt werden. In einem solchen Fall bietet es sich an ein Upgrade aller Chunks und Regionen zu erzwingen:

screen java -Xms16G -Xmx16G -jar server.jar --forceUpgrade --recreateRegionFiles --eraseCache

Durch den Screen-Befehl kann die Session im Hintergrund weiterlaufen, nachdem sie detached wurde (Strg + A, anschließend Strg + D; Wiederaufruf mittels screen -r).

Damit beginnt der Minecraft-Server die Entities, POIs und Chunks zu upgraden. Während dieses Vorgangs, der je nach Welt, etliche Stunden dauern kann, ist der Minecraft-Server nicht erreichbar. In der Log-Datei latest.log kann der Fortschritt verfolgt werden:

[20:21:17] [Server thread/INFO]: 3% completed (10558 / 343881 chunks)...
[20:21:18] [Server thread/INFO]: 3% completed (10613 / 343881 chunks)...
[20:21:19] [Server thread/INFO]: 3% completed (10661 / 343881 chunks)...
[20:21:20] [Server thread/INFO]: 3% completed (10736 / 343881 chunks)...
[20:21:21] [Server thread/INFO]: 3% completed (10818 / 343881 chunks)...
[20:21:22] [Server thread/INFO]: 3% completed (10869 / 343881 chunks)...
[20:21:23] [Server thread/INFO]: 3% completed (10906 / 343881 chunks)...

Während die Option forceUpgrade dafür sorgt, dass der Upgradeprozess überhaupt angestartet wird, sorgt recreateRegionFiles dafür das neue und saubere Region-Dateien erzeugt werden, anstatt die alten Dateien nur zu bearbeiten. Die Option eraseCache löscht cacheähnliche Daten aus den NBT-Daten, darunter unter anderem Heightmaps, BlockLight und SkyLight. Diese Daten werden beim Neuladen der Chunks im Server ebenfalls wieder neu erzeugt.

Ist der Vorgang am Ende abgeschlossen, kann der temporär gestartete Server beendet werden und der Minecraft-Server wieder im Produktivbetrieb gestartet werden. Durch das Upgrade, das Löschen der Caches und der Neuanlage der Regionen, sollten viele Altlasten und potenzielle Probleme aus den Daten entfernt werden. Dies schlägt sich im Endeffekt auch positiv auf die Performance des Spieles im Serverbetrieb nieder.

ELV Fibonacci-Uhr unter Linux ansprechen

Bei der ELV Fibonacci-Uhr handelt es sich um einen Bausatz für eine Fibonacci-Uhr. Diese kann über serielle Terminal-Befehle gesteuert werden. Auf der offiziellen Webseite werden allerdings nur Möglichkeiten angeboten das Ganze über Windows zu bewerkstelligen.

Die ELV Fibonacci-Uhr

Damit es unter Linux funktioniert, müssen ein paar kleinere Hürden genommen werden. In dem Gerät steckt ein CP210x-Chip für die serielle Kommunikation. Allerdings wird dieser auf Anhieb unter Linux nicht erkannt. Ein Aufruf von:

dmesg | tail -n 20

zeigt folgendes:

[   99.803450] usb 1-1: new full-speed USB device number 7 using xhci_hcd
[   99.928828] usb 1-1: New USB device found, idVendor=18ef, idProduct=e037, bcdDevice= 1.00
[   99.928865] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[   99.928883] usb 1-1: Product: Fibonacci-Clock FC1
[   99.928898] usb 1-1: Manufacturer: ELV
[   99.928911] usb 1-1: SerialNumber: 162b12d76ceeec11bd1331f90f611c40

Allerdings taucht kein Gerät unter /dev/tty* auf. lsusb zeigt ebenfalls, dass ein USB-Gerät entdeckt wurde:

Bus 001 Device 007: ID 18ef:e037 ELV Elektronik AG Fibonacci-Clock FC1

Damit das Gerät nun über das serielle Interface angesprochen werden kann, wird im ersten Schritt der Treiber in den Kernel geladen:

modprobe cp210x

Danach wird temporär ein neues Gerät erstellt:

echo 18ef e037 | sudo tee /sys/bus/usb-serial/drivers/cp210x/new_id

Nun kann sich über Screen (alternativ kann auch Picocom genutzt werden) mit dem Gerät verbunden werden:

screen /dev/ttyUSB0 115200

Zum Test kann dort das Kommando v abgesetzt werden. Kommandos wie das Zeitkommando (T12:01:01) sollten am besten am Stück eingefügt werden, da sie sonst automatisch als t-Kommando erkannt werden, welches die Zeit nur anzeigt.

Verwaiste Screen-Session entfernen

Der Befehl screen dient dazu Terminal-Sitzungen zu erzeugen, welche im Hintergrund weiterlaufen können. Allerdings kann es hierbei unter Umständen passieren, das eine solche Session verweist bzw. nicht mehr reagiert. In einem solchen Fall kann die Session beendet werden. Tritt dies bei mehreren Sitzungen auf, kann der Befehl:

screen -wipe

genutzt werden. Der Befehl überprüft alle laufenden screen-Sitzungen und entfernt die Einträge von abgestürzten oder nicht mehr existierenden screen-Sitzungen.

Videos im Terminal unter Ubuntu in MP3s umwandeln

Videos können unter Ubuntu mithilfe von FFmpeg einfach in MP3s umgewandelt werden:

ffmpeg -i file.mp4 file.mp3

Mithilfe von find kann diese Operation auch für ein komplettes Verzeichnis durchgeführt werden:

find . -iname "*.mp4" -type f -exec ffmpeg -i {} {}.mp3 \;

Da diese Operation einige Zeit in Anspruch nimmt, kann das Ganze auch mittels screen ausgeführt und so in den Hintergrund verlagert werden:

screen find . -iname "*.mp4" -type f -exec ffmpeg -i {} {}.mp3 \;

Laufenden Prozess zu screen überführen

Das Kommandzeilentool screen ist praktisch, da Prozesse, welche mittels screen gestartet wurden, auch nach dem Logout weiter laufen. Problematisch ist es, wenn ein Prozess ohne screen gestartet wurde und er nachträglich in screen überführt werden soll. Hierfür wird das Tool reptyr benötigt:

apt install reptyr

Mithilfe von reptyr ist es möglich eine Anwendung an ein neues Terminal zu binden. Um nun einen Prozess zu screen zu überführen, muss erst einmal eine neue screen-Instanz gestartet werden:

screen bash

Sobald die Instanz geöffnet wurde, kann der eigentliche Prozess neu zugewiesen werden:

reptyr PID

PID ist hierbei die Prozess-ID, welche sich mittels des ps-Kommandos ermitteln lässt. Alternativ kann dafür auch top oder htop genutzt werden. Damit wurde die Terminalsitzung und mit ihr der laufende Prozess in die screen-Sitzung überführt.