Geocaching

Geocaching ist die lang erwartete Anwendung für GPS-Geräte in Privatanwenderhand. Dabei läuft man in der Natur herum und sucht versteckte Tupperdosen oder Filmdosen, für die nur die GPS-Koordinaten bekannt sind. Hier ist der Link zu meinem Profil:
Profile for christian_bay

Zum Cachen habe ich mein Medion-Navi MDPNA 200 freigeschaltet und nutze unter Windows CE Glopus mit OpenStreetMap-Karten zum Cachen.

Core4400

Hardware-mäßig kein Exot, dafür aber Software-mäßig. Core2Duo 8400, 4 GB Crucial Ballistix RAM und eine Asus ATI Radeon 1950 Pro. Bei diesem System war mir die Lautstärke wichtig, ein flüsterleises und kühles System mit Bequiet-Netzteil für die Lüftersteuerung. Die Graka hat eine gigantische Heatpipe-Konstruktion und ist nicht hörbar. Der Skythe Samurai kühlt den Prozessor auf 40 Grad bei Vollast und ebenfalls flüsterleise. Am längsten hat die Auswahl des Mainboards gedauert, am Ende ist es dann ein Gigabyte GA P35C-DS3R geworden.Aber die Software!! Naja. Kein LFS mehr, ich habe mittlerweile Gentoo für mich entdeckt. Ein erstaunliches Build-System, wirklich. Hat mich überzeugt. Das macht doch tatsächlich genau, was ich will.. Das erste System überhaupt! Und wenn nicht dann kann man immernoch im gut dokumentierten Innereien herumsägen un basteln. Wirklich toll.

Die Besonderheit hierbei ist das Boot-Setup. Linux ist in einem Linux-Software-RAID 5 installiert, über insgesamt 3 SATA-Platten. Meine Daten-Laufwerke sollen auch unter Windows verfügbar sein und sind daher mit NTFS formatiert. Jedoch wollte ich auch hier nicht auf eine gewisse Datensicherheit verzichten, daher sind die beiden Datenpartitionen mit dem Windows-eigenen Software-RAID gespiegelt. Problem dabei ist, dass diese Windows-RAID-Laufwerke nur funktionieren, wenn sie auf einer Platte mit LDM angelegt werden können (dynamischer Datenträger unter Windows). Dummerweise liegen auch die beiden Partitionen des Linux-RAID5-Arrays auf den LDM-Platten. Diese Partitionstabelle erkennt der Autoassembler für die Linux-RAIDs beim Booten aber nicht. Dazu muss eine Initial-Ramdisk angelegt werden, die das Array zusammenbastelt. Eine Beispielramdisk gibts hier (initramfs.tar). Das entsprechende Initscript /sbin/init sieht folgendermaßen aus:

#!/bin/sh
export PATH=/bin:/sbin
umask 0077
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t tmpfs tmpfs /dev
busybox –install -s
mdev -s
echo /sbin/mdev > /proc/sys/kernel/hotplug
mknod /dev/md0 b 9 0
ln -s /dev/console /dev/tty
mdadm –assemble /dev/md0 /dev/sda11 /dev/sdb3 /dev/sdc3
mount /dev/md0 /new-root
echo > /proc/sys/kernel/hotplug
umount -l /proc /sys /dev
exec switch_root /new-root /sbin/init
exec /bin/sh

Unter Linux sind die LDM-Laufwerke nach folgendem Eintrag in /etc/mdadm.conf verfügbar:

DEVICE /dev/sdb1 /dev/sdc1
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=867e99c4:e8616584:39ad41ad:XXXXXX
DEVICE /dev/sdb2 /dev/sdc2
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=81183f55:72559ad3:3f16c699:XXXXXX

Mit folgendem Script kann man das ganze dann scharf schalten:

mdadm –assemble /dev/md1 /dev/sdb1
mdadm –run /dev/md1
mdadm –add /dev/md1 /dev/sdc1
mdadm –assemble /dev/md2 /dev/sdb2
mdadm –run /dev/md2
mdadm –add /dev/md2 /dev/sdc2

