Skip to content

Network Bonding, Bridges und virtuelle Maschinen

^ v M ><
Bonding ist super: mehrere Netzwerkkarten können zu einer zusammengefasst werden, um Geschwindigkeit oder Ausfallsicherheit zu erhöhen. In meinem Fall wollte ich einfach etwas mehr Speed für virtuelle Maschinen.

An sich ist die Konfiguration super simpel und gemäss Debian Wiki vorzunehmen. Das funktioniert mit dem Bonding-Mode balance-rr u.U., aber nicht mit virtuellen Maschinen, wenn diese mit dem Bonding-Interface an eine Bridge gehängt werden. Das resultierte in meinem Fall in:
br1: received packet on bond0 with own address as source address


Die Empfehlung lautet, stattdessen den Modus 802.3ad zu verwenden, sofern vom Switch unterstützt. Bei meinem Procurve 1810G muss dazu unter Trunks -> Trunk Configuration ein Trunk mit Mode "LACP Active" erstellt werden. Diesem werden alle Switchports zugewiesen, woran die im Bond verwendeten Netzwerkkarten hängen.

Damit nun das Bonding-Interface mit 802.3ad auch richtig initalisiert wird, fehlt dem System u.U. noch das Paket "ethtool", welches ebenfalls installiert werden muss:
aptitude install ethtool


Eine Kontrolle von /proc/net/bonding/bond0 zeigt, dass das Bonding-Interface jetzt korrekt hochfährt und die Slave-Interfaces einbinden kann (MII Status: up)

Neue SSL Zertifikate

^ v M ><
Da Google in seiner göttlichen Herrlichkeit beschlossen hat, dass Chrome ab Januar 2014 nur noch Zertifikate mit einer Laufzeit von maximal 5 Jahren akzeptieren wird, durfte ich alle meine 10 Jahre lang gültigen selbtsignierten Zertifikate ersetzen.

So ein Austausch ist natürlich auch eine Chance, alles besser zu machen. Die Zertifikate sind jetzt nicht einfach plumpe Wildcards für *.planetknauer.net, sondern mit zustäzlichen mit subjectAltName für planetknauer.net und die IP-Adresse des Hosts versehen. Die CA ist neu auf meine administrative Domain ausgestellt, somit wird auch das neue CA-Zertifikat benötigt. Ich empfehle naiven Personen (oder solchen, die mir aus anderen Gründen vertrauen) dieses zu installieren, statt einer Ausnahmeregel für meine Domain hinzuzufügen.

Die Zertifikate für alle anderen Dienste werden bei Gelegenheit auch ersetzt.

Moderne Velobeleuchtung

^ v M ><
Hier mal wieder ein typisches Beispiel von "Murphy trifft auf geplante Obsoleszenz": Pünktlich zum Herbstbeginn hat die Beleuchtung meines teuren Velos von einem Tag auf den anderen den Geist aufgegeben. Zu machen war da nichts mehr, also kurz in die Werkstatt gebracht. Meinung des Mechanikers nach erfolgreicher Reparatur: "Tja, da ist bei der vorderen Lampe die Glühbirne durchgebrannt. Daraufhin hat das LED-Rücklicht zu viel Strom abgekriegt und ist ebenfalls durchgeschmort." Die Rücklichteinheit musste komplett ersetzt werden. Bei meinem billigen Bahnhofsvelo hat es gereicht, die Glühbirne zu wechseln...

a) Ist es ja nicht so, dass man das Rücklicht durch eine austauschbare Sicherung oder einen Widerstand hätte schützen können...
b) Das Rücklicht war nota bene als "wartungsfrei" angepriesen. Merke: Wartungsfrei = nicht reparierbar.

Mobiles Internet in Deutschland

^ v M ><
Gelegentlich tritt man ja über die Grenze des geheiligten Heimatlandes und betritt den gefährlichen Boden des Nachbarn. Gefährlich, weil man dann mit Roaminggebühren gnadenlos geschröpft wird. Aber hey, die Abhilfe heisst da wie immer: lokale SIM-Karte kaufen. Nix ist einfacher.

