Bluetooth NAP was ist das – und wieso?

Wer heutzutage über Bluetooth Netzwerk schreibt, hat sich wohl als Erstes mal zu rechtfertigen.

Bluetooth heute?

Das in Zeiten wo WLAN in Standards ABGN und noch einigen weiteren Erweiterungen, in allen möglichen Frequenzen verfügbar ist. Ohne mich jetzt unnötig in technischen Details zu verlieren, die ich zugegebenermaßen ohnehin selbst nachschlagen müsste, stelle ich einfach mal die Behauptung in den Raum, dass Bluetooth sich teilweise für mobile Geräte einiges besser eignet als WLAN.

Obwohl beide Techniken ungefähr zur gleichen Zeit zum Endnutzer vordrangen und ursprünglich im gleichen Frequenzband liegen, wurden sie doch mit sehr unterschiedlichen Zielsetzungen entwickelt. Auch in den ersten WLAN Standards findet sich eine Menge zum Thema Powersaving. Aber:

In der Praxis hat es nie wirklich das Tageslicht erblickt. Sendeleistung ist nur in einigen Treibern überhaupt konfigurierbar, in noch weniger Fällen wird diese automatisch angepasst. Stattdessen verfolgte man beim WLAN hauptsächlich ein Standby Konzept. Wenn ein Client nichts zu senden hat, legt er sich für eine definierte Zeit schlafen, in der er nicht mehr erreicht werden kann. Im normalen Betrieb ergab sich daraus eine durchaus unangenehme Latenz, verbindungsorientierte Übertragungen können dadurch unterbrochen werden.

Das alles zusammen führte in letzter Konsequenz dazu, dass sich Powersaving im WLAN Bereich nur minimal und sehr defensiv durchsetzte. Für WLAN im Heimbereich war es nicht relevant, solange es nur darum ging Kabel zu sparen. Für größere Laptops ist der Stromverbrauch von WLAN im Vergleich zum Gesamtverbauch auch nicht wirklich kritisch.

Kritisch wurde der Stromverbrauch erst mit Geräten, bei denen das Halten einer WLAN Verbindung für den Standbybetrieb inakzeptabel wurde. Auf den meisten Mobilgeräten ist dies kaum möglich. Verwendet man eine App, die nicht nur zyklisch Daten abfragt, sondern dauerhaft eine Verbindung benötig, so wird diese höchstwahrscheinlich nach recht kurzer Zeit im Standby abbrechen. Sogar wenn man per Hand alle möglichen WLAN Einstellungen verdreht, ist man leider immer noch nicht vor Verbindungsabbrüchen im Standby sicher. Dies ist unter anderem auch von der verwendeten Netzwerkhardware abhängig. Eigentlich wollte ich ursprünglich noch ein How-To schreiben, aber so viel gibt es diesmal nicht zu tun. Erneut scheint der Textteil deutlich zu überwiegen.

Eine Garantie dafür, dass es funktioniert gibt es auch nicht. Bluetooth unter Linux ist seit Jahren ein Graus. Außer dem Projekt BlueZ gibt es nichts, was nennenswerte Bekanntheit erreicht hätte. BlueZ wiederum ist nicht gerade das, was ich als ein Linux Vorzeigeprojekt bezeichnen würde.

Ohne mich in die Tiefen der Quellcodes gegraben zu haben, schildere ich hier nur den Eindruck, den ich als langjähriger Nutzer gewonnen habe:

Die ersten Versionen hatten einen straight forward Ansatz, wie er im embedded Linux Umfeld üblich ist. Bestehend aus Kerneltreiber und ein paar Daemons, die sich jeweils um sehr eng gesteckte Aufgabengebiete kümmerten. Konfiguriert und gesteuert wurde diese Infrastruktur, von funktional gehaltenen kleinen Binärprogrammen, die direkt mit den Daemons kommunizierten.

Dann kam eine folgenschwere Entscheidung, von der sich Bluetooth auf Linux bis heute nicht ganz erholt hat. Statt das Projekt erwachsen werden zu lassen und erst einmal die Infrastruktur auf alle möglichen Bluetooth Funktionen (und Bluetooth kann bedeutend mehr, als nur Bilder versenden und FTP) zu erweitern, hat irgend jemand beschlossen, dass BlueZ in der alten Form nicht mehr zeitgemäß ist und für den Desktopbetrieb die Infrastruktur komplett umgebaut werden müsste. Anscheinend gefiel es den Entscheidungsträgern nicht, dass die Netzwerkverwaltungsapplets der Desktopdistributionen die Daemons nicht direkt umkonfigurieren konnten, sondern stattdessen dazu jene kleinen Binärprogramme aufgerufen werden mussten.

Das einzig hierfür gültige Argument wäre ein ernst zu nehmender Overhead. Ein Solcher ergibt sich aber realistisch wohl erst bei ein paar Tausend Vorgängen pro Sekunde. Dennoch wurde das Projekt in der Folgezeit funktional auf Eis gelegt und seitdem in Schneckentempo an der Infrastruktur gebastelt.

Die Entscheidung gegen eine Vielzahl kleinerer Daemons, die sich um sehr enge Bereiche kümmern, hin zu dem großen allzweck bluetoothd Daemon, kann ich mit viel Wohlwollen noch nachvollziehen, auch wenn man sich damit eine deutlich größere Fehlerdomäne heranzüchtet, da nun schlimmstenfalls nicht mehr eine Bluetooth Funktion abstürzt, sondern gleich alles. Gerade, wenn man mit wackeligen exotischen Funktionen arbeitet, ist es nicht gerade ein Fortschritt, wenn beim experimentieren gleich immer Alles ausfällt.

Absolut nicht nachvollziehbar ist für mich aber die Entscheidung, die komplette Kommunikation über DBUS abzuwickeln. Ein derart komplexer Nachrichtenbus, sollte für Kommunikation auf Applikationslevel vorgesehen sein und zumindest nicht der einzige Weg sein, dem Bluetoothd irgendetwas mitzuteilen. Jede embedded Plattform wird im Zuge dieser Entwicklung DBUS implementieren müssen, um überhaupt die neueren BlueZ Versionen verwenden zu können.

