High Definition Audio und das „Anschluss-Sharing“

Wer ein halbwegs modernes Board sein eigenen nennt (ich zb ein AT3IONT, wie der name schon sagt, mit ION-Chipsatz) wird zwangsweise mit einer HDA – Karte (bei mir Realtek ALC 887) konfrontiert, die mehr Kanäle zur verfügung stellt, als sie Anschlüsse hat. In meinem fall 8 Kanäle (7.1) bei nur 5 Anschlüssen wovon 2 "eigendlich" nur Duplikate der Anschlüsse auf dem Board sind, die über eine Audio-Panel rausgeführt werden. Ergo hat man 3 Anschlüsse, davon einer als standart Stereo Output. Der Trick der Herrsteller ist, dass alle Anschlüsse je nach Kanal-Config anders belegt werden. Geht man auf 8 Kanal-Sound hoch, kann man kein Micro mehr anschließen und die Front-Buchse für den dezenten Kopfhörereinsatzt ist auch dahin. Das alles wird dann auf die 8 Kanale gemappt.

Startet man ins Linux werden einem auch nur diese drei Anschlüsse zur Verfügung gestellt, ergo Stereo-Sound. Man muss dem "hda_intel"-Treiber (darunter werden wohl alle Karten die sich HDA schimpfen) ein bisschen unter die Arme greifen. Den grund findet man hier. Was in der Beschreibung ein wenig unter geht, ist der umstand, dass man nicht unbedingt den "richtigen" Modulname erwischen muss. Zumindestens bei meinem ION-Board kann ich die soundkarte mit 6 verschieden Configs ansprechen:

  1. 3stack – normaler stereo sound
  2. 3stack-digout – normaler stereo Sound, SPDIF verfügbar (hab ich aber nicht testen können, da ich noch kein SPDIF Receiver hab)
  3. 3stack-2ch – normaler stereo sound
  4. 3stack-2ch-digout – das selbe wie oben
  5. 3stack-6ch – 5.1 sound über alle 3 hinteren Klinke-Anschlüsse
  6. 3stack-6ch-digout -5.1 und SPIDF verfügbar

Was nun fehlt sind eigendlich 4stack-8ch und 3stack-4ch. Auch wenn es nicht ganz korrekt ist, kann man so die Konfig bestimmen, mit der man seine Soundkrarte ansteuert.

Die Konfig muss in eine config-Datei unter /etc/modprobe.d geschrieben werden. Entweder nimmt man dazu eine bestehende oder legt eine neue an. Ich hab letzteres gemacht. Die Datei /etc/modprobe.d/alsa-hda-intel.config sieht wie folgt aus:

options snd-hda-intel model=3stack-6ch enable=1 index=0
alias snd-card-0 snd-hda-intel

Damit wird mein Soundsystem über die analogen Anschlüsse mit einem 5.1 Signal versorgt. Die Feinabmischung kann man über den alsamixer vornehmen.

NVidia Kernel Modul zerschossen.

Wenn man mit gewallt seinen Kernel neu installiert kann es passieren, dass danach das Kenrel-Modul nvidia nicht mehr geladen werden kann. Man sollte dann prüfen ob die linux-header-daten desaktuellen kernel installiert sind, da diese zum bauen der Treiber benötigt werden. Anschließend kann man mittels folgendem Befehl die Treiber neu bauen:

sudo aptitude reinstall nvidia-current

Ubuntu und Fake-Raids

Ich nutze nun seit gut 1 1/2 Jahren Ubuntu in zusammenhing mit einem FAKE-Raid-Controler (INTEL ICH10R) und habe allerlei „lustige“ Erfahrungen gemacht. Die ich hier kundtun will. Eins vorweg, beim Einsatz eines FAKE-Raids gilt wie bei alles anderen RAIDs auch: Der RAID schützt nur vor Festplatten-Ausfall, nicht vor Dummheit, Bugs oder sonstigen Fehlern. Ein Backup (jeh nach Anwendungsfall am Besten täglich…) entspannt im Falle eines Datenverlustes doch erheblich die Situation.

Eine der versteckten Fehlerquellen ist der „RAID-Controller“ selber. Alles wird über das Betriebssystem abgefahren. Das BIOS ist nur in der Lage den RAID-Header der Platten auszulesen und zu interpretieren. Das hat drei Konsequenzen:

  • Bei einem irregulären Reboot kann es zu inkonsistent RAID Verbünden kommen. Sobald mehr als ein Stripe auf verschiedene Platten geschrieben werden muss, kann es passieren, dass nur ein Teil geschrieben wird…
  • Die Konsistenz der RAIDs ist vom Betriebssystem abhängig. Die Platten werden weiterhin an das Betriebssystem exportiert. Soll heißen man kann unter Umgehung des „RAIDS“ auf die einzelnen Platten direkt zugreifen und Daten verändern. Das ist eine erhebliche Fehlerquelle, besonders für Anfänger.
  • Da die ganze „RAID-Sache“ in Software abgearbeitet wird, können die Platten ohne weiteres an einen anderen FAKE-Raid-Controler angeschossen und dort ausgelesen werden. Der Linux Treiber ist in der Lage Controller-Unabhängig alle Header auszulesen und die RAID-Units zu betreiben. Unter Windows hat man leider nicht diesen Komfort.