Danach wird das Array neu synchronisiert, das dauert ne Weile, aber es kann schon gemountet werden.

Powerbook Lombard

… mit 400 MHz G3 und 256 MB RAM. Hier läuft Gentoo Linux mit Unterstützung für (fast) alle Hardware. Sogar XV-Ausgabe und die recht beschränkten DRI-Fähigkeiten des Mach64 werden unterstützt – leider aber mit starken Farbfehlern. Liegt warhscheinlich an der Kombination alter X-Server und komisches Kernel-Modul für zu neuen Kernel. Nun ja. Xorg nochmal neu bauen, dann gehts vielleicht. Aber das wird wohl eher auf Gentoo hinauslaufen. Denn mittleiweile habe ich nicht mehr die Zeit, überhaupt ein LFS auf auktuellem Stand zu halten. Geschweige denn 4 oder 5.
Was nicht geht ist die Hardware-Beschleunigung für MPEG-Decodierung. Denn in diesem Powerbook ist eine DXR3-Hollywood-änhliche PCI-Karte eingebaut(!). Leider gibt es bis jetzt keinen Treiber dafür, nur einen Stub.

Motorola Powerstack

PC-Harware, aber PowerPC-Prozessor, 300 MHz PowerPC 604e. Leider habe ich nie ein PowerPC-Grafik-BIOS auf meine Matrox Millenium oder meine verschiedenen ATI-Karten bekommen. Damit würde nämlich auch der X-Server halbwegs erträglich sein auf der Kiste, im Gegensatz zur originalen Trident-Karte. Die hat einfach zu wenig RAM zum arbeiten und ist zu langsam zum Filme gucken. Ich habe auch mit einer Voodoo2-Karte herumprobiert, aber der framebuffer dafür hat nicht so richtig funktioniert. Schade, denn Soundkarte und Netzwerk waren bereits integriert, und der SCSI-Controller war schon recht schnell für damalige Verhältnisse und sogar der IDE-Chip wurde erkannt und unterstützt. Nur war auf dem Board keine Pfostenleiste aufgelötet. Und für alle, die es probieren wollen: Offensichtlich sind die Dinger auch nicht verdrahtet. Selbst wenn man eine auflötet, erkennt der Kernel kein IDE-Gerät…
Hier habe ich ein bisschen gecheatet, ich habe – hoho! – das fertige LFS auf die Powerstack gebügelt. Allerdings habe ich den X-Server mit allen möglichen patches mehrmals neukompiliert, aber ohne ein PPC-BIOS auf einer PPC-Kiste kein X…

Powerbook 1400

… mit prähistorischem Nubus, 48 MB RAM und übertaktetem Prozessor mit schlagmichtot-160 MHz? Ich muss nochmal nachschauen…Eigentlich hatte sich ein Kumpel von mir diese Kiste ersteigert. Jedoch scheiterte sein Vorhaben FreeBSD zu installieren an der fehlenden Nubus-Unterstützung. Und der Linux Nubus-Port kam gerade erst ins Rollen. Nach einigem Basteln mit dem Debian-Boot-Kernel, den obige Webseite zur Verfügung stellt, kann man sogar Debian installieren. Dann haben ich das damals topaktuelle LFS 5.0-Buch genommen und ein komplettes System mit X-Server aufgesetzt. Der hat sogar nach einigen Einstellereien funktioniert. Aber leider war damit erstmal Ende der Show. XFCE konnte man guten Gewissens laufen lassen, aber viel mehr auch nicht. Dann hat aber ein findiger Kerl einen Treiber für den TREX PCMCIA-Controller geschrieben – und plötzlich hatte ich Netzwerk auf der Kiste! Es funktionieren eine 3com-Karte von Pollin (Lötarbeit!), eine SMC-Karte und eine Orinocco-WLAN-Karte. Eine Prism54-Karte und eine Atheros-Karte gingen glaube ich auch. Es geht nicht: Sound, CD-ROM, Irda. Das /etc-Verzeichnis der Kiste liefere ich noch nach.