Auch die Migration dahin verlief alles andere als sauber. Zeitweise liefen beide Ansätze quasi parallel, die kleinen Binärtools wurden umgeschrieben, den Bluetoothd zu nutzen, einige weitere Daemons wurden dennoch gebraucht und bis Heute fehlt ein halbwegs vernünftiges Desktop Applet, dass mehr kann als Filetransfer (wenn er denn mal funktioniert) und Eingabegeräte einbinden. Blueman geht da immerhin schon einmal in die richtige Richtung.

Das Wirrwar um die Bluetooth Funktionen lässt sich auf einen kurzen Blick erfassen, wenn man mal mit dem sdptool und seiner browse Funktion ein Gerät abscannt. Die, zugegebenermaßen schwer zu lesende, Auflistung der verfügbaren Dienste zeigt, was das Gerät glaubt zu können und mit welchen Protokollen man diese Funktionen erreichen könnte. Hier sollte einiges mehr stehen, als die GUIs einem gefiltert offerieren. Noch weniger davon wird das Gerät aber tatsächlich können, denn nicht mal diese Listen werden ordnungsgemäß geführt. Dieses Problem beschränkt sich aber nicht nur auf Linux.

Kommen wir nun also zu dem, worüber ich eigentlich schreiben wollte:

Ethernet über Bluetooth

Wie schon erwähnt, bietet Bluetooth einiges mehr, als nur Eingabegeräte, Filetransfer und FTP. Schon seit sehr langer Zeit gehört auch IP fähige Ethernetemulation zum Standard. Ethernetemulation heißt in diesem Zusammenhang übrigens PAN (Personal Area Network). Recht schnell findet man dazu auch ein How-To aus den besseren Tagen des BlueZ Projekts. Inzwischen funktioniert davon leider so ziemlich gar nichts mehr. Die Ankündigung, die entsprechenden Compat Pakete demnächst komplett zu entfernen, klingt in diesem Zusammenhang fast wie eine Drohung. Jedenfalls halte ich es deshalb nicht mehr für eine gute Idee, noch lange auf diese Tools zu setzen. Aber zunächst die Grundlagen.

PAN kann als Group Ad Hoc Network realisiert werden, einem eher losem Verbund mehrer Client Nodes (PANU) mit einem Verwaltenden Master Node (GN). Diese Betriebsart ist für nicht statische, isolierte lokale Netze gedacht.

Für den Ersatz bzw. die Ergänzung von WLAN eignet sich eher die Betriebsart mit einem Network Access Point (NAP). Dieser stellt dann die Verbindung vom LAN, WAN, oder auch diesem ominösen Internet bereit.

Wird auf einem Bluetooth Adapter mit einem aktuellen BlueZ Stack die NAP Funktionalität aktiviert, so braucht man zwingend eine virtuelle Ethernet Bridge. Das Starten des Dienstes erzeugt nicht sofort ein Ethernet Interface, welches verwaltet, oder konfiguriert werden könnte. Stattdessen wird das Interface dynamisch erzeugt, wenn ein Client sich verbindet. Es ist keine automatisierte Konfiguration des Interfaces vorgesehen, wie man sie in Form von Up- und Downscripts. ggf. von anderen Projekten kennt.
Dadurch wird die Bridge erforderlich. Das einzige was der Dienst macht, ist ein Interface erzeugen, es hochzufahren und dann automatisch in eine vorher per Kommandozeile angegebene Bridge zu hängen. Das funktioniert überraschend gut und ist, von dem bisschen extra Aufwand die Bridge zu erstellen, sehr einfach.

Wie man eine Bridge erstellt und konfiguriert habe ich schon an anderer Stelle beschrieben und gehe daher nicht mehr detailliert darauf ein.

Einen kleinen technischen Haken hat die Geschichte noch und dieser Haken hat mich mehrere Tage und eine Fehlinvestition gekostet. Hardwareseitig ist der NAP Dienst ist nicht in allen Bluetooth Dongles oder Laptopmodulen implementiert. Nicht mal dass er sich starten lässt, ist eine Garantie dafür, dass er dann auch richtig funktioniert. Mit meinen neusten beiden Dongles ging es z.B. nicht. Mit beiden ließ der Dienst sich starten und eine Verbindung mit Mobilgeräten konnte aufgebaut werden. Nach kurzer Verwendung flog die Verbindung dann ohne verwendbare Fehlerberichte raus. Ein Blick in die syslog gibt nur Auskunft über ein hohes Aufkommen von Fehlerhaften ACL Paketen, bevor die Verbindung abbricht.

Klar ACL Pakete. Was auch immer das nun sein soll. So nah wollte ich mich nun eigentlich auch nicht mit der Protokollebene beschäftigen. Etwa eine Stunde Recherche auf Google bringt zu der Fehlermeldung nur immer wieder die gleichen Fehlerberichte zu Tage, wo Nutzer nach einem Systemupdate Probleme damit hatten ihre Logitech Bluetooth Maus zu verwenden.

Bezüglich PAN gibt es keine Treffer nicht einmal irgendwelche Details, was das nun für Pakete sind, warum sie Defekt sein könnten und wie man es beheben könnte. Einige Stunden genervtes Gefrickel später, hatte ich dann raus, dass es sich wohl um ein Problem zwischen Treiber und Dongle handelt. Mit einem zehn Jahre alten Bluetooth V1.0 Class A Adapter ging es dann nämlich plötzlich tadellos.

Sollte dieses Problem bei Irgendjemandem auftreten, kann ich also leider auch überhaupt keine Hilfestellung geben. Abhilfe könnten da nur die Entwickler des BlueZ Stacks selbst schaffen.

Was ist zu tun?

Als Erstes braucht man die aktuellen Binärtools des BlueZ Projektes. Die sind zumindest bei einem Stock Ubuntu noch nicht installiert. Es gibt zwar ein paar Demo Tools mit den Namen bluez-test-*, aber die sind wohl eher Anschauungsmaterial und nicht für den Dauergebrauch gedacht. Es handelt sich um Python (!!!?) Skripte. Im Network Skript ist ein willkürlicher Timeout eingebaut, nachdem der Dienst einfach wieder runter fährt. Es kursieren zwar einige Hacks im Netz, die es für den Dauergebrauch flott machen sollen, aber die funktionierten bei mir nicht und dann ist da noch diese Hemmschwelle.

Einen Systemdienst über ein nicht terminierendes Python Skript konfigurieren, das dann mit samt dem Interpreter im Speicher rumgammelt, bis der Dienst beendet wird? Sonst geht’s Euch aber gut, oder?