Den ersten Punkt kann man bedingt durch eine USV/UPS (unabhängige Stromversorgung/uninterruptible power supply) eindämmen. So hat man nur noch Reboots zu fürchten die man selber verursacht und die kann man, wie Punkt zwei nur durch eigene Disziplin verhindern.

Gesteuert wird der FAKE-Raid immer über das dm-raid Kommando. Den aktuellen Status kann man über die folgenden Befehle abfragen.

sudo dmraid -s #zeigt den Status aller RAID-Units an
sudo dmraid -r #zeigt den Status aller RAID-Devices an

Vorsicht jedoch mit dem Status „OK“. Aktuell wird bei dem ICH10R z.B. bei einem Rebuild sofort von DEGRADE auf OK gewechselt obwohl der eigentliche Rebuild noch nicht abgeschlossen ist. Wo wir beim Rebuild selber sind. Der aktuelle Treiber erkennt aktuell scheinbar keine Statuswechsel. Ergo, wenn ein RAID in den Status degrade geht, passiert erstmal nichts, auch wenn eine Hot-Spare Einheit zur Verfügung steht. Ein Rebuild muss immer manuell gestartet werden.

sudo dmraid -R  /dev/sdX # Fügt ein Device der RAID-Unit hinzu und startet einen Rebuild.
sudo dmraid -f  -S -M /dev/sdX #markiert das ein Device als "HotSpare"
sudo dmraid -R  #startet eine Rebuild.

Achtung bei dem letzten Befehl. Es kann zu unterschiedlichem Verhalten kommen:

  • Hat die RAID-Unit nicht die benötigte Anzahl an Disk-Units wird versucht eine HotSpare-Unit der RAID-Unit hinzuzufügen und anschließen der Rebuild gestartet.
  • Hat die RAID-Unit bereits alle benötigten Disk-Units wird die RAID-Unit aktiviert und der Rebuild gestartet. Hier sollte man ganz genau darauf achten warum die RAID-Unit noch „degraded“ ist. Es kann schnell passieren, dass man zwei falsche Platte zusammen verbunden hat und versucht diese zu syncen!
Hinweis:Bei meinem Board kam es zu dem Interessanten Problem, das ein Rebuild initiiert durch das BIOS zwar korrekt durchgeführt wurde, der Mirror wurde wieder hergestellt aber anschließend wurde der RAID nicht als OK markiert.

Ab und zu ist es nötig eine Festplatte aus dem RAID zu entfernen, das macht man mit folgendem Kommando:

sudo dmraid -rE /dev/sdX #entfernt einen RAID-Header von einer Platte, die Daten bleiben bei RAID1 lesbar.
Ein extrem wichtiger Hinweis: Es wird zum Tests eines Raides gerne versucht eine Platte zu ziehen und anschließend diese wieder zu stecken. Läuft das System weiter, funktioniert der RAID. MACHT DAS NICHT! Benutzt zum Rebuild eines RAIDs niemals Platten die schon mal Teil dieses RAIDS waren.

Alle mir bekannten RAID-Controller (Software, Fake oder Hardware) reagieren extrem allergisch darauf eine Platte untergejubelt zu bekommen, die sie schon kennen. Wenn zwei Platten eines RAID 0 unterschiedliche Stände aufweisen und beide als „gültig“ markiert sind, ist nicht klar welche Platte der Controller als Rebuild-Quelle wählen wird. Bei dem kleines Test, ist das nicht weiter schlimm, das Delta zwischen den Platten beträgt wenige Minuten und meist nur Logfiles, schließt man aber zum Rebuild eine Platte an, die schon einen aktiven RAID-Header und einen alten Datenbestand hat, kann das extrem unangenehm werden! Richtig bitter wird es übrigens bei RAID5/6. Dort kann eine „alte“ gesteckte Festplatte den kompletten RAID „übernehmen“, der daraufhin sofort FAILED ist, da der RAID plötzlich wieder vollständig ist, aber die Prüfsummen nicht stimmen. Festplatten sollten ergo nur mir dem oben genannten Befehl entfernt werden.

