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)

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

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.

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.

magmakeys - Lautstärke regeln ohne angemeldet zu sein

^ v M ><
Für eine kopflose Multimediabox unter Debian (bzw Raspbian, es handelt sich hier um einen Raspberry Pi) wollte ich die Lautstärkeregelung der angeschlossenen USB-Lautsprecher nutzen. Diese Tasten senden letztendlich einfach Keyboard-Signale. Unter X11 wird das von den meisten Window Managern und Desktop Environments unterstützt. In der Konsole ist das nicht ganz trivial, insbesondere, wenn kein Benutzer angemeldet ist. Mit dem in Perl geschriebenen magamkeys gibt es aber dennoch einen Weg. Leider ist die Software wieder einmal ein Paradebeispiel perfekt lückenloser Dokumentation (denn wo gar keine Doku ist, da können auch keine Lücken sein...), so dass ich selber etwas denken musste.

Abhängigkeiten:
aptitude install git dbus hal libnet-dbus-perl alsa-utils

Danach die Software per git auf das System holen:
git clone https://github.com/wertarbyte/magmakeys.git

Nun kommt der spassige Teil. Alles installieren, ohne das System unnötig zuzumüllen. Natürlich muss man das richtige Perl-Verzeichnis erstellen, die Version ergibt sich aus dem Befehl perl --version:
mkdir -p /usr/local/lib/perl/5.14.2/
cp -r magmakeys/lib/magmakeys/ /usr/local/lib/perl/5.14.2/
mkdir -p /usr/share/magmakeys
cp magmakeys/share/eventcodes.txt /usr/share/magmakeys/
cp magmakeys/bin/magmakeys /usr/local/bin/
cp magmakeys/initscript/magmakeys /etc/init.d/
chmod +x /etc/init.d/magmakeys
mkdir -p /etc/magmakeys/keys.d/
vi /etc/magmakeys/keys.d/amixer

Nun muss noch die Konfiguration für amixer erstellt werden. Ich will die per USB angeschlossene Soundkarte steuern, welche als Card 1 erkannt wird. Die interne Soundkarte ist Card 0. Ein Hinweis auf die Konfiguration findet sich einerseits im git-Repostitory, genommen habe ich etwas, das ich bei Gentoo gefunden habe:
# volume control
KEY_VOLUMEUP 1 /usr/bin/amixer -c1 set PCM 2%+
KEY_VOLUMEDOWN 1 /usr/bin/amixer -c1 set PCM 2%-
# keep changing the volume when holding the key
KEY_VOLUMEUP 2 /usr/bin/amixer -c1 set PCM 2%+
KEY_VOLUMEDOWN 2 /usr/bin/amixer -c1 set PCM 2%-
KEY_MUTE 1 /usr/bin/amixer -c1 set PCM toggle

Nun lässt sich die Software probeweise mal starten:
magmakeys -k /etc/magmakeys/keys.d/ -t /usr/share/magmakeys/eventcodes.txt

Beim Drücken auf die Tasten an den Boxen müsste sich etwas in der Konsole tun. Wenn das erfolgreich war, kann man den Dienst permanent starten. Dazu muss aber erst das Init-Skript leicht geändert werden: Aus der Zeile "# Required-Start: $remote_fs hal" wird hal gestrichen, da dieser eh über dbus initialisiert wird und kein eigenes Startskript mehr hat. Die Zeile lautet neu also "# Required-Start: $remote_fs". Und die Zeile "DAEMON=/usr/sbin/$NAME" wird zu "DAEMON=/usr/local/bin/$NAME", da ich das Skript nach /usr/local/bin kopiert hatte. Nun kann's losgehen:
vi /etc/init.d/magmakeys
/etc/init.d/magmakeys start
update-rc.d magmakeys defaults

Network Manager in Debian Wheezy