Also, mal vorausgesetzt, der geneigte Leser möchte ebenso wie ich, den Dienst nicht von einem wackeligen Hochsprachenskript abhängig machen, dann empfiehlt sich stattdessen die Installation der bluez-tools. Vorausgesetzt das Paket ist auf Deiner Distribution verfügbar, sollte es mit dem Paketmanager deiner Wahl zu beschaffen sein.

Unter Ubuntu und vermutlich damit auch Debian geht es in einem Terminal folgendermaßen:

sudo apt-get install bluez-tools

Aber Vorsicht: Bei mir auf dem Desktop (mit XUbuntu) führt das geradewegs in einen Konflikt. Das Paket enthält ein paar OBEX Tools (das ist der Dienst mit dem Muttis Bilder von ihren Kindern tauschen), die gerne diejenigen ersetzen würden, von denen das Systemapplet Blueman abhängt.

Bei einer Serverinstallation sollte dies nicht weiter stören, denn wer hat schon eine grafische Oberfläche. Für meinen Laptop hieß das:

“tschüß Blueman!”

Ab jetzt wird Bluetooth eben über die Kommandozeile verwaltet. Genau das muss im Folgenden noch gemacht werden, damit der Dienst genutzt werden kann.

Eine PAN Verbindung kann nämlich erst aufgebaut werden, wenn die beteiligten Geräte gepaart sind und einander noch mal explizit vertrauen (Trust). Über das Letztere bin ich dann auch noch einmal gestolpert. Selbst wenn die Geräte gepaart sind, wird die Verbindung ohne Trust nicht aufgebaut. Im syslog findet sich dazu dann nur eine winzige security exception.

Je nach Gerätekombination kann das Pairing von beiden Geräten initiiert werden, oder nur von einer Seite.

Äh? Wieso das denn?

Weil die Praxis mal wieder anders aussieht, als die Theorie. Am Pairing sind softwareseitig einige Timeouts beteiligt, die auf meinem Nexus7 dazu führten, dass ich in etwa eine Sekunde Zeit hatte, einen vierstelligen Code einzugeben und mit Fertig zu bestätigen, bevor das Fenster einfach wieder verschwand. Da ich das in dieser Zeitspanne kein einziges Mal geschafft habe, weis ich jetzt nicht, ob es überhaupt funktioniert hätte.

Eine allgemeingültige Anleitung zum Pairing kann ich aus diesem Grund dafür nicht angeben. Aber ich kann die Tools nennen, die man dazu braucht.

Auf der Serverseite wird man ohne die MAC Adresse des Clients nicht weit kommen. Da wir alle es hassen, diese viel zu langen MAC Adressen abtippen zu müssen, bietet es sich hier an, den Client auf sichtbar zu stellen. Bitte dabei nicht vergessen, dass er sich im Regelfall nach recht kurzer Zeit von alleine wieder auf unsichtbar stellen wird.

Ab hier bauchen wir für jeden weiteren Befehl Administratorrechte, weshalb für die anstehende Bastellei auf eine Root Konsole gewechselt werden sollte.

sudo -s

Willkommen in der Root-Shell.

Das Scannen nach auffindbaren Bluetooth Geräten ist eine Funktion des Adapters. Jeder Bluetooth Adapter erhält vom BlueZ eine eigene Liste von Geräten mit denen er gepaart ist und denen er vertraut. Dies bitte nicht vergessen, falls Ihr Experimente mit mehreren Adaptern vor habt.

Ein Scan kann zwar weiterhin auch mit dem hcitool initiiert werden, aber wir sind ja up to date.

bt-adapter -d

Ich gehe jetzt mal davon aus, dass der gewünschte Client in der Liste ist. Die MAC Adresse sollte jetzt irgendwo hinterlegt werden, wo man sie beliebig oft wieder rauskopieren kann.

So. Jetzt hätte ich beim Schreiben beinahe einen Fehler gemacht, der mir auch beim Basteln passiert ist. Die meisten Geräte fragen nämlich nur genau ein mal ab, welche Dienste der Partner anbietet und das ist beim Pairing. Dabei kommt das weiter oben schon erwähnte Service Discovery Protokoll (SDP) zum Einsatz. Dabei wird eine kryptische Liste mit teils numerischen Identifiern und Zoix(tm) getauscht. Der NAP Dienst wird aber erst in der Liste des Servers geführt, wenn er auch aktiv ist. Irgendwie logisch, oder? Das machen wir jetzt also mal ganz schnell zwischendurch.

bt-network -s nap <BRIDGE> &

Das war’s auch schon. Der Dienst läuft und ist im SDP registriert. Ich bitte darum, das kaufmännische Und am Ende der Zeile nicht zu vergessen, da das Tool sich nicht selbst in den Hintergrund begibt, und ansonsten die Kommandozeile blockiert. Natürlich könnte man hier mit einem beherzten Strg + Z und dem darauffolgenden Befehl bg (Background) Abhilfe schaffen.

Der Dienst ist nun also da. War es das nicht schon?

Nein leider nicht. Man findet den Dienst jetzt zwar mit dem sdptool, aber verbinden können sich nur Geräte, die gepaart sind, einander vertrauen und vor allem überhaupt wissen, dass der Dienst verfügbar ist. Wenn die Geräte schon mal gepaart waren, sollte der Client  in den meisten Fällen noch mal entfernt werden, damit er beim nächsten Mal eine aktuelle Liste der Dienste bezieht.

bt-device -r <CLIENT MAC>

Wird den Client bei Bedarf Serverseitig aus der Liste der bekannten Clients und auch der Trustliste entfernen.

Das Pairing kann jetzt aktiv oder passiv erfolgen. Aktiv geht des so:

bt-device -c <CLIENT MAC>

Dadurch wird automatisch bei Bedarf der bt-agent gestartet, der sich um den Rest des Parings kümmern wird. Je nachdem, welche Bluetooth Versionen beteiligt sind. Müssen jetzt Nummern getauscht werden, oder nur bestätigt, oder eine DNA Probe abgegeben werden.

Wenn die aktive Variante des Pairings nicht funktioniert, kann der Server das auch passiv. Dazu muss der bt-agent einfach manuell gestartet werden. Allerdings sollte der Server in diesem Zeitraum überhaupt sichtbar sein, sonst macht das herzlich wenig Sinn.

bt-adapter --set Discoverable True
bt-agent