Ein anderer Stolperstein ist der oben erwähnte Direktzugriff. Wenn Programme unter Umgehung des Raides direkt auf Platten zugreifen. Meistens ist dies z.B. der GRUB-Installer. Dieser installiert sich meist nach /dev/sdX anstatt auf das /dev/mapper/<RAID-NAME> Device. Bei einem Ausfall der Platte mit dem Bootloader hat man zwar keinen Datenverlust, kann das System jedoch nicht booten. Das ist nicht weiter schlimm, kann aber extrem irritieren und Panik auslösen.[1. Man sollte immer bedenken, dass man oft unter Stress steht, wenn es zum Ausfall einer Platte kommt. Das sind nie Situationen die man erwartet. Alles was dabei nicht läuft wie man es erwartet erhöht den Druck nur und verleitet zu Fehlern] Abhilfe schafft da nur ein erneutes installieren des Bootloaders auf das richtige Device.

sudo grub-setup /dev/sdX

Um weitere Direktzugriffe zu verhindern, sollte man ganz genau aufpassen was man mountet.

Fazit nach 1 1/2 Jahren FAKE-Raid Betrieb: Ich hab noch keine wirklichen Datenverlust durch den FAKE-Raid selber gehabt. Zwei mal habe ich mich durch eigene Dummheit ins Knie geschossen, kam aber immer durch zeitnahe Backups ohne Datenverlust davon. Es kostete mich nur Zeit und Nerven. Kann ich den Einsatz eines FAKE-Raids empfehlen? Nein – mit einer Ausnahme:

  • Man braucht einen bootbaren RAID 5 und will kein Geld für einen teuren Hardware-RAID ausgeben.

Selbst bei diesem Szenario würde ich eher zu einem bootbaren (Software) RAID-1 mit nachgeschaltetem (Software) RAID 5/6 raten. Es gibt nichts, was ein Fake-Raid besser kann/macht als ein Software-RAID. Dazu kommt, dass der DM-RAID wesentlich schlechter gepflegt wird als md-raid (Software-RAID) oder LVM. Die Fake-Raides sind und bleiben ein Auswuchs der Windows-Welt wo es lange Zeit keine brauchbare Software-Raid-Lösung gab. Ich werde mit dem nächsten LTS Release meinen Server auf jeden Fall entweder auf 100% Hardware-RAID oder die jetzigen Fake-Raids auf Software-RAID umstellen.

Dynamische Firewall mit iptables

Einer der Gründe warum ich meinen Netgear-Router zum Switch/AP degradiert habe war, dass ich mehr Kontrolle über meine Datenströme haben will. Meine grundlegende Anforderungen sind:

  • Aufschlüsselung der Bandbreite nach Clients
  • unterwerfen von unbekannten Clients unter eine dynamische Bandbreiten Beschränkung
  • gute Wartbarkeit
  • gute Monitoring-Möglichkeit

Die ursprüngliche Anregung habe ich diesem Artikel entnommen. Man muss das Konzept nur noch um die Dynamik ergänzen, damit auch Clients verwaltet werden können die man vorher nicht kennt.

Unter Ubuntu hat man die Wahl zwischen der „uncomplicated Firewall“ (UFW) und dem direkten Zugriff mittels iptables. Ich hab mich für iptables entschieden. Zum einen bin ich unter UFW zu schnell in Bereich gestoßen, bei den ich quasi iptables-Befehle geschrieben habe (nur ohne iptables vorangestellt). Zum anderen lieferte mir UFW zu viele „default“-Regeln aus, die mit „nicht löschen“ markiert sind ohne zu Begründen warum. Hat man sich einmal in iptables eingearbeitet, so hat man die volle Freiheit die man braucht.

WICHTIGER HINWEIS:Beim Ausführen der folgenden Befehle sollte man in Reichweite des Rechners sitzen oder einen alternativen Zugang zum Rechner haben, da man sich u.U aussperrt.

Es empfiehlt sich für das einstellen der Firewall-Regeln ein eigenes Set an Scripts zu erstellen, z.B. unter /etc/firewall. So kann man mit einfacher die Firewall zu und abschalten.

Als erstes sollte man die default-Policy der Haupt-Regel-Ketten auf DROP setzen. Das ist zwar ein wenig Paranoid hilft aber ungemein, da man jedes Loch bewusst aufmachen muss.

Diese Kommandos verhindern das jegliches einloggen via Remote-Access-Tools. Es wird jeder Traffic gedropt.
iptables -L INPUT -p DROP
iptables -L FORWARD -p DROP
iptables -L OUTPUT -p DROP

Bei aller Regelwut sollte man eines bedenken, das Durchlaufen der Filterregeln kostet zeit. Je nachdem auf welchem Layer man die Entscheidung zum DROP/ACCEPT trifft, müssen die Pakete aufwändig entpackt werden. Einige Module beherrschen dabei die sogenannte DeepPackageInspection (DPI). Diese Filterregeln sollten jedoch nur sparsam zum Einsatz kommen da sie sonst den kompletten Netzwerktraffic drücken.

Als erstes sollte man eine Regel einrichten die jede Verbindung annimmt die schon mal geprüft wurde. Zu diesem Zweck nutzt man das „state“-Module bzw Connection-Tracking.