^ v M ><
Vor dem Network Manager Applet in Debian Wheezy kann derzeit nur gewarnt werden. Der ist so vorsätzlich buggy, man könnte meinen, er wäre von allen grossen, kommerziell orientierten Softwarefirmen gemeinsam geschrieben worden:
  • Beim Versuch zu einem WLAN zu verbinden, wird nach dem root-Passwort gefragt - nicht aber nach dem WPA-Schlüssel. Lösung: Unter "Verbindungen bearbeiten" sich durchklicken und den Schlüssel händisch eintragen.
  • WLAN kann per GUI deaktiviert werden - aber keinesfall wieder aktiviert. Lösung: In der Kommandozeile als root mittels nmcli nm wifi on geht es wieder. Aber dafür installiere ich ja ein Klickibunti-Tool... damit ich nachher wieder in die Konsole gehen kann.

OpenSource und Sicherheit

^ v M ><
Neulich hatte ich eine Diskussion über Open Source, Closed Source und Sicherheit. Mein Standpunkt war, dass ich mir sicher nicht proprietäre Software wie Dropbox oder Wuala installieren möchte. Natürlich ist Sicherheit hier mit ein Argument. Allerdings nicht nur die Sicherheit davor, dass kein Schadcode in der Software enthalten ist. Grad bei grösseren OpenSource-Projekten kann auch das nicht zu 100% ausgeschlossen werden. Grad die gewaltigen Codemengen, welche einige Firmen in Form von Treibern beitragen, kann kaum sinnvoll extern reviewed werden, da für ein komplettes Verständnis auch die Hardware-Spezifikation bekannt sein muss.

Es geht mir eher um eine andere Form von Sicherheit: Die Sicherheit, dass ich die Software auch morgen noch einsetzen kann. Denn proprietäre Software hat hier schon immer zu Problemen geführt. Entweder ist der Hersteller überhaupt nicht (mehr) willig, gewisse Plattformen zu unterstützen, oder er ist bei der Unterstützung neuer Plattformen einfach viel zu langsam. Letztendlich kann ich 90% allen Ärgers, den ich unter Linux je hatte, auf das 1% proprietäre Software schieben, den ich im Einsatz habe oder hatte.

Hier nur mal ein paar Beispiele aus meiner Erfahrung:

  • VMWare Server (vor vielen Jahren): Nach dem Kernelupdate (Bugfix-Release) lassen sich die Module ums verrecken nicht mehr kompilieren.

  • Adobe Flash Player: Erinnert sich noch wer an die Zeiten, als 64bit unter x86 noch neumodischer Schnickschnack war? Da hatte man die Wahl, entweder einen 32bit-Browser ins System reinzuwürgen, den semiproprietären nspluginswrapper zu verwenden, um das 32bit-Flashplugin unter 64bit-Browsern zu nutzen, oder aber eine der nicht funktionierenden freien Flash-Alternativen zu installieren. Oder einfach alternativ jahrelang auf Flash verzichten. Oh, Adobe hat ja neulich auch beschlossen, dass Flash für amd64 in Zukunft gar nicht mehr weiterentwickelt wird.

  • Skype: Bis es endlich die offiziellen "64bit"-Pakete gab, konnte man die Software nur unter kompletter Verhunzung der Paketverwaltung ins System würgen. Und dann noch dieses neumodische Audiotreiberzeugs namens ALSA, lass mal noch ein paar Jahre beim obsoleten OSS bleiben... aber hey, das grauenhafte PulsAudio-Zeugs, das ist so schlecht, das unterstützen wir sofort und exklusiv.

  • PowerVR Grafiktreiber (für die gute, alte KyroII): nett, dieses Kernel 2.6 Zeugs. Aber einen (instabilen) Treiber gibt's nur für Kernel 2.4. Wer's neuer will, der kann ja den VESA-Treiber nehmen. Doku für die freie Treiberentwicklung? bwahahaha, der war gut!

  • nVidia-Grafiktreiber: Trotz Linus' Stinkefinger ja die Vorzeigefirma unter den proprietären Treiberentwicklern: Oh, alte Hardware wird nicht mehr unterstützt. Ausser mit alten Treiberversionen, die keine neuen Kernel unterstützen. Oh, und dieses neumodische KMS-Zeugs mit älterer Hardware... nun, hübsche Konsole, so mit extremer Verzerrung und nicht mehr leserbaren Bootmeldungen...

  • AMD-Grafiktreiber: Lass mal den neusten AMD-Treiber auf einem 6 Jahre alten Kernel kompilieren... oh geht nicht, Kernel ist zu neu... Dazu hab ich mich ja schon mehrfach ausgelassen. Ganz davon abgesehen, dass die letzte Treiberversion für meine Hardware der 12.04 ist. Da kann ich nur hoffen, dass bis ich den Umstieg auf Debian 8 ins Auge fasse, der freie radeon-Treiber was taugt. Grad im Bereich Multimonitor.

  • Druckertreiber für non-Postscript Drucker: Funktionieren nur mit sehr exotischen Distributionen, haben komische Abhängigkeiten, und natürlich nur für 32bit x86 Systeme.

  • Wine und Windows-Spiele: Guter Witz. Ich hab da kaum je was zum laufen gekriegt. Auch wenn Wine der Meinung war, das Spiel hätte Platin-Unterstützung (d.h. perfekt)