Achtung: Der Kram legt Wert auf korrekte Groß- und Kleinschreibung (WTF!)

Ebenso wie der bt-network Dienst, blockiert auch der Agent die Kommandozeile. In diesem Fall ist das aber wünschenswert, weil wir sie für die nötigen Eingaben brauchen werden. Wie schon bei der aktiven Variante, sollte der Pairingprozess relativ selbsterklärend sein.
Da man anscheinend davon ausging, dass gleich mehrere hundert Clients angemeldet werden sollen, beendet sich der Agent nicht selbst, sondern muss via Strg + C terminiert werden (*seufz*).

Das war’s jetzt schon – fast!

Da wäre immer noch die Sache mit dem Vertrauen. Der NAP Dienst ist nämlich verdammt misstrauisch und lässt absolut niemanden rein, dem er nicht vertraut. Selbst wenn er in Form des Pairings eigentlich schon den Haustürschlüssel hat.

Du kommst hier vielleicht rein. Aber reden tu’ ich deshalb noch lange nicht mit dir!

Also gut, dann müssen wir halt für eine sanfte Annäherung sorgen:

bt-device --set <CLIENT MAC> Trusted True

Damit sollte der Weg jetzt frei sein! – Oder, was jetzt gehen sollte:

Der Server wird auf dem Client als Computer angezeigt. Je nach Betriebsystem, bei mir sind das diverse Androiden, kann man eine Liste der verfügbaren Dienste unter Details anzeigen. Dort gibt es dann auch einen Dienst Namens Internetfreigabe, oder so ähnlich.

Klickt man diese Freigabe an, baut der Client eine Verbindung zum Server auf. Der NAP Server erzeugt ein Ethernetinterface und fügt es der Ethernetbridge hinzu. Von der Bridge aus sollte ein DHCP Server zu erreichen sein, denn der Client wird als nächstes versuchen eine IP Adresse zu beziehen und DNS Server und Gateway zu konfigurieren. Im trivialsten Fall wird das alles der Router erledigen, der die Internetverbindung bereitstellt. Bei Problemen muss also nur überprüft werden, ob die Bridge richtig funktioniert. Wenn das Bridgeinterface selbst über DHCP keine Adresse bekommt und keine Verbindung zum Internet herstellen kann, dass wird dies auch keinem Interface gelingen, das der Bridge hinzugefügt wurde.

In meinem Fall habe ich durch dieses doch recht beschauliche Setup jetzt endlich eine stabile Verbindung mit meinen Mobilgeräten, selbst wenn diese sich im Standby befinden. Verbinde ich mich stattdessen z.B. über WLAN auf den SSH Server meines Tablets, erhalte ich ein Netzwerklag, welches sich in etwa wie eine gestörte GPRS Verbindung verhält, sobald der Bildschirm aus ist.

Bluetooth hingegen bleibt uneingeschränkt performant, hat aber zugegebenermaßen grundsätzlich eine deutlich geringere Durchsatzrate als WLAN und ist damit für größere Downloads und Internetvideos ungeeignet. Dafür hat man aber eine stabile Verbindung die auch ohne Probleme die ganze Nacht übersteht.

seltsame Zugriffe

Da wollte ich mich doch gerade mal wieder ein bisschen mit dem Blog beschäftigen, da sehe ich in den Logfiles, dass gerade Irgendjemand irgendwas versucht. Anscheinend aber automatisiert. Kein Mensch wäre so dumm immer wieder an der selben Stelle nach der Administrationsoberfläche zu suchen.

Vielleicht sollte ich auf der 404 Seite einen Hinweis hinterlassen wo sie ist. Weiterbringen tut das auch Niemanden.

HowTo: Android in der Linux KVM

Vorwort:

Dieses kleine HowTo richtet sich prinzipiell an Jeden, der einfach mal auf einem PC mit Android rumspielen will, aber selbst nicht die Zeit und Motivation aufgebracht hat, es selbst zum laufen zu bringen. Gründe dies zu tun wären z.B. wenn man selbst kein Andoid Gerät hat, oder nur ein veraltetes, so wie ich und mal sehen möchte, was denn im Lager Google gerade der Stand ist. Auch für Entwickler ist ein Virtuelles System natürlich interessant, weil man bei Experimenten nichts beschädigen kann, was man gleichzeitig im täglichen Gebrauch hat.
Eigeninitiative ist kaum noch nötig, es wird ein Archiv verwendet, in dem ein fertig installiertes Image liegt und ein Shell Skript, welches die KVM mit den nötigen (und richtigen) Optionen startet.

Nachtrag: Obwohl nicht mehr sonderlich viel zu tun ist, gelang es mir nicht, mich kürzer zu fassen, ohne dabei diejenigen zu vernachlässigen, die ggf. etwas mehr Hilfe brauchen.

Warnung / Hinweis:

Dieses HowTo ist wirklich nur für die Linux KVM. Die verwendeten Befehle machen nur unter Linux Sinn und das verwendete Image hat absichtlich keinen Bootblock, da die KVM den Android Kernel selbst bootet.
Warum?
Ich teile hier meinen eigenen Wissensstand, einfach nur weil ich Spaß daran habe und diesen mit Anderen teilen will. Die Worte Windows, VMWare und Spaß kann ich mir nicht in einem positiven Zusammenhang vorstellen, ohne dass nicht mindestens eins davon negiert ist.
Selbstverständlich kann man Android auch virtualisiert unter Windows zum laufen bekommen, aber das interessiert mich nicht und ich werde mich nicht in meiner Freizeit damit beschäftigen.

Motivation:

Möglichkeiten der Virtualisierung gibt es sicher viele und wie es immer so ist, wenn man keine fertige Monokultur vorgesetzt bekommt, sollte man sich zunächst informieren, denn es gibt ebenso viele Möglichkeiten, etwas, sagen wir mal, weniger gut zu lösen.

