Streaming-Audio-Server – Ein Versuch

Die Folge 39.5 von Anfang September mit dem Thema „Mein eigener Server“ des c’t Uplink Podcasts hat auch bei mir wieder Lust auf einen eigenen Home-Server geweckt. In den letzten zwölf Monaten habe ich verstärkt auf meine digital gespeicherte Musiksammlung – also im Wesentlichen MP3-Dateien – zurückgegriffen. Sei es, weil mein einfacher, kleiner MP3-Player unerwartet kaputtgegangen ist und ich mir einen neuen kaufte, ohne dass ich die Ordnerstruktur mit den Musikdateien vorher noch vom alten Player auf einem Computer zwischenspeichern konnte, oder weil mein Hörinteresse insgesamt in dem benannten Zeitraum auch wieder von den Podcasts weg zu mehr Musik gewandert ist. Anders als viele andere möchte ich aber kein Network Attached Storage (kurz NAS) betreiben und habe es auch bisher noch nicht. Stattdessen habe ich die archivierten Dateien auf einer externen Festplatte gespeichert, wie viele einfache Computernutzer es auch handhaben. – Allerdings mit dem Unterschied, dass ich sie auf zwei externen Festplatten gespeichert habe, um immer wenigstens noch einen redundanten Datenträger zu haben, falls eine kaputtgeht. Der Nachteil gegenüber einem NAS ist aber, dass ich nicht von jedem Gerät immer sofort auf die Dateien zurückgreifen kann. Das liegt zum einen daran, dass die Gehäuse der externen Festplatten unterschiedliche Schnittstellen haben, und zum anderen daran, dass sie mit einem Apple Dateisystem formatiert sind. Je nach Computer und dem darauf installiertem Betriebssystem kann ich also nicht eine der externen Medien immer direkt anschließen, an dem ich sie verarbeiten möchte. Ich muss sie also immer an einen bestimmten Mac mit der richtigen Schnittstelle anschließen und die Dateien mittels einem flexibleren Wechseldatenträger wie einem mit dem Dateisystem exFAT formatierten USB-Stick auf meinen Zielcomputer übertragen, was sehr umständlich und zeitraubend ist. Ich muss nicht immer regelmäßig auf alle meine archivierten Dateien zugreifen, aber da es sich bei denen, wo es in letzter Zeit der Fall ist, um Audio-Dateien handelt, liegt doch der Gedanke nahe, einen Streaming-Server für Musik zu bauen, von dessen mit jedem Gerät sofort die gewünschte Musik abgespielt werden kann. Das sorgt außerdem dafür, dass wenn die Dateien nicht auf dem Endgerät vorhanden sind, sie auch nicht den begrenzten Festspeicherplatz des Endgeräts in Anspruch nehmen und auch die Backups dieser unnötig vergrößern.

Vor dreizehn Jahren habe ich mir für meinen ersten Home-Server das Alix.1C Embedded Board von PC Engines angeschafft. Anfangs einige Zeit mit NetBSD und später durchgängig mit OpenBSD betrieben, diente der Computer für irssi in einer Screen-Session, dann mal als Konsolen-Torrent-Client oder Tor Middle-Node und war meistens über dynamischen DNS aus dem öffentlichen Internet im eigenen Heimnetzwerk erreichbar. Auf die 32 Gigabyte CompactFlash-Karte, die ich einige Jahre später dazu gekauft habe, würde ich meine MP3-Sammlung zwar gespeichert bekommen, aber die Karten sind in ihrer Lese- und Schreibgeschwindigkeit sehr langsam gegenüber den moderneren Festplatten (späte IDE- und generell SATA-Laufwerke). Zum Glück habe ich aber noch irgendwo eine gebrauchte SATA-SSD mit 256 Gigabyte Speicherkapazität herumliegen. Da die Alix-Boards noch einen 44-Pin IDE Port für 2,5″ IDE-Laufwerke besitzt, bin ich das Wagnis eingegangen und habe mir für 12 Euro mal einen 2,5 Zoll SATA (Female) HDD Drive auf IDE 44 Pin Konverter bestellt. Ich war anfangs etwas skeptisch, aber so ein SATA auf 44 Pin IDE-Konverter funktioniert doch problemlos. Der einzige Nachteil, der durch den Konverter entstanden ist, ist der, dass er mit dem 2,5″ Medium die Höhe des schmalen Gehäuses etwas überschreitet und ich das System nicht mehr geschlossen bekomme. Das SATA-Medium wird durch den IDE-Controller vom Board wie ein IDE-Medium erkannt und angesteuert.