Da ich nur für ein paar Stunden in Deutschland war, habe ich im Vorfeld kurz geschaut, welcher Tarif denn optimal wäre und wo ich die passende SIM in der Gegend meines Aufenthaltortes kriegen sollte. Die Recherche ergab, ein grösseres Einkaufszentrum in Nähe des Hotels müsste sowas führen. Also gleich hin und rumgefragt, wo man das denn kriegen könnte, nämlich an der Kasse. Dort geschaut. Ja, SIM-Karten diverser uninteressanter, da für meinen Bedarf zu teurer Anbieter gibt es wie Sand am Meer, nur das gewünschte fehlt. Der Kassierer meinte daraufhin, ich sollte mich doch mal an die Kundeninformation wenden.

Gut, dorthingegangen und die Dame gleich mal überfordert: "Hach, da fragen Sie mich aber was!!!". Sie ruft in der Zentrale an und drückt mir den Höhrer in die Hand, ich solle doch am besten selbst sagen, was ich denn brauche: "Ein SIM-Karte von X." Rückfrage: "Also Guthaben? Ja das haben wir." Ich: "Nein, die eigentliche SIM." Antwort: "Da muss ich an der Zentralkasse nachfragen. Ich rufe zurück."

5 Minuten später dann die Antwort: "Leider ausverkauft."

Aaaaaaaaaaaaaaaaargh! Wird das jetzt zum Running Gag oder was?

Eigene Root-CA zu Chrome/Chromium hinzufügen

^ v M ><
Da hat sich Google doch einige Mühe gegeben, das Prozedere möglichst umständlich zu gestalten. Für Debian gilt:
als root:
aptitude install libnss3-tools

als user:
wget http://example.com/example-ca.crt
certutil -d sql:$HOME/.pki/nssdb -A -t"C,," -n example.com -i example-ca.crt

Und danach Chromium neu starten.

Mehr Parameter und generelle Instruktionen gibt's hier

In Firefox geht das Klickibunti!

Spass mit BIOS Updates

^ v M ><
Als ich meinen Desktop und Server zusammenstellte, hatte ich bewusst für beide Geräte das gleiche Mainboard verwendet. Somit muss ich alle Mainboard-bedingten Probleme nur einmal lösen. Soweit hat das alles ganz gut funktioniert, aber unterdessen hat der Hersteller ein paar BIOS-Updates herausgegeben, welche Performance und Stabilität (nicht, dass das ein Problem wäre) verbessern würden. Na dann, spielen wir die mal ein. Da das Board von flashrom unterstützt wird, geht das total simpel direkt von Linux aus.

Erst das alte BIOS sichern:
flashrom -r old-bios.rom

Dann das neue BIOS flashen:
flashrom -w new-bios-image.rom

Vor einigen Wochen war erst der Desktop fällig. Nach dem Neustart durfte ich feststellen, dass die MAC-Adresse der Netzwerkkarte sich geändert hatte. Das ist halb so wild, da wird die /etc/udev/rules.d/70-persistent-net.rules gelöscht oder modifiziert und anschliessend neu gestartet.

Heute war der Server dran. BIOS geflasht, die udev-Regeln gelöscht, neu gestartet, alles bestens. Per SSH versucht anzumelden. Geht nicht. hmmm. Mal die Netzwerkkarten geprüft. Alles bestens. Ping von Server und Desktop zu jedem anderen Host klappt, nur nicht untereinander. dmesg geprüft:
br0: received packet on eth0 with own address as source address

Nochmals genau hingeschaut und ifconfig eth0 auf beiden Maschinen eingetippt und die MAC-Adresse genauer angeschaut. Un-glaub-lich! Identisch auf beiden Kisten. Die Deppen bei Asus haben es doch tatsächlich fertiggebracht, ein BIOS-Image zu verteilen, in welchem die MAC-Adresse für die onboard-Netzwerkkarte hartcodiert ist! Ja ist es denn wirklich so viel zuviel verlangt, wenigstens ein Mal mit Profis (oder zumindest nicht komplett inkompeteten Amateuren) zu arbeiten???

Würgaround:
ifconfig eth0 hw ether 00:e0:12:34:56:77

Unter Debian macht man dies permanent durch einen Eintrag in der /etc/network/interfaces:
allow-hotplug eth0
iface eth0 inet dhcp
hwaddress ether 00:e0:12:34:56:77