Weniger gut ist imho die Lösung die Google selbst. Wer den hauseigenen Emulator nutzen will, kommt nicht darum, das Ganze SDK aufzuspielen, eine Zielplattform auszuwählen und diese auch noch zu konfigurieren. Schritte, die für Jemanden, der eher Nutzer als Entwickler ist, alles andere als trivial sind.
Auch die Art, wie Google den Emulator implementiert hat, ist … ungewöhnlich. Normalerweise werden Emulatoren so systemnah wie möglich entwickelt, da sie, als Herzstück der Virtualisierung, entscheidend für die Performanz des Gastsystems sind.
Google schien die Portabilität des Emulators wichtiger zu sein – sie verwendeten Java. Mehr müsste man eigentlich nicht sagen. Ich fasse dennoch zusammen:
Ein Emulator, der in Java geschrieben ist, emuliert ARM Hardware, auf der Java läuft.
WTF!!!
Zumindest auf meiner bescheidenden Hardware ist das Konzept unbenutzbar und produziert auch nach mehreren Minuten nur eine Menge warme Luft aus dem Gehäuse, bevor dann endlich eine elendig lahme Oberfläche kommt.

Ansatz:

Auf meiner Suche nach einer brauchbaren Alternative, stieß ich auf das Projekt
Android x86. Deren primäres Ziel ist es zwar, Android auf physikalisch existierende PC Hardware zu bringen, aber schließlich ist es auch primäres Ziel einer guten Virtualisierung, physikalisch existierende Hardware möglichst nah und performant abzubilden.
Tatsächlich finden sich auch einige, leider zu kurze und veraltete, Tutorials für die Virtual Box. Warum sie gerade die verwenden, wird nirgendwo erwähnt, aber ich gedenke ja auch nicht, mich für die Präferenz der KVM zu rechtfertigen.
Also Android auf einer x86 KVM. Nun kommt natürlich die Frage:

Andoid auf x86? Ist das nicht für ARM entwickelt? Funktioniert das?

Zumindest die letzte Frage kann ich direkt und präzise mit Ja beantworten. Wäre dem nicht so, würde ich dazu kein HowTo schreiben. Bei der zweiten Frage, wird es schon schwieriger.
Generell wurde Android für die Dalvik VM entwickelt. Diese ist im Gegensatz zu z.B. der OpenJRE eine Stack orientierte Maschine und keine Registermaschine. – Hä? – Irrelevanzinformation.
Soll heißen: Das meiste von und für Android sollte Plattformunabhängig sein.
Sollte.
Wäre dem 100%ig so, würde Google kein NDK (native development kit) bereitstellen. Zunächst ist natürlich ohnehin Alles erst mal bis zum Start der Dalvik VM native Linux. Das kann man in jeder brauchbaren Umgebung, für nahezu jede weiter verbreitete Hardware, kompilieren und so hat es das Android x86 dann auch gemacht.
Effektiv scheitern werden wir bei einigen Paketen also nicht an der Hardware, sondern am Paketmanagement von Android selbst. Dieses kennt nur komplette Zielgeräte und die Kompatibilitäten dazu einzustellen, ist den Entwicklern überlassen. So kommt es, dass es Pakete gibt, die angeblich überall funktionieren, dann aber doch ein paar entscheidende Brocken native ARM Code enthalten, der dann wortlos einfach nicht funktioniert.
Bei meinen ersten Versuchen, war das noch ein ärgerliches Problem. Die von mir jetzt eingesetzte Version enthält ein paar Librarys von Intel, die notfalls einspringen und den ARM Code, meist erfolgreich, laufen lassen. Wir erinnern uns: Es gibt jetzt auch Android Tablets mit Intel Atom Prozessoren.
Des Weiteren ist noch ein Ethernet Patch dabei, der für die nötige Unterstützung des Netzwerkinterfaces sorgt.
Leider ist die Dokumentation von Android x86 etwas veraltet, was die Virtualisierung angeht – fertige Images gibt es entweder undokumentiert generisch, oder ebenso undokumentiert für diverse Laptops. Welche Hardware die KVM nun verwenden soll, ist daher ein langweiliges ausprobieren, welches ich euch gerne ersparen würde. Die Virtuelle Soundkarte, welche funktioniert, hat zwischen den beiden Images, die ich jetzt verwendet habe, gewechselt und in beiden Fällen war es nicht die, die im Virtual Box HowTo des Projekts empfohlen wird.

Ja, Ja – Los jetzt! - Setup:

Benötigt wird:

  • Die KVM
  • Dieses Archiv mit dem Image
  • XZ um es zu entpacken (entschuldigt die Bandbreite schonende Unannehmlichkeit)
  • ein echtes Netzwerkkabel (am Netz, bitte)
  • eine virtuelle Ethernet Bridge
  • das Usermode Ethernet Interface tap0 für die KVM
  • das Paketmanagement deiner Wahl um evtl. hiervon fehlende Pakete zu installieren

Die Anweisungen zur Paketinstallation beziehen sich im Folgenden auf Ubuntu. Die Pakete sollte aber auch auf anderen gängigen Distributionen verfügbar sein. Falls der Paketname nicht stimmt, nicht gleich entmutigen lassen, sondern einfach nach dem Befehl suchen.
Ich verwende den simplen Befehl apt-get. Selbstverständlich kommt man auch mit aptitude und synaptic zum Ziel. Anfängern empfehle ich synaptic. Das ist übersichtlich und grafisch, arbeitet aber langsamer, da es unter der Haube so einiges werkeln muss, um diesen Luxus zur Verfügung zu stellen.
Für Distributionen die nicht von Debian abstammen, fallen mir noch emerge und yast ein, Letztes kenne ich nur noch rudimentär, Ersteres gar nicht. Normalerweise sollte ein grafischer Desktop irgendwo eine Paketverwaltung anbieten. Genug dazu.

KVM:

Die KVM sollte installiert sein. Wer noch nie damit gearbeitet hat, muss sich nicht fürchten, ein passendes Startskript ist dabei. Falls die KVM noch nicht installiert ist hilft hier:

sudo apt-get install kvm

das wars dazu auch schon.

Image:

Spätestens jetzt ist es an der Zeit, das Archiv zu laden. Bitte irgendwo speichern, wo Du es nachher wieder findest. Downloads ist nur eine beschränkt gute Idee, da das folgende Kommando es genau dort hin extrahieren wird.
Die ISO zur Installation habe ich übrigens von www.android-x86.info geladen. Die Installation habe ich Euch soweit erspart und bis zum ersten Boot selbst vorgenommen. In den Bootoptionen der KVM wird eine zweite Partition für eine SD-Karte übergeben. Einige Apps hätten gerne eine Solche.
Der Installer von Android x86 stellt sich dabei aber gerne quer, oder will unbedingt ein Fileimage dafür anlegen. Ein Fileimage in einem Fileimage ist schon fast ein bisschen wie Java auf ARM, dass von Java emuliert wird.
Ich würde gerne den Author der ISO, Ron M. dafür verlinken, finde ihn aber nicht.

