💻 Hatari auf Raspberry Pi ohne X11

➤ Martin Döring, zuletzt geändert, 14. Juni 2022
Hatari auf dem Raspberry Pi

Wir möchten auf einem Raspberry Pi 3B oder 4 ein minimales Linux-System installieren, welches nur dazu dient, uns einen Atari-ST-Emulator Hatari zur Verfügung zu stellen. Ziel gegenüber einer normalen Installation eines grafischen Raspberry Pi OS soll es sein, so wenig unnützes Zeug zu installieren, wie möglich, die beschleunigten grafischen Funktionen des Raspberry Pi trotzdem voll zu nutzen und im Endeffekt später einmal direkt in den Emulator zu booten, so dass der emulierte Atari ST mit EmuTOS und allem sonst, was wir auf dieser Basis noch on-top installieren können, voll im Vordergrund stehen.

Die Lösung einen Raspberry Pi als neuen und modernen Quasi-Atari ST zu nutzen ist vor allem deswegen interessant, weil es diesen Rechner für 30-40 Euro zzgl. Gehäuse, 5V-USB-Netzteil, Tasten und Maus gibt und er alles schon drin hat, was man den liebevoll gepflegten alten Ataris von 260ST bis Falcon heute teuer nachrüsten muss:

Wenn man einfach mal zusammenrechnet, was das alles kostet, dann weiß man, was einem so ein echter Atari-Retro-Liebling wirklich wert ist. Ich bin ja auch anfällig... ;-)

Was dieser Artikel nicht oder noch nicht umfasst:

Wer ein fertiges System dieser Art mit allem drum und dran wünscht, ohne selber alles im Detail verstehen zu wollen, dem kann ich sehr BeePi von Philippe empfehlen.

🌐 BeePI 2.0

Hier muss nur die MicroSD-Card geflasht werden und der Rest ist stark automatisiert und sehr durchdacht. Wer hingegen ein System auch verstehen möchte und es ggf. Stück für Stück selber aufbauen und optimieren möchte, der kann jetzt gerne weiter lesen.

Linux-Kenntnisse auf der Kommandozeile, Bedienung eines Editors etc. werden hier ebenfalls vorausgesetzt. Ein Fernzugang via ssh ist auch sinnvoll, um von einem anderen Rechner u.U weitere Daten, ROMs usw. einzuspielen.

Installation von Raspberry Pi OS

Zunächst holen wir uns von der Raspberry Pi Foundation den Raspberry Pi Imager, legen eine MicroSD-Card in unser Notebook ein (ggf. mit Adapter oder entsprechendem Lesegerät) und Flashen uns das Raspberry Pi OS lite auf unsere Karte. Also das System ohne grafische Benutzeroberfläche:

🌐 https://www.raspberrypi.com/software/

Ich habe dies alles mit der 64-Bit-Variante getestet, ob es mit 32 Bit auch funktioniert, habe ich noch nicht probiert.

Der Imager kann selber das System herunterladen und dann auf die MicrSD-Card speichern. Diese Stecken wir dann in unseren Raspberry PI, schließen Monitor, Tastatur und Maus an und starten diesen.

Als nächstes müssen wir unser frisches System, nachdem es gestartet ist und wir einige initiale Fragen beantwortet haben, in unser WLAN oder LAN holen. LAN ist einfach: Kabel vom router anstecken. Für's WLAN rufen wir raspi-config auf und konfigurieren das System:

sudo raspi-config
> 1 System Options
> S1 Wireless LAN

Hier geben wir dann unser WLAN an und das dazugehörige Passwort.

System-Vorbereitung

Das System werden wir nun auf den aktuellsten Stand bringen und neu starten:

sudo apt update
sudo apt upgrade
sudo reboot
sudo rpi-update (wg. EGL-Driver)
sudo reboot

Jetzt bereiten wir unseren Raspberry Pi so vor, dass er eine beschleunigte Grafik auf der Console hat:

$ sudo raspi-config
select '6 Advanced Options'
select 'A2 GL Driver'
select 'G2 GL (Full KMS)'
sudo reboot