Nicht mehr ganz so trivial wird das, wenn nun eth0 gebridged wird, damit KVM oder XEN Virtual Machines das Netzwerk mitbenutzen können. In diesem Fall ist eth0 nicht in der interfaces konfiguriert (bzw auf manual gesetzt), so dass jegliche Einträge aus der Sektion nicht gelesen werden. Hier muss der Konfiguration von br0 ein pre-up Befehl mitgegeben werden:
iface eth0 inet manual

auto br0
iface br0 inet static
pre-up ifconfig eth0 hw ether 00:e0:12:34:56:77
bridge_ports eth0
address 192.168.0.XXX
netmask 255.255.255.0
gateway 192.168.0.XXX

Lazy mount für NFS

^ v M ><
Mit den Standardoptionen macht ein Systemstart mit per NFS verbundenen Laufwerken nur so lange Spass, wie der Server erreichbar ist. Ist der Server bzw das Netzwerk nicht erreichbar, so führen die Standardoptionen dazu, dass Debian während dem Systemstart minutenlang versucht zu mounten - und in der Zwischenzeit nicht weiterbooten will. Die Mountversuche lassen sich auch nicht mit CTRL-C oder anderen Tastenkombinationen abbrechen. Da kann man nur warten und sich ärgern... oder die /etc/fstab gleich von Anfang an mit den richtigen Optionen ausstatten.

Jetzt schauen meine Einträge für NFS-mounts so aus:
nas:/storage /mnt/storage nfs4 bg,retry=0,timeo=2,_netdev 0 0

Was passiert hier? Die Freigabe /storage vom Server nas wird nach /mnt/storage per NFS4 eingebunden. Schlägt der erste Mountversuch fehl (retry=0), geht der Mountprozess in den Hintergrund (bg) und versucht es dort weiter. Als Fehlschlag wird der Mountversuch gewertet, wenn die Antwort vom Server nicht innert 0.2s eintrifft (timeo=2). retry=0 zu setzen ist ganz wichtig, da der Wert bei Verwendung von bg standardmässig auf 10000 Minuten gesetzt ist. Da wartet man im dümmsten Fall fast eine Woche lang.
_netdev sorgt dafür, dass ein Mountversuch erst stattfindet, nachdem das Netzwerk gestartet wurde.

Sehr nützlich ist das auch für Notebooks.

Falls das Serverlog daraufhin Fehlermeldungen der Art "rpc-srv/tcp: nfsd: sent only 180288 when sending 524352 bytes - shutting down socket" enhält, sollte der Wert für timeo etwas erhöht werden.

Lesematerial dazu:
man 5 mount

Mobiles Internet in Schweden

^ v M ><
Wieder einmal stand das Sweden Rock Festival auf dem Reiseplan. Diesmal bin ich mit einem Smartphone bewaffnet hingefahren. Meine tolle Idee: Wenn man schon eine schlaues Telefon hat, dann kann man ja auch jederzeit das Wetter abrufen (hey, es kann heute heiss und morgen kalt und regnerisch sein). Oder den Freunden zuhause schöne Fotos von geilen Konzerten in Echtzeit unter die Nase reiben.

Da ich kein Multimilliardär bin, musste folglich eine schwedische SIM-Card her. Nichts leichter als das meint das Internet und diverse Reiseberichte meinen dann auch, dass man da nur ins nächste Pressbyrån oder 7-11 müsste um dort eine Karte zu erwerben. Gesagt getan, also erst mal die Zeit in Malmö mit Kartensuche totgeschlagen.