Auspacken:

XZ ist der Nachfolger von LZMA, oder kurz, der meines Wissens nach der effizienteste momentan in der Open Source Welt verfügbare Packer. Er darf auch gerne nach dem Extrahieren wieder entfernt werden.
Falls du kein XZ hast:

sudo apt-get install xz-utils

Wenn Dein distributionseigenes tar xz unterstützung hat, reicht nun ein:

tar xvJf <Pfad zum Archiv>

ansonsten

xzcat <Pfad zum Archiv> | tar xv

Das Netzwerk:

Hier gab es jetzt zwei Möglichkeiten. Die KVM kann sich von Haus aus so verhalten, als wäre das Gastsystem in einen Router eingestöpselt.
Ich habe mich gegen diese Möglichkeit entschieden, weil damit Andoid in einem virtuellen Netzwerk eingesperrt wäre, aus dem es zwar raus kommt, weil die KVM die Internen IP Adressen übersetzt und weiterleitet – wie ein Router ins Internet weiterleitet (NAT) – aber man kommt aus dem lokalen Netz nicht rein. Mit meinem Setup erhält Android eine eigene IP Adresse aus dem selben Netz, welches auch der Host Rechner verwendet. Das ist für Debugging, Entwicklung und eigentlich überhaupt prinzipiell so ziemlich Alles besser.
Der Haken:
Das funktioniert nicht mit WLAN. Es sei denn man verwendet einen Router welcher WDS unterstützt und dafür richtig konfiguriert ist (was nur komische Leute wie ich machen). Dann müsste man die virtuelle Bridge und das WLAN Interface des Host Rechners (wenn es überhaupt WDS kann) aber auch noch dafür konfigurieren.
Muss nicht sein, oder?
Ohne WDS wird jedenfalls kein Paket vom WLAN-Router das Gastsystem erreichen, weil dieser immer direkt an den Zielrechner Adressiert. Die WLAN Schnittstelle gehört aber dem Host.
Nimmt man stattdessen ein Kabel, kommen Pakete für den Gast über die Bridge auch direkt ohne Umwege beim Gast an.
Da wir uns jetzt für ein Kabel entschieden haben, können wir ja weiter machen.

Die Bridge:

Die Ethernetbridge ist nun keine besondere Zauberei, sondern genau das, was heutzutage in so ziemlich jedem Router die Pakete zwischen Kabel und Kabellos verteilt. Sie verbindet physikalisch getrennte Netzwerke miteinander, indem sie auf allen Anschlüssen lauscht wer redet und dann ggf. Pakete von einer Seite auf die andere weiterreicht, wenn die Parteien hinter verschiedenen Netzwerkschnittstellen sind.
Ob dies nun wirkliche Netzwerke sind, oder nur ein virtuelles, wie bei der KVM, ist der Bridge dabei egal. Wie praktisch.

Wer die Ethernet Bridge nicht installiert hat, holt das mal eben schnell nach:

sudo apt-get install bridge-utils

Der Einfachheit halber erstellen wir auch gleich ein Interface und fahren es hoch.

sudo brctl addbr br0
sudo ip li se up br0

Den Syntax des ip Befehls lässt sich in der Regel auf zwei Buchstaben verkürzen und ist daher etwas gewöhnungsbedürftig. In älteren Distributionen gehört er noch nicht zur Standardausrüstung. Alternativ kann ifconfig verwendet werden.

ifconfig br0 up

Das ist in diesem Fall sogar kürzer, der Befehl ist aber nicht so universell einsetzbar und wird von mir daher nur noch selten verwendet. Falls Du ip nicht hast, kannst du jedes Auftreten mit ifconfig ersetzen. Für etwas Anderes, als zum Hochfahren von Interfaces, werden die Befehle in diesem HowTo nicht gebraucht.

Das TAP Interface:

Dieser Abschnitt könnte mehr oder weniger überflüssig sein, denn die KVM kann selbst ein TAP Interface richtig konfigurieren und verwenden. Das kann sie aber nur, wenn sie die nötigen Rechte dazu hat d.h. die KVM die ganze Zeit als ROOT läuft.
Da wir der KVM aber nur so viele Rechte wie eben nötig geben wollen, stellen wir dieses Interface selbst bereit. Dazu brauchen wir die uml-utilities.

 sudo apt-get install uml-utilities

Genauer gesagt, den Befehl tunctl.

sudo tunctl -u <dein Username>

Das System sollte Dir jetzt bestätigen, dass es das Interface tap0 für Dich angelegt hat. Das Besondere daran ist, dass es nun auch mit deinen Nutzerrechten verwaltet werden kann. Solltest du nicht tap0 bekommen haben, existiert es vermutlich schon, weil du selbst Etwas damit machst und ohnehin genau weist was du tust.
In dem Fall brauchst Du diesen Abschnitt wohl nicht. Vergiss dabei bitte nicht, dass ich davon ausgehe, dass wir mit tap0 arbeiten.
Das Hochfahren auch nicht vergessen.

sudo ip li se up tap0

Die Netzwerkkonfiguration:
Nun wird es etwas kniffeliger. Bis jetzt haben wir mit Netzwerkschnittstellen rumgefummelt, die der automatischen Netzwerkverwaltung relativ egal sind, solange Niemand etwas für sie angelegt hat. Das ändert sich nun.
Daher muss jegliche automatische Netzwerkverwaltung abgeschaltet werden. Dies kann und wird Deine Internetverbindung trennen, wenn auch nur temporär.

sudo stop network-manager

Dieser Befehl könnte unter Umständen sehr ubuntuspezifisch sein. Alternativen kann ich für andere Distributionen leider nicht anbieten, da ich nicht weis, wie die ihr Netzwerk konfigurieren.
Auch die Netzwerkschnittstelle eth0, mit der ich die KVM verwenden will, wurde hierdurch dekonfiguriert und heruntergefahren. Also muss sie zunächst wieder hochgefahren werden. Wenn Deine primäre Netzwerkschnittstelle für Kabel Ethernet nicht eth0 ist, gehe ich wieder mal davon aus, dass Du die erforderlichen Änderungen selbst nachvollziehen kannst.

sudo ip li se up eth0