ALIX.1C Innenansicht

Ich habe in den letzten vier Jahren das Alix-System zwar nicht mehr nennenswert im Einsatz gehabt, aber vor gut zwei Jahren musste ich feststellen, dass das System von dem OpenBSD Installations-Image auf einem USB-Stick spätestens seit der damaligen Version 6.5 nicht mehr in der Lage ist zu booten. Was der Grund für den Fehler ist, konnte ich bis jetzt nicht herausfinden. Auch der Versuch von einem OpenBSD Installations-Image für die x86 64-Bit statt der x86 32-Bit hat nicht geholfen und die Gesamtsituation hat sich bis zu der vor gut zwei Wochen erschienen OpenBSD Version 7.0 nicht gebessert. Zum Glück hatte ich mir zu Anfang dieses Jahres die be quit! Bastel- und Retro-Workstation zusammengebaut, um von dem Installationsmedium aus zu booten und das System auf den Zieldatenträger zu übertragen. Der erste Boot-Vorgang von dem Zieldatenträger als Hauptdatenträger im Alix-System funktioniert dann zum Glück wieder fehlerfrei, sodass die weitere Konfiguration damit kein Problem darstellt.

2,5 Zoll SATA (Female) HDD Drive auf IDE 44 Pin Konverter

Mit dem nun nach wie vor unter OpenBSD betriebenen Alix-System als wirklich sinnvollen Home-Server habe ich mir auch das Ziel gesetzt, einen eigenen benutzerdefinierten Kernel zu kompilieren. Die Standard-Kernel der drei großen bekannten BSD-Systeme sind zwar schon wesentlich kleiner als die der großen bekannten Linux-Distributionen, aber in Hinblick darauf, dass das Alix-System nur 256 MiB Arbeitsspeicher besitzt, finde ich es nicht verkehrt, es noch Resourcen-schonender zu konfigurieren. Bisher hatte ich benutzerdefinierte Kernel unter NetBSD und zu Anfangs mal kurz unter FreeBSD erstellt. Die Verfahrensweisen und Abläufe sind aber prinzipiell bei allen BSD-Betriebssystemen identisch. Bei meinem jetzt unter OpenBSD 7.0 selbsterstellten Kernel habe ich die Treiber für alle auf dem Alix-Board verbauten Hardware-Komponenten beibehalten und alle diejenigen entfernt, die auch nicht auf dem Board verbaut wurden. Zusätzlich habe ich noch die Unterstützung für einige Dateisysteme entfernt, mit denen ich hier zu Hause eh nicht (mehr) mit dem Alix-System in Berührung kommen könnte (Linux ext2, UDF, CD9660 und NFS). Außerdem habe ich die Software-RAID Funktionalität entfernt und die Farbgebung für Kernel-Ausgaben auf den seriellen Konsolen von der standardisierten weißen Schrift auf blauen Hintergrund zu der für mich angenehmer zu lesenden weißen Schrift auf schwarzem Hintergrund. Ich hätte gerne noch alle Funktionalitäten des Point-to-Point Netzwerkprotokolls und die Unterstützung der VPN-Protokolle entfernt, aber der Kernel hat auf der Standardausgabe während des Boot-Vorgangs (noch) zu viele Fehler geworfen, auch wenn der Rest trotzdem funktioniert hätte. Trotzdem konnte ich die Größe des Kernels signifikant verkleinern. War die ausführbare Kernel-Datei des generischen Kernels noch fast 15 Megabyte groß, war die Datei meines Kernels nur fast 5 Megabyte groß. Während der generische Standard-Kernel im Arbeitsspeicher 20 Megabyte belegte, benötigte mein Kernel nur noch die Hälfte im RAM. Für die Statistik: Da der AMD Geode LX Prozessor – bassierend auf AMDs K7 Mikroarchitektur – nur 500 Megahertz, 2 mal 64 KiB Level-2 und nur 128 KiB Level-2 Cache besitzt, dauert der Kompiliervorgang des generischen Standard-Kernels von OpenBSD 7.0 zwei Stunden und 55 Minuten. Der Kompiliervorgang meiner Kernel-Konfiguration hat dann nur noch 41 Minuten gedauert.