Erster Versuch: Das Pressbyrån in Malmö C. "Ja, wir haben SIM-Karten. Ja, auch für Smartphones. Natürlich mit mobilem Internet. Ööööhm, leider sind wir grad ausverkauft. Versuchs doch im Coop Nära ums Eck."
Zweiter Versuch: Der Coop Nära in Malmö C: "Ja, wir haben SIM-Karten. Ääääh oder auch nicht, alles schon weg. Sorry. Versuch's doch mal im 7-11 da drüben, 500m weiter."
Dritter Versuch: Die Touristenfalle neben dem Bahnhof. Draussen hatte der ein Schild, dass er SIM-Cards hätte. Also reingegangen und den geschäftstüchtigen südosteuropäischen Ladeninhaber ausgequetscht: "Yes of course I haaave SIM-Card. Yesyes, with mobile data. I will give you card for 49 crown, data plan costs 70 crown and I will charge som crowns for phonn colls. So I will give you for 150 crown. Ohhh you need for smartfonn? Idontkno! How many megabytes? Idontkno! How long valid? Idontkno!" Das war mir nun doch etwas zu wenig präzise, also doch weiter zum 7-11.
Vierter Versuch: Der 7-11 in Malmö: "Ja, wir haben SIM-Karten. Oooh, hier vorne haben wir nichts mehr. hmmmm, ich schau mal im Lager hinten. Nein, sorry, wir haben nichts mehr."
Na schön, weitergefahren nach Sölvesborg und weiterversucht.
Fünfter Versuch: Das Pressbyrån in Sölvesborg: "Natürlich haben wir SIM-Karten. Ich muss nur rasch hinten eine holen gehen. Uuuups sorry, keine mehr da!"
Sechster Versuch: ICA in Sölvesborg. Die hatten doch tatsächlich SIM-Karten, sogar die ganz günstigen von Telenor. Leider nur im grossen Format, keine Micro-SIM. Unterdessen war ich aber angefressen (oder verzweifelt?) genug, um die zur Not mit dem Sackmesser in die richtige Grösse zu schneiden. Aber eine Chance hatte ich noch:
Siebter Versuch: Coop in Sölvesborg: Tadaaaaa! Die hatten SIM-Karten. Für Smartphones ("all phones except iPhone5" stand auf dem Post-IT auf dem vordersten Umschlag). Von Telenor für 49SEK. Inkl. 1 Woche mobile data. Nur letzterer Punkt war nicht genau aufgeführt, also waren die drei Verkäuferinnen im Laden erst mal 15 Minuten lang damit beschäftigt, herauszufinden, was die Karte genau kann und alles beinhaltet. In dieser Zeit stand der Laden komplett still. Glücklicherweise bestand die Kundschaft zum grössten Teil aus schwedischen Senioren, welche dank 18h langen Tagen auch keinerlei Eile hatten und das sehr locker nahmen. Die freuten sich sogar darüber, mal mit jemandem zu reden, der extra von weitweither ins schöne Schweden kommt.

Leider währte die Freude über den Kauf nicht zu lange. Dienstag und Mittwoch war die Leitung noch frei. Doch schon am Donnerstag waren so viele skandinavische Smartphonebesitzer im Einzugsgebiet des Festivals, dass das Mobildatennetz komplett zusammenbrach. Selbst die zwei mobilen Funkmasten, welche extra links und rechts des Festivalgeländes aufgestellt wurden, konnten gegen diese Smartphoneinvasion nichts ausrichten. Wenn ich ab und zu mal ein Mail erhalten konnte, war das schon riesiges Glück. Wetterbericht abrufen? Nix da! Ein Foto per Email verschicken? Denkste! Erst Samstag nachts nach dem letzten Konzert gab es laaaaangsam wieder eine Verbindung.

Interessant an schwedischen Prepaid-Angeboten: Eine Registrierung mit Pass/ID ist absolut nicht nötig. Ein Wunder, dass das Land noch nicht von pösen Terroristen überschwemmt wurde!!!

Raspberry Pi Netzwerkdurchsatz maximieren

^ v M ><
Der Raspberry Pi ist aufgrund von Preis, Ausstattung und Grösse prädestiniert für kleinere embedded-Konfigurationen im Netzwerk. Leider scheint in der Standardkonfiguration der Netzwerkdurchsatz trotz 100Mbit-Adapter nicht komplett ausgereizt zu werden. Bei meinen Tests mit NFS, Bridging-Durchsatz (mit zusätzlicher USB-Netzwerkkarte) oder ipperf bin ich auf maximal ca 50Mbit/s gekommen. Etwas dürftig. Aber dafür gibt es eine Lösung: übertakten! Die neueren Firmware-Versionen und raspi_config lassen es zu, dass der Raspberry ohne Garantieverlust übertaktet werden darf. Allerdings ist der Nachteil weiterhin, dass der Stromverbrauch steigt, auch wenn der Raspi grad nicht arbeiten muss. Auch dem kann abhilfe geschaffen werden durch dynamisches Übertakten bzw Nutzung von Powermanagement wie man es aus der x86-Welt in Notebooks und Desktops kennt. Hierfür habe ich folgende Konfiguration verwendet:

Für dynamische Taktung wird eine Untergrenze und ein Höchsttakt in der /boot/config.txt definiert. Ich war da etwas kreativ und habe den Ruhetakt etwas heruntergesetzt, ebenso RAM und die kaum genutzte GPU etwas gedrosselt:
arm_freq_min = 500
arm_freq = 900
core_freq_min = 200
core_freq = 300
gpu_freq_min=200
sdram_freq_min = 350
sdram_freq = 450
over_voltage = [-2,2]
Mehr Einstellungsmöglichkeiten und die Standardwerte zu den einzelnen Parametern gibt es bei elinux.org.

Um nun die dynamische CPU-Taktung per Powermanagement zu aktivieren, muss der entsprechende Governor geladen werden:
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
Um diese Einstellung permanent zu machen, hält man sie am Einfachsten in der Datei /etc/rc.local fest. Eine Möglichkeit, den Governor per Kernel-Parameter zu setzen, so dass der Bootprozess vom höheren Maximaltakt profitiert, konnte ich bislang nicht ausfindig machen.

Mit dieser Einstellung wird der Netzwerkdurchsatz auf 96Mbit/s gesteigert (gem ipperf), was dem theoretischen Maximum von 100Mbit/s doch schon sehr nahe kommt.

Defekte CD oder DVD mit dd einlesen

^ v M ><
Mit einem einfachen
dd if=/dev/sr0 of=outfile.iso
lässt sich ein defekter (kleine Kratzer oder perverse Abspielschutzvorkehrungen) optischer Datenträger unter Linux leider meist nicht mehr auslesen. Sobald ein I/O-Fehler auftritt, wird dd den Kopiervorgang abbrechen. Allerdings lässt sich dd anweisen, dass es Fehler ignorieren soll:
dd if=/dev/sr0 of=outfile.iso bs=2048 conv=noerror,notrunc iflag=nonblock
Mit etwas Geduld klappt es so aber meistens. "Etwas" sollte man wörtlich nehmen und sich im schlimmsten Fall den Tag reservieren.

Pulseaudio vs Netzwerkstreaming vs funktionierende Software Teil 2

^ v M ><
Leider hat sich meine letzte Anleitung nicht komplett bewährt. RTP über WLAN hat einen sehr grossen Nachteil: Das WLAN wird durch die 1.5Mbit RTP-Traffic komplett mit UDP-Paketen geflutet und überlastet. Egal was für ein Access Point mit egal welcher Firmware - die Latenzen gehen bis zur Unbenutzbarkeit hoch, sobald Musik läuft.
Mit direkter Punkt-zu-Punkt-Verbindung über Pulseaudio tritt das Problem jedoch nicht auf.

Daher habe ich eine neuere, viel einfachere Konfiguration erstellt, welche serverseitig keine Installation von Pulseaudio mehr erfordert. Etwas Hilfe von Onkel Google haben mich zu dieser Anleitung geführt, welche ich etwas vereinfacht und an meine Anforderungen angepasst habe. Eine direkte Umsetzung dieser Anleitung war in meinem Fall nicht zielführend, da der Pulseaudio-Client (bzw module-tunnel-sink) eine einmal abgebrochene Verbindung nicht wieder aufbauen kann. Es müsste serverseitig das komplette mpd/pulseaudio-Konstrukt neu gestartet werden, wenn sich der Client (Raspberry oder Desktop) kurz aus dem Netzwerk abmelden (Netzwerk-Hickup, Neustart o.ä.).

Die Lösung: mpd einfach direkt zum Sink-Server verbinden lassen.