Die Schnittstellen müssen nun genau in dieser Reihenfolge in die Bridge integriert werden, denn die Ethernetadresse der Bridge wird sich in den meisten Fällen nach dem Interface richten, welches als Erstes hinzugefügt wurde.

sudo brctl addif br0 eth0
sudo brctl addif br0 tap0

Das würde jetzt für die KVM ausreichen, um sich ins Netz zu integrieren, nur wäre es ja auch ganz schön, wenn das Host System auch wieder Netz hätte. Dazu fehlt nur noch eine IP Adresse. Wir benutzen jetzt aber nicht mehr die Netzwerkschnittstelle direkt, sondern die Bridge.

sudo dhclient -v br0

Dabei gehe ich natürlich davon aus, dass das Netz DHCP verwendet. Wenn das nicht der Fall ist, sollte Derjenige, der das abgeschaltet hat, auch wissen, was zu tun ist.

Der erste Start:

Hierfür reicht es, kvmstart.sh im Verzeichnis auszuführen, wo das Archiv extrahiert wurde.

. kvmstart.sh

Ja, richtig gesehen. Das beginnt mit einem Punkt. Alternativ wäre auch source möglich gewesen. Ich wollte nur vermeiden, für eine Zeile eine Shell in der Shell auszuführen, die die KVM ausführt. Muss ja nicht sein.
Das wäre es dann auch endlich von meiner Seite aus. Die KVM sollte starten und Android wird Dich nach Deinem Google Account usw. fragen. Vorher muss noch eben bestätigt werden, dass der Wizard für die Systemanmeldung verwendet werden soll. Durch die Anmeldung kann die KVM wie ein reguläres Android Device verwendet werden. Pakete können also bequem über den Play Store installiert werden, der allerdings bis zum ersten Update noch Google Market ist.

Hinweis:

Die KVM wird den Mauszeiger einfangen, da diese einfache Version der Konfiguration eine Maus emuliert. Den sog. Mausgrab verlässt man mit Strg + Alt.
Wer davon genervt ist, kann durch das Anfügen der Optionen -usb -usbdevice tablet an die KVM Kommandozeile in kvmstart.sh auf ein virtuelles usb Tablet wechseln. Die Maus verlässt dann das Fenster, sobald sie am Bildschirmrand ankommt.
Abschließend sei erwähnt, dass die Grafik geringfügig beschleunigt werden kann, wenn man die KVM stattdessen mit VNC Display Ausgabe arbeiten lässt. Dann braucht man natürlich auch ein VNC Viewer um die Anzeige sehen zu können. Mehr dazu, falls jemand danach fragt.

Infrarotes Gefrickel

Für diese Bilder habe ich technisch gesehen keine besondere Ausrüstung verwendet, wenn man mal von einem handelsüblichen Filter absieht (Grenzfrequenz 720nm, für Interessierte).


Aufnamedatum:  23.06.2012

So richtig tief im Infraroten Bereich bin ich damit aber noch nicht, weil dafür die Grenzfrequenz viel zu nah am sichtbaren Bereich liegt. Des Weiteren gehe ich davon aus, dass die Frequenz wohl kaum dafür steht, dass ab diesem Wert alle kurzwelligeren Strahlen komplett geblockt werden, sondern vielmehr nur der Mittelpunkt einer abfallenden Kurve ist, die sich vermutlich über viele Nanometer Wellenlänge erstreckt. Auch ist die Blockierung mit Sicherheit nicht hundertprozentig und so kommt noch Einiges im grünen Bereich des Spektrums an.

Schlussendlich kann ich aber mit Langzeitbelichtung schon so einiges aufnehmen, was sich dem Auge so nicht darstellen würde. Die Langzeitbelichtung ist leider erforderlich, weil in der Kamera selbst noch ein Filter sitzt, der eigentlich genau diesen Bereich des Lichts blockieren soll, damit er bei normalen Bildern nicht zu Fehlfarben führt. Genau auf diese Fehlfarben kommt es mir aber an. Zum Glück ist kein Filter im mathematischen Sinne perfekt.

Für diese und ähnliche Bilder habe ich eine eigene Seite eingerichtet, wo es später auch mehr davon zu sehen geben wird.

Zoix

Wenn ich mich gerade so in meinem Zimmer umsehe, fühle ich mich gezwungen, den Begriff Zoix an dieser Stelle zu definieren.

Zoix, exolenter Sprachgebrauch, ist abgeleitet vom deutschen Begriff Zeug. Ungleich dem Stammwort, hat Zoix eine stark negative Vorbelegung. Es wird vermutet, dass diese Bedeutungsdrift durch den aktiven Sprachgebrauch entstand. Besonders die abgewürgt hervorgebrachte Endung auf x, drückt starken Unwillen aus.

“Muss ich mich jetzt mit diesen Zoix auch noch beschäftigen?”

Zu beachten ist dabei, dass Zoix eine weniger deutlich und weniger gegenstandsbezogene Nutzung haben kann, als das Stammwort.

Der Begriff kann sowohl analog zum Stammbegriff verwendet werden,

“Woher kommt all das Zoix, was hier schon wieder rumliegt?”

als auch Handlungen

“Nicht heute, ich hab noch ‘ne Menge Zoix zu erledigen.”

und insbesondere geistiges Eigentum.

“Was schreibt der eXo denn da schon wieder für ein Zoix.”

Für den korrekten Wortgebrauch ist grundsätzlich die sog. scheinbare Überflüssigkeit Grundvoraussetzung.

Als Zoix werden typischerweise auch besonders Alltagsgegenstände bezeichnet, die während einer längeren Tätigkeit nur kurz erforderlich sind, aber die Abart besitzen, nach Gebrauch nicht selbstständig und sortiert an ihren Ursprungsort zurückzukehren.
(Sonderform: Werkzoix)
Diese Gegenstände sammeln sich am Ort des Wirkens in immer größeren Mengen an, obwohl sie nicht benötig werden.

Daher hat Zoix die Eigenschaft, ganz allgemein Fortschritt zu behindern. Das Auftreten von Zoix hat zur Folge, dass Ressourcen belegt werden, die ohne Zoix sinnvoller genutzt werden könnten. In diesem Sinne wird Zoix häufig als Abfallprodukt des menschlichen Wirkens gesehen, unterscheidet sich aber von gewöhnlichem Abfall dadurch, dass es generell nicht entsorgt werden darf, sondern durchaus noch einen nicht zu vernachlässigenden Wert hat.