Ich habe mir gedacht, dass es prinzipiell nicht verkehrt sein kann, dass auf dem Alix-Home-Server auf alle Fälle auch ein FTP-Server verfügbar sein sollte, denn schließlich will ich die MP3-Dateien von der an einen meiner Mac’s angeschlossenen, externen Festplatte auf den zukünftigen Musik-Streaming-Server übertragen, beziehungsweise die MP3-Dateien auf einen mobilen Computer oder Abspielgerät für unterwegs herunterladen. – Wie gesagt, ich möchte nicht immer jedes Mal eine der beiden externen HDDs herauskramen müssen.

ALIX.1C mit SATA zu 44 Pin IDE Konverter und 2,5″ SATA-HDD

Da ich mich alleine in meinem privaten Heimnetz befinde, habe ich auf eine Transportverschlüsselung für FTP verzichtet. Nachdem ich meine MP3-Sammlung also via FTP auf dem Server transferiert habe, musste ich feststellen, dass beim Versuch die MP3s via FTP zu lesen und wieder auf ein Endgerät zu kopieren, der FTP-Client bei einigen Dateien Fehlermeldungen ausgab. Offensichtlich sind bei dem Transfer der Dateien auf den FTP-Server bei den betroffenen Dateien einige Bits gekippt. Erst nachdem ich auf dem FTP-Server die Sammlung gelöscht und anschließend die Dateien statt via FTP mit scp erneut auf den Server transferiert habe, funktionierten sie auch alle ausnahmslos. Die effektive Transferrate bei scp ist allerdings etwas geringer als bei FTP, sodass der Datei-Transfer auch etwas länger dauert, aber das macht nichts.
Für den eigentlichen Streaming-Audio-Server hatte ich mir zwei Software-Lösungen ausgesucht.: Den Icecast, welcher von Internetradios gern für das Streamen verwendet wird, und die Media-Streaming-Weboberfläche Ampache.

  • Ampache: Ampache ist ein Kofferwort aus Amplifire und dem bekannten Web-Server Apache. Mit Ampache kann man seine Musik-Bibliothek verwalten, ähnlich wie mit iTunes und bietet verschiedene Berechtigungsstufen. Es ist aber auch möglich, eine Playliste als reinen HTTP-Stream in einem Netzwerk zur Verfügung zu stellen. Von den Entwicklern wird nur Linux und FreeBSD unterstützt. Unter FreeBSD habe ich Ampache nicht zum Laufen bekommen, sondern leider nur unter einem Debian 10 Buster, was schon unter die Kategorie old-stable fällt. Ich hatte mir schon gedacht, dass die 500 Megahertz und 256 MiB RAM der Alix zu wenig sind für Webserver, PHP und SQL-Datenbank sind. Die ganze Implementation ist zwar nicht sehr schnell, aber es funktioniert wie es soll. Problematisch bei der begrenzten Rechenleistung wird es aber mit ffmpeg. Bei einer MP3-Datei mit 320 kbps und einer Spielzeit von zwei Stunden hat sich dann der ffmpeg-Enkoder verschluckt und der Prozessor lief am Limit. Konnte Ampache dann wieder andere, kleinere MP3-Dateien mit ffmpeg verarbeitenund abspielen, sah es so aus, dass von den großen MP3s noch ffmpeg-Zombieprozesse übrig blieben, die es zu killen galt. Für das Alix-System dann doch keine so zufriedenstellende Lösung.
  • Der Icecast-Server ist prinzipiell so ausgelegt, dass er aus einer Audioquelle an der Soundkarte einen HTTP-Livestream ins Netz stellt. Icecast kann aber auch von Audio-Dateien einen Stream erzeugen. Dafür ist eine Textdatei nötig, die als Playliste fungiert. Um sich spontan eine Liste zusammen zustellen ist dies aber doch etwas umständlich. Da auch Icecast sich ffmpeg bedient, wird das auch hier wieder der Bottleneck bei großen Audio-Dateien sein, auch wenn Datenbank und PHP nicht nötig sind.