Sink-Konfiguration (rc.local-Eintrag auf dem Raspi):
pulseaudio -D --log-target=syslog --start --realtime --load=module-native-protocol-tcp auth-anonymous=1 listen=0.0.0.0
Zu beachten ist, dass so jeder Rechner im Netzwerk Audiodaten an den Raspi streamen kann.
Sink-Konfiguration Klickibunti: papref starten und im Tab "Netzwerk-Server" die Häkchen bei "Enable network access to local sound devices" und den zwei darunter liegenden Boxen setzen.
mpd-Konfiguration:
audio_output {
type "pulse"
name "Desktop"
server "192.168.0.6"
sink "alsa_output.pci-0000_05_06.0.analog-stereo"
}
audio_output {
type "pulse"
name "Raspeakr"
server "192.168.0.11"
}


Bricht die Netzwerk-Verbindung doch mal ab, so ist spätestens nach dem nächsten Songwechsel wieder Lärm da.

Allerdings ist die Lösung auch nicht 100% perfekt, leichte Aussetzer können vorkommen.

Kaputtgeflashten WLAN-Accesspoint wiederherstellen

^ v M ><
Der WR841N v8 von TP-Link ist eigentlich gar kein schlechter Router für seinen Preis. Der Billigstheimer kommt mit ganz tauglicher Hardware daher und die Software ist eigentlich gar nicht sooo schlecht. Allerdings sind die Latenzen doch eher hoch und der Jitter untragbar. Zum Glück unterstützt die neuste Version von OpenWRT auch die neuste Revision des Geräts. Also auf, frische Firmware aufspielen. Nun gibt es zwei Images mit unterschiedlichen Dateisystemen, jffs2 und squashfs. Gemäss der Beschreibung schien mir jffs2 doch die bessere Wahl zu sein. Grosser Fehler, das jffs2-Image bootet nämlich nicht sauber, das Resultat ist ein unbrauchbarer Ziegelstein.

Was tun? Nun, man kann verzweifeln und in anbetracht des lächerlichen Preises ein Ersatzgerät bestellen oder sich vom Ehrgeiz packen lassen und den unbrick-Prozess starten. Dazu mussten als erstes die PINs in den Serial Header gelötet werden. Die Löcher sind praktischerweise schon da, aber die PINs waren wohl zu teuer. Na gut, Lötkolben her und los.

Danach wird das eigentlich für den Raspberry Pi angeschaffte serielle Konsolenkabel angesteckt. Das PIN-Layout ist identisch mit v7, nur um 90° verdreht. D.h. der alleinstehende PIN ist weiterhin TX. Entsprechend wird das Kabel nun angesteckt und mit einem PC verbunden. Da die Versorgung nun über den seriellen Port erfolgt, startet der Router auch sofort und per minicom lässt sich der Bootprozess mitverfolgen:
minicom --device /dev/ttyUSB0 -b 115200


Scheinbar hängt der Bootprozess beim laden der USB-Module (ohci_hcd). Das lässt sich verhindern, indem man in den Failsafe-Mode bootet. Dazu muss man, wenn der Prozess für ca 1s steht und die entsprechende Meldung anzeigt, rasch f[enter] eintippen. Schon erhält man eine root-Konsole und kann mit debugging loslegen.

Tatsächlich löste sich das Problem nun recht simpel. eth0 war unter 192.168.1.1 verfügbar, allerdings war eth0 der blaue WAN-Port, keiner der gelben LAN-Ports. Ausserdem schien der DHCP-Server nicht in Betrieb zu sein, so dass dem angeschlossenen Computer manuell eine IP-Adresse vergeben werden musste:
ifconfig eth0 192.168.1.2 netmask 255.255.255.0
. Anschliessend musste auf dem Router noch die Weboberfläche gestartet werden:
/etc/init.d/uhttpd start
und schon konnte bequem per Klickibunti das korrekte Firmware-Image (squashfs) aufgespielt werden.

Das Resultat: ein superflotter WLAN-Router mit relativ tiefen und stabilen Latenzen - zum Spottpreis.

Und vermutlich wäre der Lötkolben gar nicht mal nötig gewesen. Scheinbar kommt man auch in den Failsafe-Mode, indem man direkt nach dem Einschalten den Reset-Knopf drückt. Konsolenzugriff erhält man in diesem Fall per Telnet.

Pulseaudio vs Netzwerkstreaming vs funktionierende Software