iptables -L INPUT -m state --state ESTABLISHED,RELEATED -j ACCEPT
iptables -L OUTPUT -m state --state ESTABLISHED,RELEATED -j ACCEPT

Nun sollte man die Input-Chain um statische Ausnahmen für die Fernwartung und eventuell benötigte Dienste erweitern. Vorzugsweise mit angaben aus welchem Netz diese Zugriffe erfolgen dürfen. Hier bietet es sich an eigene „Chains“ anzulegen und so die Wartbarkeit zu erhöhen.

Beispiel: Es ist sinnvoll den „eingehenden“ Traffic nach „Herkunft“ zu unterscheiden. Traffic aus dem eigenen Netz unterliegt einer anderen Vertrauenswürdigkeit als externer Traffic.

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -j ACCEPT #vom lokalen netz zum server alles zulassen
iptables -A INPUT -i ppp0 -j server_incoming_traffic
iptables -A INPUT -j LOG --log-level 4 --log-prefix "Input dropped by firewall: "

Die ersten beiden regeln erlauben jeglichen Traffic des „localhost“ und „eth1“ Interfaces. Nur Traffic des ppp0 Interfaces wird einer Filter-Chain unterworfen. Führt in dieser „server_incoming_traffic“-Chain keine Regel zu einem DROP oder ACCEPT wird diese einfach verlassen und das LOG – Kommando wird ausgeführt, zum logging aber später mehr.

Die Filter-Chain kann dann so aussehen:

iptables -N server_incoming_traffic
iptables -A server_incoming_traffic -p tcp --dport 22 -j ACCEPT
iptables -A server_incoming_traffic -p tcp --dport 443 -j ACCEPT
iptables -A server_incoming_traffic -p tcp --dport 6880:6999 -j ACCEPT
iptables -A server_incoming_traffic -p udp --dport 6880:6999 -j ACCEPT

so kann man eine Reihe von Port-Ranges freigeben. Man kann auf Wunsch die Regeln auch noch ins unendliche erweitern. Aber immer dran denken, dass frisst Performance.

Beim ausgehenden Traffic kann man es ähnlich händeln, mit einer Ausnahme. Bei einigen Programmen weiß man im vornherein nicht ob und welche Ports genutzt werden. Hier führen DROP-Policys normalerweise dazu, dass die Programme nicht oder nur eingeschränkt funktionieren. Entweder reißt man für solche Programme große Lücken in seine Firewall oder nutzt das „owner“-Modul. Bei ausgehenden Traffic ist es möglich zu ermitteln unter welcher UID oder GID der Socket aufgemacht wurde. Auch darauf kann man filtern. Wenn man sich an den Standard hält jedem Dienst seinen eigenen User zu verpassen, kann man so schön auf Dienstebene freigeben, wer was darf.

Folgendes Beispiel gibt für rTorrent allen ausgehenden Traffic frei.

iptables -A server_outgoing_traffic -p tcp -m owner --uid-owner rtorrent -j ACCEPT
iptables -A server_outgoing_traffic -p udp -m owner --uid-owner rtorrent -j ACCEPT

Kommen wir nun zum Forward-Traffic. Hier wird es ein wenig kniffeliger. Zum ein landet hier alles was geroutet wird, zum anderen muss man hier mit dem „in“ und „out“ aufpassen. Am einfachsten fällt die Unterscheidung nach Zielnetzen.

iptables -A FORWARD -o ppp0 -s 192.168.99.0/24 -j outgoing_traffic
iptables -A FORWARD -o eth1 -d 192.168.99.0/24 -j incoming_traffic
iptables -A FORWARD -j LOG --log-level 4 --log-prefix "Forward dropped by firewall: "

Die regeln sind schnell erklärrt: alles was an ppp0 gerouted wird und vom Netz 192.168.99.0/24 kommt wird der Chain “ outgoing_traffic“ unterworfen. Gleichlaufend wird alles was an eth1 geroutet wird und an das gleiche Netz gesendet wird der Chain „incoming_traffic“ unterworfen. Alles andere wird geloggt und gedropt.

In diesen beiden Listen passiert nun das „magic“. Clients die ins „Internet“ wollen müssen durch diese Regeln durch. Hier muss also am ende jeder Client aufgeführt sein der Accepted werden soll. Deshalb sollte man erstmal jeden Port droppen den man nicht geroutet wissen will. Das dient weniger dazu, dass der User die entsprechenden Programme nicht nutzt (ein umbiegen von Ports, beherrscht wohl jeder …) sondern soll eher verhindern, dass gewisse Windows-Clients unwissend ihre Existenz in Netz hinaus posaunen…

