Mittwoch, 30. Juli 2008

Der Solaris Kerneldebugger: Ein Beispiel

Mein Notebook hat die unangenehme Angewohnheit das es unter Solaris gerne einen NMI produziert (Non Maskable Interrupts sind etwas unangenehme Zeitgenossen die z.b. bei Hardwarefehlern auftreten). Nach ein bisschen schmökern im Sourcecode von Solaris ist mir dann aufgefallen das es dort folgende Varibale im pcie Modul gibt:
uint32_t pcie_serr_disable_flag = 0;    /* Disable SERR */

In einem Kommentar wird erwähnt das bei aktiviertem SERR eventuell ein NMI entsteht (welcher aber nicht behandelt wird). Jetzt wollen wir den Inhalt dieser Variable also auf 1 haben damit SERR deaktiviert wird und wir den NMI los sind. Dazu nehmen wir den Kerneldebugger. Durch einfaches Anhängen von -kd im Kerneleintrag von Grub landet man gleich zu Anfang am Debugprompt. Wir wollen jetzt zu dem Punkt springen an dem unser pcie Modul geladen wird, das erreichen wir indem wir dem Debugger sagen das es an diesem Punkt halten soll.

::bp pcie`_init
::cont

Damit wird ein so genannter Breakpoint gesetzt. Wird dieser erreicht halten wir an und gelangen wieder an den Prompt. ::cont sagt dem Debugger einfach
das das Programm weiterlaufen soll.

Wir erreichen nun unseren Breakpoint. Jetzt können wir den Inhalt unserer Variable einfach mit
pcie_serr_disable_flag/W 1

auf 1 setzen und mit ::cont weiterbooten ohne das der NMI auftaucht.

Praktische Sache oder? ;)

Montag, 28. Juli 2008

Spaß mit DLL-Injection

Heute will ich mich mal mit einer sehr interessanten Debug-Technik befassen: der DLL-Injektion.
Jeder der schon mal in C++ oder ähnlichem gecodet hat kennt sicherlich das Konzept des Überladen von Funktionen. Die Frage ist jetzt: Kann man das ganze auch noch machen wenn ein Programm schon fertig gebacken ist? Otto würde jetzt sagen "Yiiiaaaaaaaaaah ih ih ih ih" *rumhüpf*

Als Beispiel werde ich hier mal etwas fehlerhaften C-Code kompilieren und im Nachhinein die verantwortliche Funktion mit etwas harmlosen überladen.

Hier erst mal unser fehlerhafter code

#include <unistd.h>
#include <stdio.h>

int main()
{
char buffer[256];
vscanf("%s",buffer);
return 0;
}


Das Ganze segelt in einem herrlichen Segfault ab ^^. Ok, jetzt wollen wir einfach mal die Funktion vscanf mit etwas harmlosen "überschreiben". Dazu werden wir eine Dummy-lib schreiben und diese mit LD_PRELOAD dynamisch in unser Programm linken.

Der Code für unser Lib sieht erst mal so aus:


#include <unistd.h>
#include <stdio.h>

int vscanf(const char* format,va_list ap)
{
printf("override\n");
return 0;
}


Voila, wir haben die Zutaten. Jetzt wird es Zeit für das Rezept:


[raichoo@tessaiga ~]$ gcc test.c -o karpott
[raichoo@tessaiga ~]$ ./karpott
test
Segmentation fault: 11 (core dumped)
[raichoo@tessaiga ~]$ gcc -shared -o override.so override.c
[raichoo@tessaiga ~]$ LD_PRELOAD=./override.so ./karpott
override


Guten Appetit!

Mittwoch, 23. Juli 2008

KDE4 unter FreeBSD

Letzte Woche war es soweit: Für all die, denen kompilieren immer zu mühseelig ist, gibt es seit Donnerstag KDE4 Pakete für FreeBSD. Das Ganze dient derzeit noch zum testen, läuft aber bis auf einige Kleinigkeiten ziemlich rund. Die Porter rufen derzeit zur regen Bugjagd auf um KDE4 für FreeBSD fit zu machen.



Vielen Dank an Miwi fürs portieren und die Starthilfe ;)

Dienstag, 8. Juli 2008

Freie Betriebssysteme: Ein Vergleich

Ich habe mich in den letzten Monaten mal etwas mehr mit dem befasst was der Markt an freien Betriebssystemen alles so hergibt. Deswegen habe ich mich hier mit den Alternativen FreeBSD und OpenSolaris befasst. Sicherlich bin ich nicht so weit in die unterschiedlichen Systeme eingetaucht das ich einen wirklich allumfassenden Bericht abliefern könnte aber ich hoffe trotzdem einen kleinen Einblick geben zu können.
Ich werde im folgenden einfach mal einen Vergleich zwischen den 3 Systemen anstellen die ich hier hauptsächlich laufen habe: Kubuntu 8.04.1, FreeBSD 7.0-RELEASE-p2 und OpenSolaris 2008.05 snv_91.

Packaging System


Kubuntu:

Hier kommt das weitverbreitete APT System aus der Debianwelt zum Zuge. Zusammen mit einer fast unerschöpflichen Auswahl an Paketen ist es sicher absolut ungeschlagen wenn es um eine Kollektion freier Software geht. Es ist schnell und leicht in der Anwendung und durch zusätzliche Repos flexibel und erweiterbar. Ein Nachteil den ich persönlich empfinde ist, das das selber packen ziemlich umständlich ist im Vergleich zu anderen Systemen. Es gibt mehrere Skriptverfahren zur Auswahl mit denen man seine Software verschnüren kann und zusätzlich noch Prä- und Postinstallationsskripte welche sich darum kümmern die Software einzurichten.
Fazit: +

FreeBSD:
Hier scheiden sich bei mir die Geister. Sicherlich ist das Ports-System von FreeBSD sehr mächtig und steht mit einer Auswahl von 18.000+ Paketen sicherlich nicht schlechter da als viele andere Systeme, doch ist die Handhabung meiner Meinung nach alles andere als zeitgemäß. Es gibt einen ganzen Berg an Tools für den Umgang mit diesem System und viele davon machen das gleiche... nur anders. Die pkg_* Familie (die jetzt nicht direkt was mit den Ports zu tun hat, sondern dafür zuständig ist vorkompilierte Pakete zu verwalten), dazu portsnap, portmaster, portupgrade, portaudit und vermutlich noch andere die ich vergessen oder noch nie gesehen habe. Es ist allerdings sehr einfach seine Software selbst zu kompilieren und gegebenenfalls auf seine Ansprüche zuzuschneiden. Dennoch:
Fazit: --

OpenSolaris:
Ian Murdock, Vater der Debian Distribution und inzwischen Mitarbeiter von Sun hat für OpenSolaris das IPS System entwickelt. Es ist komplett in Python geschrieben und versucht die Vorteile vieler Packagesysteme zu vereinigen. Besonders interessant ist das IPS vor jedem Update einen Snapshot des Systems anlegt, was dem Benutzer ermöglicht zurückzuspringen wenn z.B. das Update nicht geglückt ist. Auch lässt sich das System "branchen" so das man unterschiedliche Instanzen seines Systems gleichzeitig auf der Festplatte haben kann (alle bootbar). Gespeichert werden lediglich die Unterschiede zueinander und das völlig transparent und performant. All diese Optionen lassen sich mit wenigen einfachen Befehlen steuern. Auch hier gibt es Repos die das System flexibeler machen (auch ist das Aufsetzten eines eigenen Repos kinderleicht). Selbst Pakete bauen ist ebenfalls einfach und bequem realisiert, da sie ähnlich wie die Handhabung eines SVN abläuft.
Fazit:++

Filesystem

Kubuntu:
Ext3. Der Fels in der Brandung und leider auch genauso aktuell. Sicherlich zeichnet es sich durch hervorragende Stabilität aus dennoch sind die immer wiederkommenden Filesystem-Checks bei immer größer werdenden Festplatte einfach nur noch zeitaufwendig und lästig. Ebenso ist das System nach dem Aufsetzen starr und lässt sich nur bei einem vorher aufgesetztem LVM halbwegs elegant erweitern. Derzeit befindet sich ext4 in der Entwicklung, aber auf einen produktiven Einsatz wird man wohl noch lange warten müssen.
Fazit:-

FreeBSD:
Vorteilhaft ist hier das der Filesystemcheck bei UFS2 im Hintergrund abläuft. Das spart Zeit und Nerven (vor allem bei großen Platten welche heutzutage einfach Standard sind). Leider habe ich mich nicht besonders mit dem GEOM System befasst welches ein sehr starkes Konzept zu seinen scheint. Darum kann ich hierzu leider nicht viel sagen.
Fazit:+

OpenSolaris:
The Last Word in Filesystems. Damit preist Sun sein Filesystem ZFS an. Nicht ganz zu unrecht. Scheint es doch nichts zu geben was ZFS nicht bewerkstelligen kann: Softwareraids, Mirroring, Striping, dynamisch wachsenden Partitionen, Snapshots, Clones, inkrementelle Backups die sich über SSH verschicken lassen, transparente Kompression und sogar Selbstheilung. ZFS ist wie viele sagen eine eierlegende Wollmilchsau. Jetzt mag man glauben das sich ein solches Filesystem kaum handhaben lässt und ungemein kompliziert ist. In Wirklichkeit lassen sich alle diese Funktionen mit nur 2 einfachen Befehlen steuern ohne dabei irgendetwas von ihrer Mächtigkeit zu verlieren. Alles in allem: Ein hochmodernes einfach handzuhabendes Filesystem welches einem völlig neue Möglichkeiten eröffnet.
Fazit: ++

Kernel und Userland

Kubuntu:

Hier wird wie die meisten sicher wissen der weit verbreitete Linuxkernel verwendet. Er verfügt über eine große Anzahl an Treibern und ist relativ stabil. Als Userland wird das GNU-Userland verwendet welches vom Linuxkernel eigentlich unabhängig ist. Dies führt dazu das sich beides hin und wieder nicht im Einklang befindet, sprich das neue Features des Kernels sich nicht unbedingt auf das Userland auswirken. Auf großen Systemen wird allerdings immer wieder bemängelt das der Linux Kernel schlecht skaliert (ab 4 oder 8 CPUs geht die Performance bergab) Dies kann ich selber nicht bestätigen sondern muss mich hier auf das Wort von Experten verlassen.
Fazit: +

FreeBSD:

Wie bei allen anderen BSDs auch kommt hier alles aus einem Guss. Userland sowie Kernel werden zusammen entwickelt und dementsprechend lässt sich das System erstklassig darüber bedienen. Im Gegensatz zum Linuxkernel handelt es sich beim FreeBSD Kernel um einen echten Nachkommen von BSD Unix. Derzeit werden viele neue Fähigkeiten die ihren Ursprung in Solaris in den FreeBSD Kernel integriert wie z.b. ZFS und dtrace (beides ist unter Linux derzeit aus Lizenzgründen nicht möglich). Das System soll sich durch extreme Stabilität auszeichnen. Dennoch habe ich es geschafft durch vermutlich etwas dämlichen Einsatz zum UnionFS das System zu einer Panic zu bringen. Auch skaliert das System durch den neuen ULE Scheduler (welcher auch in den nächsten Mac OS X Kernel aufgenommen werden soll) sehr gut.
Wie Linux auch verfügt FreeBSD über eine Vielzahl von Treibern und auch NVidia liefern einen Treiber für ihre Grafikkarten (allerdings nur als 32-Bit Version) aus.
Fazit:++

OpenSolaris:
Auch hier ist alles aus einem Guss und durch dtraceprobes lässt sich dem System so ziemlich alles an Informationen entlocken die man zum administrieren und entwickeln so braucht oder immer schon mal haben wollte. Da das Geschäft von Sun große Rechner sind, verwundert es nicht das Solaris extrem gut skaliert und auch noch auf Systemen mit vielen CPUs (angeblich bis zu 64 Stück) ohne Performanceverlust arbeitet. Solaris verfügt über eine Vielzahl einzigartiger und mächtiger Tools und Features (ZFS, dtrace, SMF, Zones etc) welche sowohl auf dem Desktop als auch auf dem Server neue und spannende Anwendungen eröffnen. Um Treiber ist es im Moment etwas schlecht bestellt, dennoch werden alle paar Wochen neue Treiber zum System hinzugefügt. Auch hier bieten NVidia Treiber für ihre Grafikkarten an. Solaris stammt ebenfalls von BSD ab und ist somit ein echtes Unix.
Fazit:++

Oberfläche

Kubuntu:
Wird standardmäßig mit KDE ausgeliefert, ebenso existiert eine KDE4 Version welche
jedoch eher für Entwickler und nicht für den Endanwender gedacht ist.
Fazit:++

FreeBSD:
Kommt ohne installierte GUI und läßt sich somit frei einrichten. Derzeit wird noch an einer Portierung von KDE4 gearbeitet die nach Aussage von Martin Wilke inzwischen kompiliert und läuft.
Fazit:+

OpenSolaris:
Ist derzeit nur mit Gnome erhältlich, dennoch wird auch hier KDE4 portiert. Experimentelle Tarballs sind bereits unter www.bionicmutton.org/solaris/ erhältlich. Ab der kommenden Version von OpenSolaris soll es möglich sein auf die Installation einer GUI zu verzichten.
Fazit:+

Dokumentation

Linux:
Eine wirklich gute Anlaufstelle für Dokumentation gibt es für Linux leider nirgends. Es gibt zwar viele Wikis von denen sehr viele veraltet sind. Oft muss man sich passende Howtos per Google raussuchen welche auch selten über Grundwissen hinausgehen. Auch macht es einem die Menge an unterschiedlichen Distributionen welche Probleme oft sehr unterschiedlich behandeln alles andere als leicht.
Fazit:--

FreeBSD:
FreeBSD bietet auf seiner Seite ein umfangreiches Handbuch an welches so ziemlich jedes Thema abdeckt auf das man beim benutzen und administrieren seines Systems stoßen kann. Alles ist umfassend erklärt und in unterschiedlichen Sprachen erhältlich.
Fazit:+

OpenSolaris:
Besonders angetan hat er mir der Dokumentationsserver von Sun. docs.sun.com bietet so ziemlich die ausführlichste Datenbank an Informationen die man zu einem System erhalten kann. Alles als PDF herunterladbar, sowie in mehreren Sprachen verfügbar. Alles auf dem neusten Stand versteht sich. Absolut vorbildlich!
Fazit:++

Wenn es um Paketvielfalt und Einfachheit geht, hat hier Kubuntu ganz klar das Rennen gemacht. Dennoch halte ich OpenSolaris für einen extrem vielversprechenden Kandidaten (vor allem da das System in dieser Form erst seit 3 Monaten erhältlich ist). Mit mehr Paketen würde es sich hier definitiv um eine ernstzunehmende Alternative handeln. FreeBSD taugt für mich leider gar nicht für den Desktop (Ok, der Vergleich ist schon etwas unfair da es eher für Server gedacht ist ;). PC-BSD soll hier allerdings Abhilfe schaffen.

Das war ein kleiner Einblick in das von mir Erlebte zu den unterschiedlichen Systemen. Sicherlich wird das ein oder andere Urteil etwas sehr subjektiv ausgefallen sein, aber naja. Ich hoffe es war trotzdem aufschlussreich :).

Informationen zu den unterschiedlichen Systemen wie z.B. ausgewählte Artikel findet man übrigens auch bei Distrowatch.