^ v M ><
Wie verwandle ich einen Raspberry Pi, eine USB-WLAN-Karte und ein Paar USB-Lautsprecher in eine mobile Krachstation, welche die gleiche Musik wiedergeben kann, wie mein Hauptrechner? Nun, die Theorie wäre ja einfach: Auf dem Hauptrechner läuft mpd und dieser kann in quasi jedem gewünschten Format und Protokoll ausgeben. Dieser wird nun zwecks Steigerung der Verfügbarkeit erstmal auf den Intranet-Server gezügelt.


Der erste Versuch war, einen normalen Stream zu verwenden. Dazu wird wahlweise mpds integrierter Web/Streaming-Server gestartet (Nachteil: sobald man die wiedergabe pausiert, wird das Socket geschlossen, ein allfälliger Client wird deshalb terminiert), oder noch ein Icecast zwischengeschaltet (Vorteil: ein permanenter Stream, sobald mpd pausiert wird, strahlt Icecast ein (lautloses) Fallback-File in Endlosschleife aus). Leider hat diese Lösung einen riesigen Nachteil: Der Client hängt 2-10 Sekunden hinterher. Startet man die Wiedergabe, drückt man auf Pause oder wechselt manuell zum nächsten Lied, dauert es eine mittlere Ewigkeit, bis die Änderung beim Client ankommt. Fazit: für meinen Zweck unbrauchbar.


Na gut, zweiter Versuch. mpd Pipe-Output. Damit gibt mpd einfach einen rohen Audiostream per Pipe an ein anderes Programm weiter. Diesen Stream kann man entweder direkt per netcat übers Netzwerk raushauen oder aber, um das Netz nicht übermässig zu belasten, erst zu ogg codieren. Hierzu trägt man in der /etc/mpd.conf folgendes ein:
audio_output {
type "pipe"
name "my pipe"
command "oggenc -r -Q -q4 - | nc 192.168.0.60 8765"
}

Auf der Empfängerseite wird mittels xinetd ein passender Empfänger bereitgestellt. Dazu benötigt man einerseits eine Konfiguration für xinetd unter /etc/xinetd.d/oggplay:
service oggplay
{
port = 8765
type = UNLISTED
socket_type = stream
wait = no
user = root
server = /usr/local/bin/oggplay.sh
log_on_failure += USERID
disable = no
}

Leider scheint diese nur mit root-Rechten zu funktionieren, von xinetd aus gestartet kann ein Prozess des eingeschränkten Benutzers aus irgend einem Grund nicht auf die Soundhardware zugreifen (von einer Login-Shell aus geht das jedoch). Genauer untersucht habe ich das nicht, da ich ja erst mal einen Proof-Of-Concept wollte. Ebenfalls wird noch das eigentliche Player-Skript unter /usr/local/bin/oggplay.sh benötigt:
#!/bin/bash
/usr/bin/ogg123 -v -d wav -f- - | /usr/bin/aplay -v -D sysdefault:CARD=USB

Das funktionert soweit... nicht wirklich. Der erste Song konnte in aller Regel noch wiedergegeben, spätestens nach dem ersten Songwechsel waren dann aber massive Aussetzer in der Wiedergabe. Kein Wunder, hier wird ja auch überhaupt nichts gepuffert. Sehr traurig allerdings, dass es auch über Ethernet mit geringer Latenz/Jitter kein Bisschen besser funktioniert als über WLAN. Fazit: unbrauchbar.


Als nächstes habe ich dann zu ganz radikalen, verzweifelten Massnahmen gegriffen und im dritten Versuch angefangen, meine Systeme mit Pulseaudio zu verschandeln (und natürlich erst noch ein Diskimage gezogen). Auf dem Server werden folgende Pakete und Konfiguration benötigt:
aptitude install pulseaudio pulseaudio-utils mpd mpc

/etc/mpd.conf:
audio_output {
type "pulse"
name "Multicast RTP"
sink "rtp"
}

/etc/pulse/default.pa in Debian 6 / PA 0.9:
#! /usr/bin/pulseaudio -nF
load-module module-native-protocol-unix
load-module module-suspend-on-idle timeout=1
load-module module-null-sink sink_name=rtp description="Multicast RTP"
load-module module-rtp-send source=rtp.monitor