Installieren, was wir an Entwicklungstools brauchen:

sudo apt install git cmake

Weitere Libraries installieren, die wir für SDL benötigen:

sudo apt install libudev-dev libasound2-dev \
libdbus-1-dev mesa-utils-extra  libegl1-mesa \
libdrm-dev libgbm-dev 

Die folgenden Videocore-Binary-Blobs sind normalerweise installiert und müssen nicht extra installiert werden. Hier nur zur Referenz:

sudo apt install libraspberrypi0 libraspberrypi-bin libraspberrypi-dev

Irgendwie gehört der Pfad unter /usr/local offenbar nicht mehr offiziell zum System, daher hier die Ergänzung für Libraries und Binaries, zur Ergänzung am Ende der Datei ~/.bashrc

$ export LD_LIBRARY_PATH=/usr/local/lib 
$ export PATH=$PATH:/usr/local/bin

Danach einmal ausloggen und wieder einloggen und schauen, ob die beiden Variablen für unseren Benutzer getzt sind mit:

echo $LD_LIBRARY_PATH
echo $PATH

SLD 2 Extract & build

Wir packen all unsere Quelltexte für SDL und Hatari in einen eigenen Ordner:

mkdir -p ~/src,
cd src

Jetzt holen wir uns als erstes die SDL2-Library mit Git:

git clone https://github.com/libsdl-org/SDL
cd SDL

Wir Bauen machen wir uns einen eigenen Ordner - reine Ästhetik:

mkdir -p build
cd build

Und nun konfigurieren wir unsere SDL2-Library so, dass sie nur auf der Console des Raspberry Pi läuft, aber nicht unter X11, Wayland oder woanders:

../configure \
--disable-pulseaudio \
--disable-video-vivante \
--disable-video-opengl \
--disable-video-wayland \
--disable-video-directfb \
--disable-video-vulkan \
--disable-video-metal \
--disable-video-cocoa \
--disable-video-rpi \
--enable-video-kmsdrm \
--enable-video-opengles 

make
sudo make install

SDL2 wird jetzt unter /usr/local installiert, damit sich unsere selbstgebauten Programme nicht mit den über den Paketmanager installierten vermischen.

Damit haben wir jetzt alles, was wir als Basis für Hatari brauchen.

Bau und Installation von Hatari aus dem Quellcode

Zunächst holen wir uns den Quellcode von Hatari, wieder mit Git:

cd ~/src
git clone https://git.tuxfamily.org/hatari/hatari.git/ 
cd hatari
mkdir -p build
cd build
../configure
make
sudo make install

Sind wir auf einer Console eingeloggt, können wir hier natürlich automatisch die Tastatur benutzen. Starten wir aber ohne Grafische Benutzerumgebung, wie Gnome, KDE, oder X11 ein grafisches Programm direkt, so benötigt dieses für die Benutzung von Eingabegeräten explizit eine Berechtigung. Der Benutzer ehält diese, indem wir ihn in die Gruppe "input" nehmen:

sudo usermod -aG input $USER
exit     # und neu anmelden

Jetzt haben wir alles, was wir benötigen, um Hatari auf der Linux-Console vom Raspberry Pi direkt zu starten:

hatari

Hatari automatisch starten beim Systemstart

Jetzt wollen wir erreichen, dass unser System beim Start gleich in den Hatari bootet und beim Beenden von Hatari mit F11 und Quit uns ein Menü mit weiteren Optionen zur Verfügung stellt, ob wir in eine Shell wollen, das System durchstarten oder ganz herunterfahren wollen.

Für alles hier folgende werden wir zunächst root User:

sudo -i

Wir legen uns eine eigene Gruppe und einen eigenen User "atari" an, unter dem Hatari später läuft und vergeben ein Passwort:

groupadd atari
useradd -g atari -d /home/atari -m -s /bin/bash -c "Atari User" atari
usermod -a -G sudo,video,audio,input atari
passwd atari    # Passwort setzen

Dann erlauben wir allen Benutzern in der Gruppe "atari", das System ohne weitere Eingabe eines Passwortes herunter zu fahren oder neu zu starten:

Dafür werden wir wieder root und legen folgende Datei an:

nano /etc/sudoers.d/010_hatari-nopasswd

mit diesem Inhalt:

# Allow users in group "atari" to stop the system
%atari ALL=NOPASSWD: /sbin/reboot, /sbin/poweroff

Dies wird erst nach Ausloggen und wieder Einloggen oder dem Neustart des Systems wirksam. Aber wir sind ja momentan sowieso nicht der User "atari".

Nun bauen wir ein Menü, welches uns später eine Wahl erlaubt, was wir nach dem Verlassen von Hatari tun wollen. Wir schreibe es in diese Datei:

nano /usr/local/bin/hatari-menu.sh

... mit diesem Inhalt:

#!/bin/bash

# Set paths for Hatari and SDL
export LD_LIBRARY_PATH=/usr/local/lib 
export PATH=$PATH:/usr/local/bin

# At first always boot into Hatari (delete if not liked)
hatari

# After closing Hatari, now give us a choice
while true
do 
    cmd=(dialog --keep-tite --menu "Hatari Menu" 11 12 4)

    options=(1 "Hatari"
             2 "Shell"
             3 "Reboot"
             4 "Shutdown")

    choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)

    for choice in $choices
    do
        case $choice in
            1) hatari ;;
            2) /bin/bash ;;
            3) sudo /sbin/reboot -f ;;
            4) sudo /sbin/poweroff -f ;;
        esac
    done
done

Jetzt machen wir unser Menü-Script ausführbar:

chmod +x /usr/local/bin/hatari-menu.sh

Damit dieses Menü funktioniert, müssen wir noch ein Kommando installieren, falls noch nicht geschehen, was uns die schönen Menüs später anzeigt:

apt install dialog

Um zu testen, ob unser Menü funktioniert, können wir es einmal per Hand aufrufen. Mit < strg > +C können wir es hart wieder stoppen bzw. da raus kommen - oder mit einem Reboot. ;-)

Und nun wollen wir, dass beim Start des Rechners auf der ersten virtuellen Console automatisch unser Menü erscheint, anstelle des Logins. Dazu legen wir wieder eine Datei an:

nano /etc/systemd/system/getty@tty1.service.d/override.conf

... und schreiben Folgendes hinein:

[Service]
ExecStart=
ExecStart=-/usr/local/bin/hatari-menu.sh
StandardInput=tty
StandardOutput=tty
StandardError=tty

Nun laden wir den System-Daemon neu und starten die Anzeige für TTY1 neu:

systemctl daemon-reload
systemctl restart getty@tty1.service

Jetzt sollten wir so weit sein, dass unser System in den Hatari bootet und wenn wir diesen mit F12 und Quit wieder verlassen, dann bekommen wir unser Menü, was wir als nächstes tun können

Natürlich muss Hatari noch mit einem EmuTOS oder anderem ROM ausgestattet werden, das muss irgendwo im Home-Verzeichnis des Linux-Benutzers "atari" liegen. Dieser Schritt und alle weiteren Schritte zur Einrichtung von Hatari sind genau so, wie überall bei Hatari.

Ab hier funktioniert Dein System im Grunde so, wie ein Atari mit einem modernen und flexiblen Unterbau. Viel Spaß mit Deinem neuen Hatari/EmuTOS-System.

Achtung!!! Bei Problemen kannst Du Dich immer über <strg>+<alt>+F2 an einer zweiten Console anmelden und Fehler beseitigen. Die Console tty1 ist vom Hatari belegt. Dies erreichst Du immer mit <strg>+<alt>+F1

Ich freue mich immer über Ergänzungen oder entdeckte Fehler. Kontakt siehe ganz oben.

Links

🌐 SDL2-Informationen zum Raspberry Pi
🌐 Direkte Benutzung von Videotreiber kmsdrm mit SDL2
🌐 EmuTOS als moderne Weiterentwicklung von TOS
🌐 Hatari Dokumentation
🌐 SDL2 on Raspberry Pi without X?

➤ Zurück
➤ Datenschutzinformation