Danach muss man nun die Clients dynamisch in der Firewall freigeben. Das geht am besten über den DHCP-Deamon. Jeder Client muss sich eine IP holen, tut er es auf korrektem weg, wird er in der Firewall freigeschaltet, ansonsten bekommt er nicht gerouted. Das einzige Einfallstor sind dann noch IP/Mac spoofing. Das kann man aber bei kommen. Der dhcpd3-Daemon bietet für diese Zwecke die Möglichkeit ein Script auszuführen. Mittels folgendem Eintrag in der dhcpd.conf kann man Scripte anstoßen wenn ein Client ein Lease bekommt oder freigibt.

on commit {
  set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
  set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));

  log(concat("Commit: IP: ", ClientIP, " Mac: ", ClientMac));

  execute("/etc/firewall/add-client", ClientIP);
}

on release {
  set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
  set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));

  log(concat("release: IP: ", ClientIP, " Mac: ", ClientMac));

  execute("/etc/firewall/del-client", ClientIP);
}

on expiry {
  set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
  set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));

  log(concat("expire: IP: ", ClientIP, " Mac: ", ClientMac));

  execute("/etc/firewall/del-client", ClientIP);
}

Sobald man diesen Code in die /etc/dhcp3/dhcpd.conf einfügt, werden zwei Scripte ausgeführt. in diesem Fall del-client und add-client. Wichtig dabei ist, dass man in apparmor die Ausführung dieser Scripte von dhcpd zulässt. Entweder über das unsichere „ohne eigene Regeln ausführen“ oder man legt schnell eine eigene Regel an.

In den Scripts wird einfach nur folgendes gemacht:

#!/bin/bash
RULEOCCURE=iptables -L -n|grep -c $1
if [ $RULEOCCURE -eq 0 ]; then
        /usr/bin/sudo /sbin/iptables -A outgoing_traffic -s $1 -j ACCEPT
        /usr/bin/sudo /sbin/iptables -A incoming_traffic -d $1 -j ACCEPT
fi
iptables -D outgoing_traffic -s $1 -j ACCEPT
iptables -D incoming_traffic -s $1 -j ACCEPT

Das $1 wird zur Laufzeit durch die gewünschte IP ersetzt.

Kommen wir nun zum Logging, Eine Firewall die nicht überwacht wird bringt recht wenig. Deswegen sollte man mitloggen was passiert. Rudimentär kann man mittels des iptables-Befehl selber auswerten.

iptables -L -v -n

Durch diesen Befehl wird für jede FilterChain aufgelistet wie oft sie angewendet wurde. (Counter und Bytes) So kann man auch raus finden welcher Client wie viel Traffic erzeugt. Geht der Counter für die Drops jedoch extrem hoch sollte man mal schauen was da eigentlich passiert. Für dieses anliegen braucht man die LOG – Rule.

iptables -A FORWARD -j LOG --log-level 4 --log-prefix "Forward dropped by firewall: "

Man braucht kein Präfix, es empfiehlt sich aber. So kann man mittels rsyslog dafür sorgen, dass alle Meldungen der Firewall in eine Datei geloggt werden. Dazu bedarf eines eines Eintrag in der rsyslog-config.

#
# FIREWALL logging
#
:msg, contains, "firewall"      /var/log/firewall
:msg, contains, "firewall"      ~

Mittels eines Scriptes kann man nun alle fünf Minuten diese Statistik und die Logs auswerten und ggf Gegenmaßnahmen einleiten. Zb „vollautomatisch“ eine DROP-Regel für eine IP anlegen die eine flood-Attacke durchführt und gleichzeitig eine Warn-Mail absetzen.

Ubuntu als Router

Handelsübliche „DSL-Router“, oder die sogenannten eierlegenden Wollmilch-Säue, nehmen einem im Alltag schon sehr viel Arbeit ab. Leider legen die Hersteller wenig Wert auf  Transparenz oder Wartbarkeit.  Spätestens wenn man etwas mehr Flexibilität will, darf man gleich richtig Tief in die Tasche greifen oder sich selber was basteln bzw eine WRT-Firmware einsetzten.

Linux-Distributionen kommen schon seit Jahren mit einer Grundkonfigurationen die sie mit wenigen Handgriffen in einen vollwertigen Router verwandelt.

Einen DSL-Modem kann man mittels pppoeconf ansprechen.

sudo pppoeconf

Der Installationsmechanismus ist ein wenig krüppelig aber anschließend hat man eine Verbindung ins Internet. Standardmäßig ist sie im „persistenten“ Modus, soll heißen, nach einem 24 Stunden disconnect verbindet sich das System automatisch neu. Zusätzlich wird noch die Möglichkeit geboten scriptes aufzurufen wenn die Verbindung auf oder abgebaut wurde. Das kann man dazu nutzen einen dyndns-Dienst
zu aktualisieren. Installiert man den ddclient, klinkt er sich dort eigenständig ein.

sudo aptitude install ddclient