Da ich auf meinen Desktop-Computern relativ kleine und schlanke Medienplayer mit einer einfachen Listenfunktionalität benutze, die Drag-and-drop fähig sind, wollte ich mal ausprobieren, wie diese damit klarkommen, wenn sie direkt auf die Dateien von einem gemounteten FTP-Share zugreifen sollen. Sowohl der ältere Cog als auch der moderne IINA laden alle Dateien immer vollständig. Sind es viele auf einmal wie zum Beispiel ein Ordner mit 200 Stück, sind die Player je nach Menge zu Anfangs immer etwas ausgelastet. Der Vorteil: alle ID3-Tags und weitere Meta-Daten wie Album-Cover sind verfügbar. Der Nachteil ist, dass das Hörvergnügen zu Anfangs kurze Startschwierigkeiten haben kann.
Der VLC Media Player verhält sich da schon ganz anders. Bei dem Lesen der Dateien von einem FTP-Share wendet dieser tatsächlich das Streaming-Prinzip an. Das heißt, dass er kontinuierlich immer nur das benötigte Stück der Audio-Datei lädt. Damit werden die langen Ladezeiten eliminiert. Die Nachteile sind aber, dass er erstens die Meta-Daten von den Dateien nicht lädt, zweitens kommt der VLC überhaupt nicht damit klar, wenn die Dateinamen sich mit Zeichen aus der aktuellen UTF-Implementation bedienen, die nicht mit den Buchstaben des ASCII-Codes übereinstimmen. Kurz gesagt: enthält der Dateiname beispielsweise einen Akzent über einem Vokal oder er enthält einen kyrillischen Buchstaben, kann der VLC Media Player die Datei nicht lesen.

Fazit:
Alles in allem ist die Lösung, dass ich mit einem lokalem Medienplayer auf einem meiner Endgeräte auf die Dateien via FTP zugreife, für mich zurzeit die am gangbarsten. Allerdings werde ich extra für den VLC Media Player jetzt nicht alle Dateinamen mit Buchstaben aus dem ASCII-Zeichensatz ersetzen.

Links:

Kurzeinstieg zum ed-Editor

Nachdem ich vor ungefähr 11 bis 12 Jahren begann, mich mit der Bedienung des Texteditors vi für BSD-Unix und Linux anzufreunden, ist dieser auf einer Shell inzwischen auch für mich der Texteditor erster Wahl. Im Kontext einer Linux User Group hatte ich bereits damals mitbekommen, dass dieser Texteditor – sowie dessen weiterentwickelter Nachfolger vim – bei durchaus langjährigen Linux-Anwendern beziehungsweise -Administartoren sehr geschätzt wird, während Neulinge durch das ungewohnte Bedienungskonzept eher erst einmal irritiert und verschreckt reagieren und ihn dann mit Unverständnis begegnen.
Es ist durchaus interessant zu wissen, dass der vi zu einer Zeit entwickelt wurde, in der Computererminals mit einer Tastatur ausgestattet waren, die im Umfang an verfügbaren Tasten noch Schreibmachinen glichen und es eben noch keine Cursor-Tasten gab, um im Text zeilen- und spaltenweise den Cursor zu navigieren. Er arbeitet stattdessen kontextbasiert. Mit einem Befehlsmodus, einem Einfügemodus, bei dem der Text direkt bearbeitet werden kann, sowie dem Kommandozeilenmodus.

Zur Zeit beschäftige ich mich zunehmend mal mit Unix-Versionen, die inzwischen einen historischen Status genießen. Bei diesen ist zum einen vermutlich aus Speicherplatzgründen des Installationsmediums, und in einem anderen Fall auf Grund des enormen Alters der Unix-Version, kein vi vorhanden und stattdessen als einziger Texteditor der ed verfügbar.