Aber auch Hardware ist mühsam, sobald sie nicht über ausreichend freie Dokumentation verfügt:

  • Noch einmal AMD und nVidia: Die freien Treiber waren jahrelang gar nicht brauchbar, unterdessen geht wenigstens so langsam mal das grundlegende.

  • Windows-Only GDI Drucker: aaaaaaaaaargh!

  • Nokia-Telefone: Viel Spass beim Zugriff mit Gnokii. Vielleicht geht es. Wahrscheinlich nicht.

  • Pogoplug: Die Pro-Platine (auch im spottbilligen Pogoplug Pink verwendet) verwendet ein proprietäres SoC, in dessen Dokumentation nur ein freier Entwickler unter NDA Einsicht hat. Die Konsequenz: Das Gerät läuft nur mit Arch Linux ARM und uralt-Kernel 2.6.31. Und die wichtigsten Treiber für viele USB-Geräte fehlen darin.



A propos Pogoplug: Der sowie z.B. der Raspberry Pi benutzen die ARM-Architektur. Über die Verwendung von Skype, Flash oder Dropbox nachzudenken, ist absolut müssig.

Debian schlank halten

^ v M ><
Debian hat mich grad neulich 2x erschreckt. Zuerst hat es mir eine gewaltige Liste an sinnlosen Abhängigkeiten zu einem Paket installieren wollen. Danach hat mein Debian Testing/Wheezy beim Laden der Paketlisten Ewigkeiten rumgeladen und rumgerödelt. Das will ich ihm abgewöhnen. Zeit für eine FDH-Magerkur!

Dazu wird eine Datei /etc/apt/apt.conf.d/00lean angelegt (Name ist eigentlich egal) und mit folgendem Inhalt bestückt (nicht egal):
APT::Install-Recommends "0";
APT::Install-Suggests "0";
Acquire::Languages { "environment"; "en"; "de"; };

Leider lädt Debian damit bei der Paketlistenaktualisierung immer noch alle Übersetzungen runter. Daher muss erst mal /var/lib/apt/lists aufgeräumt werden. Grundsätzlich genügt es wohl, alle *_i18n_Translation-* Dateien in dem Verzeichnis zu löschen. Ich hab einen etwas sichereren und leicht bandbreitenbelastenderen Weg genommen und grad das ganze lists-Verzeichnis umbenannt und neu erstellt (falls was schief gegangen wäre, hätte ich das immer noch rückgängig machen können):
cd /var/lib/apt/
mv lists lists.old
mkdir lists
aptitude update

Nach erfolgreichem Update habe ich das Verzeichnis lists.old gelöscht.

Mal wieder Software-RAID retten

^ v M ><
Diesmal handelt es sich um eine Disk aus einem dubiosen NAS. Anscheinend pappt das /dev/sda1 und /dev/sda2 zu einem RAID-1 zusammen. Dies wird wohl so gemacht, um das System elegant aktualisieren zu können. Jedenfalls, musste da mal Hand an die Systemdaten angelegt werden.