Zoix erfordert stattdessen die Aufwendung weiterer Ressourcen (meist Zeit) um die, von ihm nur temporär belegten, Ressourcen wieder nutzbar zu machen. Seine blockierende Eigenschaft wird meist als grundlegend falsch empfunden und ruft deshalb den Unwillen hervor, sich überhaupt mit Zoix zu beschäftigen. Diese Eigenschaft wird dadurch noch verstärkt, dass Zoix grundsätzlich einen Handlungsablauf unterbricht (interruptive Eigenschaft).

Wissenschaftliche Untersuchungen erklären diese Eigenschaft dadurch, dass es unmöglich ist, Zoix parallel zu verarbeiten. Eine Serialisierung der wünschenswerten Handlung mit der notwendigen Handlung, zu Ungunsten der wünschenswerten Handlung, ist unumgänglich.

Die schlimmste Form von Zoix ist das sog. Hyperzoix. Es erfüllt die Kriterien des Zoix in mehreren Ebenen und ist fachlich gesehen vielfach interruptiv.

Ein Beispiel hierfür wäre eine Tiefkühlpizza auf einem Toilettendeckel. Selbst nach Auflösung des ersten Interruptivs, verliert die Tiefkühlpizza den zoixigen Charakter nicht, da sie weiterhin nutzlos ist.

Erst nach der Zubereitung im Backofen steht sie zum Verzehr bereit und wird zum sinnvoll nutzbaren Gegenstand des täglichen Lebens. Schon die Zubereitung generiert aber schon wieder neues Zoix. Es ensteht leere Verpackung und Abwasch. Der angestrebte Zustand der Zoixfreiheit ist erst wieder hergestellt, wenn die Verpackung entsorgt wurde, das Geschirr abgewaschen und wieder in den Schrank geräumt wurde.

Die allgemeine Auflösung der von Zoix verursachten Ressourcenverklemmung bezeichnet man auch als Entzoixigung.

Das obige Beispiel wurde nicht willkürlich gewählt. Nahrung und Nahrungsaufnahme sind Gegenstände und Vorgänge, die von Natur aus ein sehr hohes Zoixniveau aufweisen.

Eine utopische Gesellschaft sollte, nach derzeitigem Stand der Wissenschaft, ihren Fokus auf die Entzoixigung jeglicher Prozesse richten. Paradoxerweise kann dies dadurch erfolgen, dass einzelne Individuen die Entzoixigung zu ihrem Beruf machen.
Es konnte bewiesen werden, dass die aktive Beschäftigung mit Zoix, in einem ununterbrochenen Prozess, zoixartige Ressourcenverklemmungen für Dritte Auflösen kann.

“Des Einen Zoix, des Anderen Freud.”

Als Beispielhaft für diesen Prozess sind Fastfoodketten hervorzuheben, die bereits in unserer heutigen, sehr zoixlastigen Gesellschaft, einen großen Beitrag zur Entzoixigung leisten.

Nachtsichtexperimente


Mein Nachtsichtgerät ist eher eine günstigere Ausführung. Es hat keinen internen Recorder, sondern gibt die Rohdaten des Chips mehr oder weniger unverarbeitet über einen Chinchausgang analog aus.

Daher stehe ich seit der Anschaffung immer wieder vor der Frage, wie ich das Gesehene digital Konservieren soll. Ich habe zwar einen hardware MPG4 Encoder der etwa die Größe einer alten Audiokassette hat, aber der ist eigentlich nicht für den mobilen Einsatz gedacht und hat keine eigene Spannungsquelle. Da er aber einen 5V Anschluss hat und nur etwa 500mA Strom benötigt, kann man den unter Heimbedingungen wunderbar mit einem Akkupack betreiben. Draussen gestaltet sich das dann schon schwieriger, weil dabei ein ziemliches Kabelknäuel entsteht. Ohne einen externen Spannungswandler lassen sich konstante 5V schlecht bereitstellen.

Auch die Bedienung des Onscreen Menüs erwies sich als wenig outdoortauglich, wenn ich nicht extra einen kleinen Monitor mitschleppen will, der wiederum bei schwachen Lichverhältnissen viel zu hell ist und noch weitere Kabel und Akkus braucht.

Am Ende war der Encoder auch nicht gerade geeignet, die doch stark verwackelten Bilder aufzunehmen. 2MB/s Stream mit einem sehr vereinfachten MP4 Encoderalgorithmus sind einfach zu wenig.

Was mich dann letztendlich dazu brachte, nochmals zu versuchen, meinen uralten USB2 Videograbber zum Laufen zu bekommen. Mit einer neueren Kernel funktionierte dieser seit mindestens zwei Jahren andauernde Versuch dann auch endlich. Ob es letztendlich an neueren Kerneltreibern lag, oder daran dass ich eine die Parameter des Kernelmoduls per Hand einstellte, kann ich gar nicht genau sagen. Wie so häufig ist das Warum nebensächlich, wenn etwas endlich funktioniert. Bei ersten Versuchen war ich daran gescheitert, dass der Grabber nicht identifiziert werden konnte, denn den Hersteller, irgend eine asiatische no-Name Firma, gibt es längst nicht mehr. Immerhin ist er kompatibel zu einem gängigen Standardmodell (wen wunderts).

Also probierte ich, stattdessen die Videodaten mit meinem Netbook aufzuzeichnen. Viel weniger Kabelgewirr gab es dabei allerdings auch nicht. Wenigstens aber diesmal keine Wackelkontakte. Da Nachtsichtgeräte in den seltensten Fällen Mikrofone haben, dachte ich, ich könne meinen Audiorecorder parallel dazu laufen lassen. Bei dem Versuch blieb es dann aber auch. Der Arme kleine Intel Atom (N270) war mit dem Encoden derartig überfordert, dass er immer mal wieder Bilder verlor, wodurch es vom Aufwand her unmöglich war Bild und Ton zu Synchronisieren.

Da Speicherplatz bei diesem Setup nicht das Problem ist, werde ich wohl ausprobieren, den Rechenaufwand auf Kosten der Kompressionsstärke weiter zu reduzieren. MPG2 ist aber keine Option, die Bilder sind einfach zu start verrauscht, als dass die Mutter der DVD damit irgendwas Sinnvolles anfangen könnte.