zusätzlich zu dieser Konfiguration bedarf es noch der Verschaltung der Netzwerke. Wenn man nicht gerade ein öffentliches Netz im betrieb hat wird man NAT nutzen müssen. Dazu muss man einfach mittels iptables folgende regeln konfigurieren. Am besten sollte man das gleich in /etc/rc.local ablegen, damit das setup bei jedem reboot gesetzt wird.

sudo -s
echo "1" > /proc/sys/net/ipv4/ip_forward #alternative /etc/sysctl bearbeiten

iptables -A FORWARD -o  -m state --state ESTABLISHED,RELATED -J ACCEPT #alles akzeptieren was vom Internet kommt und von lokalen Lan initialisiert wurde.
iptables -A FORWARD -o  -J ACCEPT #alles was von Intern nach Extern will akzeptieren.

iptables -t nat -A POSTROUTING -o  -j MASQUERADE #NAT aktivieren

Nach diesem Setup hat man erst mal wieder Internet von allen Clients, wenn man den default-dns-server und standart-gateway korrekt eingestellt hat.

Wenn man über längere zeit „ernsthaft“ einen Rechner direkt am I-Net hängen lässt, sollte man sich jedoch über iptables genauer Informieren. Das genannte Setup ist nur ein Grundsetup und lässt den Router-Rechner ziemlich „exposed“ im Netz.

N220 Backlight unter Ubuntu

Unter Ubuntu funktioniert out of the box die Backlightsteuerung nicht. Um diese zum Laufen zu bekommen, wird im Launchpad ein Patch angeboten (hoffentlich fließt das ganze bald in den Hauptzweig).

unter der Konsole einfach folgenden Befehl ausführen:

sudo add-apt-repository ppa:voria/ppa
sudo aptitude update
sudo aptitude safe-upgrade
sudo aptitude install samsung-backlight

Der zugehörige Bugreport: https://bugs.launchpad.net/ubuntu/+source/hal-info/+bug/429351

Canon MP990 und Ubuntu

Der MP990 ist das neue Flaggschiff unter Canons Home-Office multifunktions Fotodruckern. Er kann mittels WiFi/WLan,RJ45 und USB- Anschluss angesprochen werden. Wer jetzt vermutet, dass der MP990 ein Printerserver integriert hat oder gar Scan-To-Email beherrscht, der irrt. Eingebunden wird der Drucker über das Canon eigene bjnp-Protokoll.

Es spielt keine Rolle wie man den Drucker anschließt. Sowohl für den USB als auch für den Netzwerkbetrieb braucht es spezielle Treiber. Ein anschließen an einen zentralen Server bringt somit nur etwas, wenn man zusätzliche Funktionen wie Scan-to-Mail, Benutzerverwaltung, etc. benötigt.

Drucken

Um die Druckfunktion unter Ubuntu (oder Linux allgemein) zum Laufen zu bekommen, muss man sich die kostenpflichtigen Treiber TurboPrint von ZEDOnet zulegen. Die schlagen zwar nochmals mit 30 oder 60 Euro zu, dafür funktioniert das Drucken anschließend ohne jede Einbuße in Qualität und Performance. Und was soll man sagen. Man merkt diesen Treibern an, dass sie kein lästiges Nebenprodukt sind. Von der Bedienung her ein Segen.

Scannen

Beim scannen wird es kniffliger. Prinzipiell wird die Scann-Einheit von SANE unterstützt und kann somit von jeder Applikation angesprochen die SANE ansprechen kann. Das ist so ziemlich alles was in der Ubuntu-Welt von sich behauptet ein Grafikprogramm zu sein.
Der Hacken an der Sache ist, dass SANE erst ab der Version 1.21 den MP990 unterstützt. Das offizielle Paket aus den Lucid Quellen installiert aber 1.20. Im SANE-GIT-Repositorie liegt 1.22 vor. Man hat nun zwei Möglichkeiten:

  • SANE aus den GIT quellen bauen. Selbst ist der Mann…
  • SANE aus einem alternativen Paket installieren. Dazu muss man wie folgt vorgehen:
sudo add-apt-repository ppa:robert-ancell/sane-backends
sudo apt-get update
sudo apt-get upgrade

Da SANE meist schon installiert ist, wird nun die neue Version (in diesem Fall 1.21) eingespielt und man kann den Scanner ansprechen.

Logitech DinovoEdge unter (K)Ubuntu „zum laufen bringen“

Eine kurze Anleitung, wie man die Medientasten der DinovoEdge unter Linux/X11 und KDE/XFCE und Gnome zum laufen bringt.

Wenn man eine DinovoEdge an einen mit (K)Ubuntu betrieben wird feststellen, dass die Tastatur und das TouchPad zwar funktionieren aber die netten Zusatztasten nicht. Das hat zwei Gründe:

Bei ersterem muss man abwarten, bei letzerem kann man Abhilfe schaffen. Dazu braucht man einen „KeyLogger“ wie xev. Führt man diesen auf der Konsole aus, kann mich sich anschauen, welche Tasten welche KeyCodes auslösen.

Hat man erstmal dadurch eine Liste von KeyCodes zusammengestellt muss man diese auf die „Medientasten“ mappen. Dazu gibt es zwei Möglichkeiten.

  • Eine eigenes Tastaturlayout erstellen und dem X11 über die xorg.conf zuweisen. Diese Variante ist die „sauberste“ aber auch die mit dem meisten „bloat“. Wer es dennoch durchziehen will, sollte hier mal nachlesen.
  • Oder man kann mittels Xmodmap das aktuelle Tastaturlayout erweitern. Das ist unter Ubuntu besonders einfach, da dies automatisch vom System durchgeführt werden kann.

Um letzteres umzusetzen muss man einfach in seinem Home-Verzeichniss eine Datei mit dem namen .Xmodmap anlegen. Diese wird automatisch nach dem Login geladen und „bearbeitet“ das aktuelle Tastaturlayout. Für die DinovoEdge reicht diese Datei.

keycode 225 = XF86Search
keycode 163 = XF86Mail
keycode 180 = XF86HomePage
keycode 173 = XF86AudioPrev
keycode 174 = XF86AudioStop
keycode 172 = XF86AudioPlay
keycode 171 = XF86AudioNext
keycode 121 = XF86AudioMute
keycode 179 = XF86AudioRecord
keycode 150 = XF86PowerDown

Die Syntax sollte selbst erklärend sein. Wenn man andere Tasten zuordnen möchte, kann man die datei /usr/share/X11/XKeysymDB konsultieren, dort sind alle „möglichen“ Zuordnung hinterlegt.Hat man die Datei angelegt, kann man mittels folgendem Befehl, die Änderungen „im System Bekannt machen“

xmodmap .Xmodmap 

Danach kann man diese Tasten in Fenstermanager seiner Wahl funktionen zuweisen. Nach einem Neustart/Login wird diese Änderung automatisch angewendet.

Stromverbrauch der Seashell unter Karmic Koala

Wenn man Ubuntu 9.10 auf einem Netbook installiert, ist die Ausbeute des Akkus nicht optimal. Standardmäßig ist zwar der gnome-powersave-daemon aktiviert, dieser nutzt jedoch nicht das volle Potential. Ein Verbrauch von ca. 9 Watt und 4 Stunden Akkulaufzeit (ohne WLAN) ist nicht berauschend. Mit ein paar Handgriffen bekommt man aber den Verbrauch unter 6 Watt gedrückt und erreicht so die 6 Stunden Akkulaufzeit. Mein Rekord liegt bei knapp 7 Stunden, dabei war der Laptop jedoch nicht wirklich in Benutzung…

Erster Einstiegspunkt zum Stromsparen ist der „laptop_mode“-Tools. Diese sind standardmäßig installiert, jedoch deaktiviert. Dabei bieten sie wesentlich granularere Möglichkeiten das System auf „Sparsamkeit“ zu trimmen. Die wichtigen/benötigten Möglichkeiten kurz zusammen gefasst:

  • Starten und Stoppen von Diensten: Im Batteriebetrieb ist der betrieb einiger Diensten unter Umständen nicht nötig oder nicht so wichtig, dass sie kritisch für das System sind. zb: der NTP dienst.
  • das Abschalten von ungenutzten Video-Outs
  • das Einschränken der verfügbaren Bandbreite bei Ethernet interfaces. 1000MBit sind selten wirklich nötig und kostet das ein oder andere Watt

Um den Dienst scharf zu schalten, muss man die Datei /etc/default/acpi-support bearbeiten.

# Switch to laptop-mode on battery power - off by default as it causes odd
# hangs on some machines
ENABLE_LAPTOP_MODE=true

Kleinere Änderungen müssen auch unter /etc/laptop-mode/conf.d/lcd-brightness.conf gemacht werden, da sich unter dem 1008HA das Interface für das LCD Display wo anders befindet.

BRIGHTNESS_OUTPUT="/proc/acpi/video/VGA/LCDD/brightness"

Die Werte für die Helligkeit können dabei zwischen 0 und 15 skalieren.

Weitere Änderungen können nach Wunsch in den Dateien unter /etc/laptop-mode/conf.d/ gamacht werden. Hier kann man nach belieben sämtliche Veränderungen vornehmen. Das meiste ist selbsterklärend. Dabei gilt immer, alles was man im Normalbetrieb nicht braucht, sollte man abschalten und bei bedarf zuschalten.

Neben diesen „banalen“ Änderungen gibt es noch andere Optimierungen.
Einen „großen“ Vorteil bringt es RamDisk einzusetzten. Solange man mechanische Festplatten einsetzt, ist einer der größten „Stromfresser“ eben diese Festplatte. Entweder leistet man sich bei Gelegenheit eine (sündhaft) teure SSD oder man sieht zu, dass man Mechanische Zugriffe auf die Festplatte so lange unterdrückt wie irgend möglich.