Nun, Standardübung, nehmen wir mdadm:
mdadm --assemble /dev/md/0 /dev/sdb1 /dev/sdb2
mdadm: no recogniseable superblock on /dev/sdb1
mdadm: /dev/sdb1 has no superblock - assembly aborted

Wie? Kein Superblock? jaaa aber... parted ist da anderer Meinung:
parted /dev/sdb print
Model: WDC WD10 EARX-00N0YB0 (scsi)
Disk /dev/sdb: 1000GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number Start End Size File system Name Flags
3 15.7MB 528MB 513MB primary
1 528MB 2576MB 2048MB ext3 primary raid
2 2576MB 4624MB 2048MB ext3 primary raid
4 4624MB 1000GB 996GB ext4 primary

Was nun? Es handelt sich hierbei um ein Legacy-RAID ohne Superblock. Das setzt man nicht mit assemble sondern mit build zusammen:
mdadm --build /dev/md/0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdb2
mdadm: array /dev/md/0 built and started.

Nach der Resynchronisation erfolgt der erste mount-Versuch:
mount /dev/md/0 temp/
mount: unknown filesystem type 'linux_raid_member'

Na gut, erzwingen wir das Dateisystem:
mount /dev/md/0 temp/ -t ext3

Perfekt, alle Daten da :-)

Ubuntu 11.10 auf Rechnern mit EFI installieren

^ v M ><
Vor etwa einem Jahr habe ich mir einen neuen Server zusammengebaut. Eigentlich wollte ich damals eine CPU, welche drei Anforderungen erfüllt: x86 64bit, virtualisierungsfähig und sehr stromsparend. Leider konnte jede vorhandene CPU höchstens zwei der Kriterien erfüllen, insbesondere bei Intels Atom sind auch heute noch Punkt eins und zwei gegenseitig ausgeschlossen. Und das stromsparendste von AMD war der Athlon X2 240e, welchen ich zuletzt ausgewählt hatte. Monate später wurden dann die Atom-Konkurrenten von AMD veröffentlicht. Zwei Geräte für Tests mit Cluster- und sonstigen Basteleien mit einer derartigen Zacate-CPU habe ich mir nun besorgt, und zwar zwei ZBOXen von Zotac. Diese sind extrem günstig, komplett ausgestattet und befreit von Microsoftsteuern. Zum einen habe ich mir einen Nano gekauft, da dieser mit Fernbedienung geliefert wird, so dass ich diesen später zu einem Multimediarechner umfunktionieren kann. Und zum anderen einen ADO2, da dieser im Gegensatz zum Nano Platz für zwei Speichermodule bietet, so dass er auf 8GB RAM ausgebaut werden kann.

Bei so schönen Geräten muss natürlich erst mal die Hardware etwas genauer getestet werden, statt sie nur im Konsolenmodus zu betreiben. Dazu wollte ich ein paar Betriebssysteme installieren. Ubuntu Desktop 11.10 lässt sich fast problemlos installieren. Die Installation von Ubuntu Server 11.10, Debian 6 und CentOS 6.2 scheitert jedoch an einem Punkt: Beim Laden des Installers geht plötzlich die Tastatur verloren. Natürlich kann jedes Huhn Debian installieren, wenn genügend Körner auf der Tastatur liegen. Aber die Tastatur muss halt funktionieren. Interessanter- und glücklicherweise tritt das Problem beim Ubuntu Desktop nicht auf, so, dass sich dieser mässig bequem installieren lässt.

Das Problem mit den USB-Tastaturen lässt sich auch mit keiner BIOS bzw EFI-Konfiguration beheben. Ich habe alle USB-Einstellungen in jeder Kombination getestet, in letzter Verzweiflung sogar USB-Legacy deaktiviert. Dazu steht im BIOS-Setup, dass dadurch USB-Geräte nur noch in EFI-Applikationen zur Verfügung gestellt würden. Tja, das BIOS-Setup ist blöderweise keine EFI-Applikation, so dass ich nun ganz ohne Tastatur dastand und dies somit nicht mehr einfach korrigieren konnte. Daher musste ich erst mal das CMOS resetten, was zum Glück recht simpel ist. Man muss die Bodenplatte des Geräts entfernen, d.h. erst die vier Daumenschrauben lösen, welche auch als Standfüsse dienen, und dann an der eingekerbten Ecke den Fingernagel einsetzen und die Bodenplatte herausreissen. Nun hat man Zugriff auf alle relevanten Innereien, d.h. Festplatte, WLAN-Karte und RAM-Sockel, so dass man an dieser Stelle auch einfach ein RAM-Upgrade durchführen kann. Für den Reset muss einfach der gummierte, unbeschriftete Knopf zwischen WLAN- und Speichermodul ein paar Sekunden gedrückt werden. Eine bebilderte Anleitung dafür findet sich leicht, jedoch ist in dieser der Reset-Knopf nicht ersichtlich.