Bei dem ed handelt es sich auch wie beim vi um einen kontextbasierten Texteditor. Allerdings arbeitet Dieser nicht Seitenbasiert mit den Text-Dateien, sondern nur zeilenorientiert. Das liegt daran, dass er natürlich älter als der vi ist, und zu einer Zeit Anfang der 1970er Jahre von Ken Thompson mit Unix mit entwickelt wurde, als die Programmierer die Computer noch mit einem Fernschreiber als Ein- und Ausgabegerät bedienten und noch keine elektrischen Bildschirmterminals zur Verfügung standen, die Dateien seitenweise ausgeben konnten.

Vor vielen Jahren bin ich dann beim Durchstöbern des Internets auf eine ISO-Datei gestoßen, die für einen normalen PC bootfähig ist und einen etwa 10 Megabyte großen Emulator zur Ausführung des ‚Unix Time-Sharing System Seventh Edition (V7)‘ vom Januar 1979 beinhaltet. Bei dem Emulator habe ich dann damals recht schnell wieder das Handtuch geworfen, weil ich trotz meiner bereits bestenenden Erfahrung hinsichtlich der Bedienung des vi’s zusätzlich nur mit der zeilenweisen Ausgabe einer Textdatei nicht zurecht kam.

Vor ein paar Tagen habe ich schließlich noch einmal einen Versuch erfolgreich gestartet und mich mit den wichtigsten Befehlen – beziehungsweise dessen Kommandozeilenmodus vertraut gemacht. Als Einstieg hat mir dabei auch der Beitrag „Eine Anleitung für Anfänger zur Verwendung des ed Editor unter Linux“ des Blog’s HowtoForge geholfen.

Die wichtigsten Kommandos und Befehle habe ich mir auch noch einmal zusätzlich in eine eigen kleine Tabelle ins Wiki gestellt.
Link: – Kurzübersicht ed Editorkommandos (eigenes Wiki)

Weitere Links:
Ersterfahrungen mit NetBSD (Blog-Artikel vom 25. Oktober 2008)
Texteditor vi (dt. Wikipedia)
Texteditor vim (dt. Wikipedia)
Texteditor ed (dt. Wikipedia)
Eine Anleitung für Anfänger zur Verwendung des ed Editor unter Linux (HowtoForge)

Tastatur-Layouts unter dem X Window System

Gestern Abend habe ich mal wieder meine BSD-Grundkenntnisse mit dem aktuellen Release von NetBSD aufgefrischt. Für die Einstellung des verwendeten Tastatur-Layouts bin ich bei meiner Internetrecherche auf die Manpage des OpenBSD-Befehls xkeyboard-config gestoßen. Wobei eine Auflistung der am meisten gebräuchlichsten Tastatur-Modellen und -Layouts für die Sprache eigentlich in jedem Betriebssystem und Anwendungsprogramm zur Bearbeitung von Texten enthalten ist. Aber in keinem Dokument habe ich sie so übersichtlich veranschaulicht gesehen. – Meine Güte, es gibt – oder es gab zumindest mal – ein ‚Yahoo Internet Keyboard‚?

Mehr noch: Neben Tastatur-Typ und -Layout gibt es noch Möglichkeiten zur Konfiguration für einen Wechsel zwischen unterschiedlichen Sprach-Layouts mit bestimmten Tastenkombinationen, der Konfiguration über das Verhalten der Windows-Taste, oder der Kompatibilität zu dem Tasten-Code von Sun’s alten Solaris-Betriebssystem.

Es gibt in der Konfiguration von Spracheinstellungen, sowie Zeichensätzen, bei Betriebssystemen und Anwendungen so einige tiefe Fässer, in die ich nicht gerne hineinschaue, weil man für den korrekten Betrieb einiges Beachten muss. Aber diese Manpage von OpenBSD hat zumindest mir etwas Licht in das Dickicht zu den Einstellungsmöglichkeiten einer Tastatur gebracht.