XT-Notebook mit NEC V20 Prozessor – einem Intel 8088-Klon

Das ELKS-Projekt hat ein Linux für 16-Bit Hardware wie etwa diesen Prozessor geschrieben, nur konnten sie ELKS nie mit einem NEC V20 testen, weil sie einfach keinen hatten. Nun ja, man kann sagen, dass sie gute Arbeit geleistet haben…
Aus dem letzten Satz kann man unschwer erkennen, dass ich gerne merkwürdige Hardware mit der Installation von Linux quäle. Bei letzterem Notebook war das nicht schwer – man muss nur ein Floppy-Image herunterladen und auf eine 720KB-Diskette packen und ca. 20 min warten. Dann hat man eine funktionierende Konsole…Bei den anderen Rechnern gestaltete sich die Sache nicht ganz so einfach – zumindest wenn man nicht nur einfach Debian installieren will. Zugegeben – ich wollte es mir nicht einfach machen. Aber nach meiner ersten LFS Installation habe ich Blut geleckt und diese wunderbar individualistische Spielart von Linux auf ein paar meiner Exoten gebannt.

und andere Kisten…

  • Sun SparcStation 5 Pizzabox. Leider ganz unbefleckt. SunOS whatever drauf. Leider bietet die Pizzaschachtel nur Platz für SCA-SCSI-Platten mit normaler Bauhöhe. Ich hatte aber nur eine SCA-Platte mit voller Bauhöhe… Naja, später mal. Vielleicht.
  • ein kühlschrankgroßer Alpha-Server mit Slots für 4 Prozessoren, leider nur mit einem bestückt.Auf dieser Kiste läuft ausnahmsweise kein LFS, sondern Debian. Aber für eine alkoholisierte Nacht-Session mit zwei Kumpels war das eine Nummer zu groß 😉
  • AerionInput aka spacenav_win32

    Die Bauhaus-Universität Weimar hat ein sehr interessantes neues Eingabegerät erdacht, das die Navigation in 3D-Welten verbessern soll – den Axsotic oder aka GlobeFish aka Aerion. Dieses Eingabegerät stellt wie bisherige Geräte die Translation elastisch zur Verfügung, die Rotation jedoch wird intuitiv direkt gemappt und die Drehung der Kugel wird nicht wie sonst üblich über eine elastische Bewegung errechnet. Damit können Rotation und Translation vom Benutzer einfacher getrennt voneinander eingegeben werden.

    Bisher wurde der Axsotic mit speziellen Avango-Plugins angesteuert, die leider nur in Avango funtionierten und daher nur für Demonstrationszwecke einsetzbar waren. Ich habe im Rahmen meiner Studienarbeit daher versucht, einen “Treiber” zu erstellen, der die Übermittlung der Daten zwischen Axsotic und Anwendung übernimmt. Das Ergebnis ist ein Windows-Framework, mit dem man nicht nur den Axsotic ansprechen kann, sondern auch die 3D-Eingabegeräte von 3DConnexion. Da ich ohnehin vorhatte, das Projekt unter die GPL zu stellen, und ich durch Zufall auf das Free Spacenav Projekt gestoßen bin, was über keinen Windows-Port verfügte, wurde nun AerionInput zu spacenav_win32. Damit steht nun auch unter Windows ein freier Treiber für die 3DConnexion-Hardware zum Download bereit. Leider im Moment nur in einer “unfreien” Sprache, es wird .NET 2.0 benötigt.

    JAAS LoginModule for Linux Authentication

    I was looking for a possibility to use the Linux passwd database authentication in Java in order to authenticate a user with a password against the local linux passwd database. Soon I realized that this is not possible out-of-the-box because there is no LoginModule for that. The project http://sourceforge.net/projects/jaas-pam/ seemed exactly the right thing for that but unfortunately it is outdated and lets Sun JRE 1.6 and IBM JRE 1.5 segfault. No matter if using the supplied binary lib or with a recompiled one, no avail.

    So I implemented my own one, a JAAS LoginModule that authenticates against a local SSH Server using the sshj project. It opens up a connection to your local SSH server which must be running on the machine you want to authenticate against. Then it tries to log in the supplied user. If it succeeds the supplied username password pair is vaild on the server. You need the sshj library, mavens artifact is net.schmitzz.sshj.

    import java.io.IOException;
    import java.util.Map;
    
    import javax.security.auth.Subject;
    import javax.security.auth.callback.Callback;
    import javax.security.auth.callback.CallbackHandler;
    import javax.security.auth.callback.NameCallback;
    import javax.security.auth.callback.PasswordCallback;
    import javax.security.auth.callback.UnsupportedCallbackException;
    import javax.security.auth.login.LoginException;
    import javax.security.auth.spi.LoginModule;
    
    import net.schmizz.sshj.SSHClient;
    
    public class SshLoginModule implements LoginModule {
    	private CallbackHandler handler;
    	private Subject subject;
    	private String username;
    
    	/**
    	 * @see javax.security.auth.spi.LoginModule#abort()
    	 */
    	@Override
    	public boolean abort() throws LoginException {
    		return false;
    	}
    
    	/**
    	 * @see javax.security.auth.spi.LoginModule#commit()
    	 */
    	@Override
    	public boolean commit() throws LoginException {
    		try {
    			final DummyUserPrincipal user = new DummyUserPrincipal(
    					username);
    			final DummyRolePrincipal role = new DummyRolePrincipal(
    					"admin");
    
    			subject.getPrincipals().add(user);
    			subject.getPrincipals().add(role);
    			return true;
    
    		} catch (final Exception e) {
    			throw new LoginException(e.getMessage());
    		}
    	}
    
    	/**
    	 * @see javax.security.auth.spi.LoginModule#initialize(javax.security.auth.Subject,
    	 *      javax.security.auth.callback.CallbackHandler, java.util.Map,
    	 *      java.util.Map)
    	 */
    	@Override
    	public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) {
    
    		handler = callbackHandler;
    		this.subject = subject;
    	}
    
    	/**
    	 * @see javax.security.auth.spi.LoginModule#login()
    	 */
    	@Override
    	public boolean login() throws LoginException {
    		final Callback[] callbacks = new Callback[2];
    		callbacks[0] = new NameCallback("username");
    		callbacks[1] = new PasswordCallback("password", true);
    
    		final SSHClient sshClient = new SSHClient();
    		final String fingerprint = "33:**:**:**:..."; //15 hex digit fingerprint of your server.
    		final String hostname = "localhost";
    
    		try {
    			handler.handle(callbacks);
    			final String name = ((NameCallback) callbacks[0])
    					.getName();
    			final String password = String
    					.valueOf(((PasswordCallback) callbacks[1])
    							.getPassword());
    
    			sshClient.addHostKeyVerifier(hostname, 22, fingerprint);
    			sshClient.connect(hostname, 22);
    			sshClient.authPassword(name, password);
    
    			if (!sshClient.isAuthenticated()) {
    				throw new LoginException(
    						"Authentication failed for unknown reason.");
    			}
    			username = name;
    			return true;
    
    		} catch (final IOException e) {
    			throw new LoginException("Authentication failed: "
    					+ e.getMessage());
    		} catch (final UnsupportedCallbackException e) {
    			throw new LoginException("Authentication failed: "
    					+ e.getMessage());
    		} finally {
    			try {
    				sshClient.disconnect();
    			} catch (final IOException e) {
    				throw new LoginException("Authentication failed: "
    						+ e.getMessage());
    			}
    		}
    	}
    
    	/**
    	 * @see javax.security.auth.spi.LoginModule#logout()
    	 */
    	@Override
    	public boolean logout() throws LoginException {
    		try {
    			final DummyUserPrincipal user = new DummyUserPrincipal(
    					username);
    			final DummyRolePrincipal role = new DummyRolePrincipal(
    					"admin");
    			subject.getPrincipals().remove(user);
    			subject.getPrincipals().remove(role);
    			return true;
    		} catch (final Exception e) {
    			throw new LoginException(e.getMessage());
    		}
    	}
    }