Die Geräte verfügen über kein BIOS sondern das modernere EFI. So schöne Vorteile (wie z.B. richtig grosse Platten ohne Workarounds) das bietet, so wüste Nachteile bei der Bootloader-Installation zieht es mit sich. Zur Installation von Ubuntu bin ich folgendermassen vorgegangen:
  • Zuerst habe ich von meinem bevorzugten Mirror das CD-Image für Ubuntu Live 64bit heruntergeladen und dieses mittels unetbootin auf einen bootbaren USB-Stick geschrieben. Diesen habe ich dann in den Zotac eingsteckt und das Gerät eingeschaltet.
  • Wenn die Startpiepser ertönen (ähnlicher Klang wie die Telefone in 24), ein paar mal auf DEL hämmern, um ins BIOS-Setup zu gelangen. Unter "Boot" muss die Startreihenfolge angepasst werden, so dass zuerst ab USB-Stick gestartet wird.
  • Jetzt erscheint der Bootloader und kann man entweder Ubuntu Live starten und dort das Setup aufrufen oder grad den Installer starten.
  • Die Festplatte muss unbedingt manuell partitioniert werden, denn EFI verlangt eine EFI-Partition. Der gparted-Verschnitt des Ubuntu-Installers legt gleich eine GPT-Partitionstabelle an, so dass als erste Partition eine FAT32-Partition von mindestens 200MB angelegt werden kann. Die Schwierigkeit besteht darin, dieser noch das Flag bios_grub gesetzt werden muss. Unter Ubuntu Live ist das kein Problem, da partitioniert man einfach vorher rasch mit gparted. Wichtig ist, dass man die ganze Platte löscht und eine neue Partitionstabelle vom Typ GPT anlegt.
    Im reinen Installer-Modus wechselt man mittels ctrl-alt-F1 in die Konsole, startet mittels
    $ sudo parted
    eine parted-Shell und setzt das Flag rasch per Kommando
    set 1 bios_grub on
    (tatsächlich habe ich im Arch-Wiki gelesen, dass man das Flag boot setzen muss, aber dann meckern später EFI und grub-installer). Zurück zum Installer gelangt man durch alt-F7.
  • Nun installiert man Ubuntu ganz normal fertig. Bloss neu starten sollte man noch nicht! Zuerst muss grub noch richtig installiert werden. Dazu wechselt man wieder in die Kommandozeile (bzw öffnet eine Shell in Ubuntu Live) und gibt folgende Befehle ein:
    $ sudo mount /dev/sda2 /mnt (/dev/sda2 muss ggf durch die korrekte Angabe für die Root-Partition ersetzt werden) und
    $ sudo grub-install --root-directory=/mnt /dev/sda (auch hier muss /dev/sda ggf durch die korrekte Angabe für die Platte, worauf Ubuntu installiert wurde, ersetzt werden).
  • Jetzt kann man neu starten und Ubuntu sollte fehlerfrei booten. Die EFI-Warnmeldungen bezüglich Bildschirmauflösung und "file not found" kann man ignorieren.


Die Leistung der Geräte ist nicht schlecht. Sogar Nexuiz läuft passabel wenn der proprietäre AMD-Treiber fglrx installiert wird, bei 1024x768 ist es mit 40-70FPS absolut spielbar. Bei höheren Auflösungen kommt die Grafikeinheit aber an den Anschlag.

Pseudo-Hardware-RAID retten