Eine RamDisk ist dabei die UltimaRatio. Mittels tempfs kann man im RAM einen Bereich reservieren, der anschließend in das FileSystem gemountet wird. So kann man zb. den Cache des Browsers oder „/var/log“ direkt in den RAM legen. Auf der haben Seite verbucht man damit, dass die Fesplatte über „lange“ Zeiträume nicht angetastet werden muss. Negativ ist halt, dass alle abgelegten Daten den Kaltstart nicht überleben werden.

Alle bisherigen Optimierungen nutzten nur vorhandene Techniken besser aus, ohne das System in die Instabilität zu treiben. Die weiteren Eingriffe gehen Tiefer und können das System komplett zerschießen. Anwendung auf eigene Gefahr.

Unter Jaunty gab es eine reihe von Traytools die die „Super Hybrid Engine“. Leider fühlten sich einige dieser Entwickler von der Ubuntu-Entwicklungs-Politik so angepisst, dass sie die Entwicklung eingestellt haben. So muss man sich inoffizieller Pakete bedienen die zu alle dem keiner Paketverwaltung unterliegen. Im Internet kann man eine brauchbare Tray-Control finden. Leider startet die auf Anhieb nicht. Da der Pyhton-Script das falsche interface für die Helligkeitssteuerung voraussetzt. Als erstes braucht man die korrekte Schnittstelle. Mittels folgendem befehl das Interface identifizieren:

find /sys/ | grep brightness

Anschließend in der Datei /usr/bin/eee-control-daemon diesen Wert in Zeile 85 und 86 einsetzten. Nun kann man den Dienst starten. Während die Steuerung der RF-KillSwitches nur leidlich funktioniert, kann man über dieses Tool die FSB-Tacktung reduzieren, Was nochmals ordentlich Stromersparnis bringt.

Etwas heickler ist das Abschalten des des AppArmor-Systems. Hier sollte man jedoch kurz inne halten! AppArmor dient zur Sicherung des Systems und stellt eine aktive Sicherheitsebene dar. Jedoch lässt sich für die Praxis eines Netbook-Einsatzes dessen Sinn vernachlässigen bzw in Frage stellen. Die Abschaltung von AppArmor brachte bei meinem System ca 0.5 Watt.

Hat man diesen Schritt einmal getan, ist es mit dem Selberbauen des Kernel auch nicht mehr weit. Der Karmic-Koala setzt auf den Standard-Kernel, dieser ist „leider“ ein generic-Kernel. Also ein Kernel der das größtmögliche Spektrum an Hardware und Spezialanwendungen unterstützt was sich der Jungs bei Chanonical vorstellen können.

Beim konfigurieren des Kernels kann man extrem viel ein und verstellen. Meiner Meinung nach gibt es kann man sich aber auf folgende Punkte beschränken:

  • Zielarchitektur: Der Kernel sollte auf Core2Duo/Xeon optimiert werden, laut mehrere Internetquellen wird damit auch der Atom abgedeckt. Alle weiteren Optionen die andere X86 Architekturen unterstützen kann man abschalten.
  • LargeMemory: Standardmäßig ist der Ubuntu-Kernel auf 4GB eingestellt. In der Seashell sind fest 1GB verbaut. Es braucht den Overhead also nicht.
  • Virtualisierung: Wer will auf einem Atom mehrere virtuelle Gast-Systeme einrichten? Wer auch immer das macht, macht braucht sich um Stromverbrauch keine Gedanken machen 😉
  • AppArmor: will man die Fehlermeldung beim Booten wegbekommen, schaltet man hier auch das Kernel-Interface für AppArmor ab.

Man kann auch Treiber „entfernen“ von denen man weiß das man sie nie brauchen wird. Jedoch bringt das außer einer kleineren InitRamDisk kaum Performance. Mehr bringt da schon das feste einkompilieren von Treibern. Wenn man viel Zeit hat, kann man einen Kernel bauen, der ohne InitRamDisk auskommt. Leider funktioniert dann dann UReadAhead nicht. Dieser dienst speichert alle Dateien die für einen Systemstart gebraucht werden sequenziell optimiert ab. So können sie besser von der Festplatte geladen werden. Leider scheint dieser ohne InitRD nicht klar zu kommen. Der Kernel bootet dann zwar schneller, da er keine RamDisk laden muss, das restliche System braucht dafür merklich länger.

Eine Beispiel Konfiguration hab ich hier bereitgestellt: EEE-Kernel.config

Alles in allem haben mir diese eingriffe rund 3 Watt Leistungsersparniss gebracht. Mit Durchschnittlich 35 WakeUps pro Sekunde ist das Ende aber noch nicht erreicht.