Links:
Guide Konfiguration X Window System unter NetBSD
Manpage setxkbmap NetBSD
Guter tabellarische Übersicht der Tastaturlayouts in OpenBSD

Ich habe die tabellarische Übersicht der OpenBSD-Version zusätzlich mal in mein Wiki eingepflegt.:
https://sommteck.net/wiki/doku.php?id=openbsd:manpage_xkeyboard-config

Mittels Nullmodem auf eine Alix mit OpenBSD

Ich habe mir ja vor einer Ewigkeit diesen hübschen Embeddded-Computer zugelegt. Gegenüber damals bin ich aber irgendwann von Net- auf OpenBSD umgestiegen. Weil ich aber inzwischen der Auffassung bin, möglichst wenig Ballast anzusammeln und herum zuschleppen, habe ich mich weitestgehend von unnötiger Peripherie-Hardware wie Ein- und Ausgabegeräte und anderem Zeug getrennt. Nun betreibe ich diese Box in einer Umgebung, wo es weder Monitor oder Tastatur gibt. Da sie aber noch über eine hinausgeführte serielle RS-232-Schnittstelle verfügt, sollte man den Kram eigentlich auch nicht benötigen. Wenn der Rechner gerade aus Gründen nicht über ein Netzwerk erreichbar ist, so hat man dennoch die Möglichkeit via USB-Seriell-Adapter und Nullmodemkabel sich auf dem Gerät einzuloggen. Folgende Einstellungen müssen Betriebssystemseitig unter OpenBSD gemacht werden.

In der Datei /etc/ttys die Zeile:

tty00   "/usr/libexec/getty std.9600"   unknown off

nach

tty00   "/usr/libexec/getty std.9600"   vt220   on  secure

abändern.

Die Datei /etc/boot.conf erstellen oder bearbeiten und folgende Zeile hinzufügen:

set tty com0

Damit wird auch der Boot-Prozess über die serielle Leitung übertragen. Leider funktioniert das bei mir noch nicht, weil die Boot-Loader Input-/Output-Fehler wirft, denen ich bisher nicht auf den Grund gekommen bin.

Was ich aber ziemlich advanced finde, dass selbst die Initialisierung der Hardware und auch der Zugriff auf das BIOS-Setup über die Serielle Konsole erfolgen kann. Dafür muss lediglich im „BIOS Advanced Features“-Menü die Option „Console Redirection“ auf Enabled gestellt werden. Die Baudrate sollte natürlich identisch mit der des Betriebssystems und dem Terminal-Emulators sein.

Serial-Boot_BIOS_0

Serial-Boot_BIOS_1

Serial-Boot_BIOS_2

Serial-Boot_BIOS_3

Anders als hier aufgeführt, kann man die Baudrate natürlich auch bis auf 115200 Baud herauf setzen, da auf Dauer die 9600 sehr langsam erscheinen – auch wenn es einen gewissen Nerd-Faktor und fast einen meditativen Charakter besitzt, dem Bildschirm beim zeilenweisen Aufbau zu zusehen.

Ob das Ganze auch mit den moderneren UEFI’s geht, weiß ich jetzt nicht. Cool wäre es!

Quelle im OpenBSD FAQ:
http://www.openbsd.org/faq/faq7.html#SerCon

SIGINFO

Durch eine der letzten FreakShow-Podcastfolgen bin ich auf ein tolles Feature hingewiesen worden. Wenn sich im Terminal ein laufender Prozess befindet, so kann man durch Drücken der Tastaturkombination <Ctrl> + <T> eine Abfrage an diesen sich seinen aktuellen Status anzeigen lassen.
Ursprünglich unter DEC’s VMS implementiert, wurde diese Funktion später in den Terminaltreiber von 4.3BSD übernommen.
Wie in dem folgendem Screenshot zu sehen, besitzt das Unix-Programm dd für SIGINFO sogar einen eigenen Handler.

dd mit SIGINFO

dd mit SIGINFO

Leider gibt es die Funktion nur auf allen BSD-Systemen, bzw. deren Derivaten wie OpenBSD und Mac OS X, aber nicht unter Linux.