^ v M ><
Mal wieder dicke Punkte für Linux als Rettungssystem. Kollege bringt mir seinen defekten PC mit einem Intel Matrix RAID. Natürlich RAID-Level 0, d.h. ohne Netz und doppelten Boden. Man müsste die Daten von den Disk versuchen zu retten, weil Backup ist nicht...

Na gut. Die Kiste fährt nicht hoch sondern piepst nur. Ergo Platten raus, in meinen alten Schrott-PC rein und die nächstbeste Live-CD (in diesem Falle CloneZilla) gestartet und mal geschaut, was da Sache ist. mdadm sollte ab Version 3.0 in der Lage sein, solche Non-Linux-SoftRAID Verbünde wieder zusammenzusetzen. Tatsächlich klappt das auch. Verwirrend ist jedoch, dass die physischen Festplatten als /dev/sda1 und /dev/sda2 (was ja eigentlich Partitionen wären) eingebunden sind und das logische Laufwerk, d.h. der Verbund, als /dev/sda (was eigentlich die erste physische Platte sein sollte) verfügbar ist. Tja, wo sind nun die Partitionen? Diese finden sich unter /dev/dm-[0-9] und können von dort ganz normal gemountet werden. CloneZilla hat NTFS-3G schon dabei, somit ist auch der Zugriff auf die Windows-Partitionen kein Problem.

Kurz die Daten auf eine externe USB-Disk gesichert, und gut ist.

Debian Backports selbst gemacht

^ v M ><
Ab und zu braucht oder möchte man mal unter Debian Stable ein neueres Programm installieren. Oft findet sich dies in Unstable oder gar Testing, aber leider gibt's dann oft keinen Backport. Das ist aber kein Problem. Meine Backports bau ich anhand dieser Anleitung, mit einigen Ergänzungen. Hier erläutere ich dies am Beispiel des Messengers Pidgin:

Als erstes werden mir root-Rechten die benötigten Abhängigkeiten für den Bau des Pakets installiert:
# aptitude build-dep pidgin


Bis auf weiteres können alle weiteren Schritte als normaler User ausgeführt werden. Als nächstes wird die Source und die Debian-Modifikation von packages.debian.org heruntergeladen und in ein eigens für den Build erstelltes Verzeichnis kopiert:
$ mkdir pidgin
$ cd pidgin
$ wget http://ftp.de.debian.org/debian/pool/main/p/pidgin/pidgin_2.9.0.orig.tar.bz2
$ wget http://ftp.de.debian.org/debian/pool/main/p/pidgin/pidgin_2.9.0-3.debian.tar.gz


Nun wird entpackt:
$ tar -jxf pidgin_2.9.0.orig.tar.bz2
$ cd pidgin-2.9.0
$ tar -zxf ../pidgin_2.9.0-3.debian.tar.gz


Der nächste Schritt ist etwas fummelig. Allenfalls müssen Abhängigkeiten angepasst werden, weil das Debian-Skript eine neuere Version einer Abhängigkeit fordert als nötig und/oder für Debian Stable verfügbar ist. Fehlerhafte Abhängigkeiten können einfach bestimmt werden, indem man den nächsten Schritt ausführt und den Kompiliervorgang versucht zu starten. Zur Bereinigung von Abhängigkeiten mit unnötig hoher Version muss die Datei debian/control bearbeitet werden.
Einige benötigte Abhängigkeiten mit höherer Version lassen sich aus den Backports installieren, dies klappt mittels aptitude -t squeeze-backports install myrequireddependency (vorausgesetzt, das backports-Repository ist konfiguriert). Für einige ganz fiese Abhängigkeiten kann es nötig sein, dass man davon selbst ein Update gemäss dieser Anleitung erstellen und installieren muss.

Sind alle Probleme behoben, kann man nun den Compiler anwerfen lassen:
$ dpkg-buildpackage -rfakeroot -uc -b


Wenn dies erfolgreich war, erhält man ein installationsbereites .deb-Paket. Für die Installation sind natürlich wieder root-Rechte erforderdlich:
$ cd ..
$ su
# dpkg -i *.deb