bzw unter Debian 7 / PA 2.0:
#! /usr/bin/pulseaudio -nF
load-module module-native-protocol-unix
load-module module-suspend-on-idle timeout=1
load-module module-null-sink sink_name=rtp sink_properties="device.description='RTP Multicast Sink'"
load-module module-rtp-send source=rtp.monitor

/etc/pulse/daemon.conf:
exit-idle-time = -1
default-sample-format = s16le

Das war's schon :-)
Nehmen wir nun den Raspberry in Angriff. Zuerst werden ein paar PulseAudio-Konfigurationswerkzeuge installiert:
aptitude install paman paprefs pavucontrol

Des weiteren wird PulseAudio so konfiguriert, dass standardmässig die USB-Lautsprecher verwendet werden. Hierzu genügt die Zeile "default-sink = 1" in der Datei /etc/pulse/client.conf.
Startet man nun die grafische Oberfläche und aktiviert dort den RTP-Empfang per Klickibunti in paprefs, haut die Sache auch sofort hin. Das ist aber witzlos, wenn die Kiste ja nachher Headless und ohne angemeldeten Benutzer funktionieren soll. Folglich beendet man X11 wieder. In den Howtos zu diesem Thema (u.a. auch in den Raspberry-spezifischen Diskussionen wie hier und hier) wird gesagt, dass "einfach nur" in /etc/pulse/default.pa die Zeile "load-module module-rtp-recv" einfügt und PulseAudio durch Änderung in /etc/default/pulseaudio als Systemdienst eingerichtet werden soll. Eventuell muss man noch in der /etc/pulse/daemon.conf "resample-method = src-sinc-fastest" eintragen. Nach einem Neustart soll es auch schon laufen. Simpel, oder? Da muss ein Haken dran sein! Ist auch so. Davon zeigt sich das System nämlich überhaupt nicht beeindruckt und bleibt mucksmäuschenstill.
Was ist nun also der Unterschied zwischen der Kommandozielen- und der GUI-Konfiguration? Keine Ahnung. Auch "pacmd dump" hilft hier nicht weiter. Wie bekommt man den Dreck trotzdem zum laufen? Nun, wie so oft mit der beliebten Methode "von hinten durch die Brust ins Auge": Die Änderung in /etc/default/pulseaudio wird wieder rückgängig gemacht, so dass Pulseaudio nicht beim Systemstart gestartet wird. Danach trägt man in die /etc/rc.local einen fixen Aufruf des PulseAudio-Dienstes ein, und zwar mit folgender Zeile:
su pi -c 'pulseaudio -D --log-target=syslog --start --realtime --resample-method=src-sinc-fastest'

und Tadaaaa! Es lärmt, sobald der mpd anfängt zu spielen. Allerdings ist "Lärm" wirklich die passende Bezeichnung. Die Wiedergabe scheppert leicht, was wohl dem Resampling geschuldet ist.

Jetzt steht mir nur noch eines bevor: Auch meinen Desktop mit Pulseaudio zu ruinieren. Dies, nachdem das aktuelle Alsa-Setup doch prächtig funktioniert.

Frickler an die Forschungskanonen!!!

^ v M ><
Nachdem ich die ganze Nacht über Alarmmeldungen von verdächtigen Zugriffen von der immer gleichen IP-Adresse erhalten habe, wollte ich dem zuständigen Besitzer Meldung machen. Nun, ein Reverse-DNS-Eintrag für die IP war nicht konfiguriert, aber gemäss whois gehört sie einer grösseren Uni in Deutschland. Also kurzerhand deren abuse@ Adresse angeschrieben, mit Logauszug und Symptomen. Daraufhin kommt die Antwort: Das ist kein Angriff, das ist ein Forschungsprojekt und repliziert das SSL Observatory. Ne, oder? Und dafür muss man hundert Mal auf POP3- und IMAP-Server zugreifen? Ohne den SSL-Handshake zu komplettieren? Das ganze von einer "anonymisierten" IP-Adresse? Vielleicht hätte man da ja auch jemanden fragen können, der sich mit sowas auskennt... grrrrmpf!