Tipps zur Forensik nach Durcheinander auf Plattenbereichen

Dann und wann geschieht es: der lvm verliert seine Konfiguration oder durch andere traurige Umstände hat man lediglich noch einen Haufen „extents“ bekannter Länge vorliegen, die einmal eine Platte waren.
Dem Autor passierte dies beim versehentlichen Löschen einer falschen virtual Disk im IBM SVC („SAN Volume Controller“).
Bekannt war hier noch, dass ein Solaris UFS mit knapp 1TB Grösse verloren gegangen war.
Schaut man sich dann in Ruhe ein paar Grundlagen zu UFS-Datenstrukturen auf disk an, etwa in
http://www.informit.com/articles/article.aspx?p=605371&seqNum=2, und besorgt sich einige „magic“ Konstanten aus den guten alten .h-files in einem alten Solaris, kann man sich ein kleines C-Programm wie dieses

findb.c:
 #define _LARGEFILE64_SOURCE
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>

/*
#define FS_MAGIC 0x011954
#define CG_MAGIC 0x090255
*/

#define FS_MAGIC 0x54190100
#define FSMOFF 343
#define CG_MAGIC 0x55020900

#define NEXT 2113
#define ESIZE 512*1024*1024
static char edata[ESIZE];
#define HEADL 32768*2048
#define SBDIST 6495
#define SBONE 2

long *edata32;

main()
{
long rb;
int fd;
unsigned int extno,boff,isbi,x,cgno;
off64_t offs, offo;
 extno=0;
 edata32=&edata;
 fd=open("/dev/sdb",O_RDONLY);
 if (fd<0) { printf("open errorn"); exit(99); }

 while(extno < NEXT) {
 printf("reading extent number %dn",extno);
 rb=read(fd,edata,ESIZE);
 if(rb != ESIZE) { printf("short readn"); exit(98); }
/*  rb=read(fd,edata,HEADL);
 if(rb != HEADL) { printf("short readn"); exit(98); }
 offs=ESIZE-HEADL;
 offo=lseek64(fd,offs,SEEK_CUR);
 if(offo == (off64_t) -1 ) {printf("seek errorn"); exit(97);} */
/*  printf(" sb %08x cg %08x n",edata32[2050],edata32[4097]); */
 boff=0;
 while((boff*4) <ESIZE) {
/*  while((boff*4) <HEADL) { */
/*  if(edata32[343+boff]==FS_MAGIC) { printf("fs magic found, ext=%d off=%d sblkno= %08xn ",extno,boff/2048,edata32[2+boff]); */
/*  isb=SBONE;
 while(isb < NEXT*65536) {
 if((isb & 0x0ffff) == boff/2048) break;
 isb=isb+SBDIST;
 }
 printf("isb=%d, ext=%dn",isb,isb/65536);
 } */
 if(edata32[1+boff]==CG_MAGIC) {
 x=edata32[3+boff];
 cgno= (x>>24) |
 ((x<<8) & 0x00FF0000) |
 ((x>>8) & 0x0000FF00) |
 (x<<24);
 printf("CG_MAGIC match, ext=%d off=%d cgx=%d time=%08x cyls=%dn",extno,boff/2048,cgno,edata32[2+boff],edata32[4+boff]>>24); }
 boff=boff+2048;
 }
 extno=extno+1;
 }
}

schreiben, was in der hier wiedergegebenen Form für alle Cylindergroup-Strukturen den Wert deren offset „cgx“ ausgibt, eben den laufenden index der jeweiligen cyclindergroup Struktur. Beachte die Zweckmässigkeit des Programms (nur ganz notwendige Fehlerabfragen) und die Tricks, um Solaris/Sparc Zahlen (BigEndian) in Linux/X86 Zahlen (LittleEndian) umzurechnen (Konstanten wurden per Hand konvertiert).

Durch Sortieren der extents (bekannter Grösse) kann man so mit etwas Glück die originale Reihenfolge der extents rekonstruieren. Dabei hat dieses script gute Dienste geleistet:

fsbchain.sh:
#!/bin/sh -vx
SBONE=0
SB=$SBONE

sbf=xfb64ec.out

while true ; do
l1=`grep "cgx=$SB$" $sbf`
if [ $? -ne 0 ]; then
echo end of chain
exit
fi
echo $l1
set - $l1
SBEXT=$1
echo `echo $SBEXT | cut -d = -f 2`>>extlist
ln=`grep "$SBEXT " $sbf | tail -1`
echo $ln
SBL=`echo $ln | cut -d = -f 3`
SB=`expr $SBL + 1`
echo $SB
#read
done

Mit ein paar weiteren shell scripten, die sicherstellen, dass nur valide CG-Blocks gezählt werden (deswegen werden Grösse und Datum mit ausgegeben) und einem anderen kleinen Hilfsprogramm

copyb.c:
#define _LARGEFILE64_SOURCE
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <limits.h>

#define ESIZE 512*1024*1024
static char edata[ESIZE];

main(argc,argv)
int argc;
char *argv[];
{
long rb;
int infd, outfd;
unsigned int extno,boff,isbi,x,cgno;
off64_t ioffs, ooffs, offo;
int ein,eout;

 ein=atoi(argv[1]);
 eout=atoi(argv[2]);
 printf("copying extent %d to extent %dn",ein,eout);

 infd=open("/dev/sdb",O_RDONLY);
 if (infd<0) { printf("input open errorn"); exit(99); }
 outfd=open("/dev/sdc",O_RDWR);
 if (outfd<0) { printf("output open errorn"); exit(99); }

 ioffs=(off64_t) ein * ESIZE;
 ooffs=(off64_t) eout * ESIZE;
 printf("input seek to %llu output seek to %llun",ioffs,ooffs);
 offo=lseek64(infd,ioffs,SEEK_SET);
 if(offo < 0 ) {printf("input seek errorn"); exit(97);}
 offo=lseek64(outfd,ooffs,SEEK_SET);
 if(offo < 0 ) {printf("output seek errorn"); exit(97);}
 rb=read(infd,edata,ESIZE);
 if(rb != ESIZE) { printf("short readn"); exit(98); }
 rb=write(outfd,edata,ESIZE);
 if(rb != ESIZE) { printf("short writen"); exit(98); }

}

zum effektiven Zusammensetzen des disk /dev/sdc aus den Daten der /dev/sdb nach einer eingelesenen Steuerdatei der Form

[root@nisad-pc03 ~]# head -10 extlist
12
307
21
407
268
304
305
19
314
357
[root@nisad-pc03 ~]#

Ob ähnliches Vorgehen bei ext2/ext3 Filesystemen gelingen würde dort gibt es sogenannte block groups, die wohl den cylinder groups im ufs entsprechen, mit  s_block_group_nr (block group # of this superblock) wird sich bei Gelegenheit zeigen (müssen).

Automounter streikt nach Kernelupdate

Der kleine Quickie zum Wochenende: Nach dem Update meines Ubuntus auf 10.04 (Lucid Lynx) und dem damit verbundenen Kernelupdate auf 2.6.32 wollte plötzlich der Automounter, auch bekannt als amd oder am-utils, nicht mehr korrekt arbeiten. Die Fehlermeldung im Logfile sprach:

mount: No locks available

Des Rätsels Lösung für alle, die ebenfalls darüber stolpern: In der Datei /etc/am-utils/amd.conf die Option mount_type auf „autofs“ (bislang stand dort vermutlich „nfs“) setzen. Wer sich für die schmutzigen Details und die dazu passende Diskussion interessiert, dem sei dieser Bugreport ans Herz gelegt:

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=479884

Erstellen von Schritt-für-Schritt Anleitungen mit der Windows 7 Problemaufzeichung

Wer ab und zu oder gar regelmäßig Software-Dokumentationen schreibt, weiß um die lästige Arbeit zur Erstellung von Screenshots. Erleichtern kann man sich die Erstellung der Screenshots mit Hilfe der Problemaufzeichnung, die in Windows 7 bereits enthalten ist. Nach der Eingabe von „psr“ in das Suchfeld des Startmenüs oder in die Ausführen-Dialogbox öffnet sich die Problemaufzeichnung. Mausklicks, Tastatureingaben etc. werden in Form von Screenshots aufgezeichnet und können zusätzlich noch mit Markierungen und Kommentaren versehen werden. Nach Abschluss der Aufzeichnung werden alle Informationen und natürlich die Screenshots als Zip-Archiv in einem frei wählbaren Verzeichnis gespeichert. Darin liegen die Bilder und weitere Informationen später als .mht Dateien, die mit dem Internetexplorer oder Opera angesehen werden können.

Webseiten und Webanwendungen als Icon auf dem Startbildschirm des iPhone / iPod touch

Wie man Webseiten mit dem iPhone / iPod touch auf dem Home-Bildschirm ablegt.

eingebundene Webanwendungen

Eine nützliche App ist sicherlich Wikipedia. Doch deutsche Benutzer beklagen natürlich sofort: „Ist ja alles auf Englisch!“ Eine deutsche Anwendung, bzw. eine lokalisierte Version gibt es nicht. Braucht man ja auch nicht. Wozu eine App installieren, wenn man die Webanwendung direkt in den Startbildschirm einbinden kann.

Man kann beliebige Webseiten und Webanwendungen als Icon auf den Startbildschirm legen. Dazu besucht man im Safari einfach die jeweilige Webseite. Nach Drücken auf das +-Symbol erscheinen drei Auswahlbuttons.  Mit „Zum Home-Bildschirm“ wird diese Webseite als Icon abgelegt.

Mit dieser Funktion kann man häufig genutzte Webseiten noch schneller öffnen und erhält Funktionen, die durch Apps nicht abgedeckt sind. Im Beispielbild sieht man die Webseiten des Kölner Studentenwerks, Wikipedia und Wiktionary als Symbol abgelegt auf dem Home-Bildschirm.

Emacs schön hässlich machen

Ich mag Emacs. Mit vi konnte ich hingegen noch nie etwas anfangen, aber lassen wir das, sonst ziehe ich den Unmut der Kollegen auf mich. Zurück zum Emacs. Ich mag Emacs im Textmode, da er so gerade bei SSH-Verbindungen trotz seines Umfangs schnell genug ist. Zeitweise habe ich sogar den deutlich abgespeckten Ableger zile („zile is lossy emacs“) verwendet, bei dem ich dann aber doch die eine oder andere Funktion vermisste. Auf einigen Systemen gibt es für den Textmode den speziellen Aufruf „emacs-nox“, allgemeingültig ist jedoch „emacs -nw“.

Nun wird auch der Emacs fortlaufend weiterentwickelt und erhält neue Features, zudem ist er vollgepackt mit diversen Modi und Zusatzmodulen, die ich persönlich nie benötige. Wer wie ich den Emacs einfach nur als Texteditor schätzt (und kein OS im OS braucht), der sucht in den Tiefen des Netzes vielleicht nach Konfigurationsoptionen, um den Emacs einfach, schnell und herrlich hässlich zu machen. Die wichtigsten dieser Optionen möchte ich kurz benennen, um die Suche für den einen oder anderen etwas abzukürzen.

  • Farben ausschalten: Natürlich nutze ich Emacs auch für die Erstellung und Bearbeitung von Python- oder Perlskripten sowie für HTML-Dateien. Trotzdem möchte ich auf keinen Fall Syntax-Highlighting oder ähnliche Auswüchse einer „echten“ IDE haben, da geht mir in der Regel jede Form von Übersicht eher verloren. Die Einstellung, um generell Farben auszuschalten, lautet:
    (setq-default global-font-lock-mode nil)
  • Backups ausschalten: Für mich ein Riesenärgernis sind die automatisch angelegten Backupfiles mit der Endung „~“. Regelmäßig schlagen hier unsere Intrusion Detection Systems an und zudem macht es Verzeichnisse unnötigerweise unübersichtlicher. Backups mache ich auf andere Art und Weise. Daher die Abschaltung dieser furchtbaren Backupfiles:
    (setq kept-old-versions 0)
    (setq kept-new-versions 0)
    (setq make-backup-files nil)
  • Klammerpaare nicht anzeigen: Eine relativ neue Funktion vom Emacs zeigt den jeweiligen öffnenden oder schließenden Partner einer Klammer an, sobald der Cursor auf der Klammer verweilt. Ergebnis: Der Cursor hüpft fröhlich herum und man weiß gerade bei vielen Klammern (ich sage nur Perlskripte) gar nicht mehr, wo man gerade ist. Daher weg damit:
    (show-paren-mode 0)
  • Fundamentaler Modus: Nach dem letzten Emacs-Update landete ich plötzlich bei jeder HTML-Datei im „HTML-Fill“-Modus, der fröhlich und ungefragt lauter Zeilenumbrüche da einfügte, wo ich gar keine haben wollte. Daher wollte ich einstellen, dass Emacs grundsätzlich alle Dateien im reinen Text- bzw. Fundamental-Mode öffnet. Diese Anforderung erwies sich als ganz harte Nuss, aber schlussendlich verdanke ich Ralf Döring den entscheidenden Tipp (an dieser Stelle nochmal ein Dank dafür):
    (setq major-mode ‚text-mode)

    (setq auto-mode-alist (cons ‚() nil))

Nun ist mein Emacs wieder genauso, wie ich ihn gern habe. Weitere Vorschläge für Optionen, die Emacs in dieser Richtung für uns „Puristen“ optimiert, nehme ich gerne auf.

SFTP mag das AFS nicht

Die Betreuerin eines unserer Webprojekte meldete uns, dass sie mittels ihres SFTP-Programms – Cyberduck unter MacOS – innerhalb unseres Dateisystems AFS keine Dateien in einen Unterordner verschieben kann. Eine Überprüfung unsererseits ergab, dass das Problem nicht auf Cyberduck oder MacOS beschränkt ist, auch mit WinSCP (im SFTP-Modus) unter Windows erhält man lediglich die nichtssagende Meldung „Failure“.

Intern verwendet das SFTP-Protokoll zum Verschieben von Dateien das Kommando „rename“. Offenbar geschieht beim Verschieben in ein Unterverzeichnis Folgendes: SFTP legt im Unterordner einen Hardlink auf die Datei an und entfernt anschließend den alten Verweis im übergeordneten Verzeichnis (link-unlink). Dies ist im Hinblick auf plötzliche Stromausfälle etc. die sichere Variante. Da das AFS allerdings seine ACLs pro Verzeichnis speichert, erlaubt es keine Hardlinks – SFTP scheitert entsprechend. Seit der Version 5.1 von OpenSSH (der Software, die auch für den SFTP-Server zuständig ist) führt SFTP hier einen Fallback auf den internen syscall „rename“ durch, der vermutlich (!) ein unlink-link durchführt, siehe:

https://bugzilla.mindrot.org/show_bug.cgi?id=1447

Leider steht diese Version auf unseren Red-Hat-5-Servern noch nicht zur Verfügung, einen Case bei Red Hat haben wir zu diesem Thema aber eröffnet. Einige Clients umgehen das Problem selbständig, z.B.:

  • WinSCP führt einen Fallback auf SCP durch
  • SSH SecureShell kopiert die Datei stattdessen – das kann bei größeren Dateien Speicherplatzprobleme verursachen und ist entsprechend langsamer

Generelle Workarounds lauten wie folgt:

  • Arbeiten auf der Unix-Kommandozeile nach SSH-Login mit dem Kommando „mv“
  • Lokale Installation eines AFS-Clients, siehe http://www.uni-koeln.de/rrzk/daten/afs/#clients
  • Dateien herunterladen und im neuen Verzeichnis wieder hochladen (dauert ggf. sehr lange und setzt eine schnelle Verbindung voraus)

Für die Hilfe bei der Aufklärung ein Dank an Sebastian Hagedorn und Claus Kalle.

Das Problem mit der digitalen Ausleihe – E-Books in wenigen Arbeitsschritten herunterladen

Um digitale Bücher schnell auszuleihen benötigt man Hilfsmittel, die automatisch die einzelnen Kapitel herunterladen um dann die einzelnen Dokumente zu einem einzigen PDF zusammenzufügen.

E-Books sind der Traum eines Bibliotheksnutzers. Einmal heruntergeladen kann das Buch sofort, überall und so lange man will gelesen werden. Weil das Ausleihen damit viel zu einfach wird, hat man dem willigen Benutzer jedoch noch ein paar Steine in den Weg gelegt.

Viele PDF-Dateien müssen einzeln heruntergeladen werden
Viele PDF-Dateien müssen einzeln heruntergeladen werden

Wer schon einmal ein digitales Buch ausgeliehen hat kennt das Problem wahrscheinlich. Man landet beispielsweise auf der Seite des Anbieters www.springerlink.com bei dem der Download lizenziert ist und hat dann lediglich die Möglichkeit alle Kapitel des Buches einzeln als PDF herunter zu laden. Noch dazu heißt dann jede Datei „fulltext.pdf“ und muss nach dem herunterladen umbenannt werden, damit man die Kapitel noch auseinanderhalten kann. Bei Büchern mit mehr als 20 Kapiteln hört die Freude am digitalen Download aber auf.

Wenn man sich die vielen Arbeitsschritte ersparen will muss man automatisieren. Eine Möglichkeit dazu ist die Nutzung des Firefox Add-ons „DownThemAll!“ und des PDF-Konverters „FreePDF“.

Mit DownThemAll! kann man alle Kapitel auf einmal herunterladen. Dazu muss das Add-on zuerst im Firefox installiert werden. Neustart des Browsers nicht vergessen! Anschließend bekommt man auf der Seite mit den PDF-Dokumenten nach einem Rechtsklick und Klick auf „DownThemAll!“ alle Links auf dieser Seite angezeigt. Nun müssen wir zuerst die Einstellungen bearbeiten (ganz unten rechts). Den Schieberegler „Max. Anzahl gleichzeitiger Downloads“ ganz nach links schieben, damit nur noch eine Datei  gleichzeitig heruntergeladen wird. Dadurch erreichen wir, dass die PDFs in der richtigen Reihenfolge auf unserem Rechner landen. Nun noch „Falls ein Dateiname…“ auf „Umbenennen“ stellen, damit nicht bei jedem PDF erneut  nachgefragt wird. Nach Klick auf „OK“ müssen wir nun auf das Pluszeichen vor „Schnelles Filtern“ klicken und dort folgenden Eintrag einfügen:“*.pdf“. Noch die Checkbox „Andere Filter deaktivieren“ auswählen und gegebenenfalls den Pfad ändern, an dem die Dateien gespeichert werden sollen. Es empfiehlt sich einen eigenen Ordner anzulegen indem man einfach an die bestehende Adresse einen Zusatz wie „buchxy“ hinzufügt. Alle Dateien landen dann nach Klick auf „Starten!“ in dem Ordner buchxy unter den Eigenen Dateien.

Nun wäre es ja praktisch, wenn wir anstatt der vielen einzelnen Dateien ein einziges Dokument hätten. Das Zusammenfügen erledigt FreePDF für uns. Damit FreePDF funktioniert muss erst Ghostscript installiert werden. Danach kann FreePDF durch Klick auf die aktuellste Versionsnummer heruntergeladen und installiert werden. Jetzt befindet sich im Startmenü unter FreePDF das Programm FreePDF Join. Oben Rechts wählt man durch Klick auf das Ordnersymbol den Ordner mit den heruntergeladenen Dateien aus, markiert alle Dateien und klickt auf „Öffnen“. Jetzt sollte man darauf achten, dass die Dokumente auch ja in der richtigen Reihenfolge sind und anschließend auf das Disketten Symbol klicken. Nun muss man nur noch einen Namen für die zusammengefügt Datei eingeben, am besten den Titel des Buches und fertig ist man.

Nun hat man das  Buch in einem Dokument und kann es komplett nach Stichwörtern durchsuchen.

C95K iscsi mode parameter und VMware iscsi software initiator

Wir hatten wiederholbar Probleme mit dem iSCSI-Verkehr zwischen einem ESX-Host vmnode8 und einer LUN, die vom Cisco 9509 SAN-director per iSCSI durch das IPS-8 board bereitgestellt wurde. Zwischen vmnode8 und c95k-rzkj-1 war wenigstens 1 router, wenn die Probleme auftraten. In einer Konfiguration ohne router, d.h. mit VMware host und c95k an einem switch waren die Probleme nicht zu beobachten.

Das Problem äusserte sich dadurch, dass bei dem Versuch der Installation eines Windows-Servers oder der Einrichtung einer disk unter knoppix mit fdisk I/O-Fehler auftraten.

Debugging mit tcpdump auf einem entsprechend auf den vSwitch (der auf promiscuous mode accept einzustellen war) des iSCSI-kernel-interfaces eingerichteten Gast zeigte, daß für eine Serie von mit TCP-Push gesendeten Paketen weniger Ack-Pakete zurückkamen, allerdings die sequencenumber korrekt inkremementiert war auf die Zahl des letzten gesendeten Bytes.

Cisco bietet zur Konfiguration eines iSCSI-(target) interfaces u.a. den mode parameter an:

interface iscsi
To configure an iSCSI interface, use the interface iscsi command. To revert to default values, use the no form of the command.
interface iscsi slot/port
mode {pass-thru | store-and-forward}
tcp qos value
interface iscsi slot/port
no mode {pass-thru | store-and-forward | cut-thru}
no tcp qos value
no interface iscsi slot/port
Syntax Description
Defaults
Disabled.
The TCP QoS default is 0.
The forwarding mode default is store-and-forward.

Bei uns standen aber alle Interfaces auf „mode pass-thru“. Umsetzen auf den „neuen“ Standardwert „mode store-and-forward“ ergab das offenbar vom VMware software iSCSI-initiator gewünschte Verhalten: nun wird offenbar für jedes TCP-Push ein ACK gesendet. Damit geht der fdisk-Vorgang dann rasch erfolgreich zuende.

Informationsaggregation durch Webseiten

Wie viel Zeit verliert man täglich mit dem Besuchen verschiedener Webseiten, nur um zu überprüfen, ob es neue Informationen gibt. Oder sei es, dass man immer auf dem neuesten Stand sein möchte, was aktuell in der Welt los ist.

Anstatt jede Seite immer einzeln anzusteuern gibt es Dienste, die Informationen von verschiedenen Webseiten in einer Übersicht sammeln. Möglich machen dies RSS-Feeds, Widgets und die Funktionen des Web 2.0. Auf Webseiten wie netvibes.com, igoogle.com oder live.com können Sie die Informationen von Spiegel Online, Kölner Stadtanzeiger, heise und welche Seite Sie auch immer interessiert in einer Übersicht bündeln. Dabei sind die Themen nicht nur auf das aktuelle Weltgeschehen begrenzt, sondern selbst Webseiten der Unterhaltungskultur liefern Ihre neuesten Beiträge per RSS, z.B. failblog.org. Zusatzfunktionen ermöglichen Ihnen das Einbinden weiterer Übersichten, sei es das E-Mail-Postfach oder das aktuelle Wetter.

Um diese Dienste nutzen zu können müssen Sie sich bei einem der Anbieter kostenlos registrieren und einfach die gewünschten Inhalte hinzufügen. Sie werden überrascht sein auf wie vielen Webseiten Sie das orangefarbene RSS-Symbol entdecken werden, wenn Sie erst einmal danach suchen.

Wie eine solche Seite aussehen kann sehen Sie unter www.netvibes.com/galileo5

netvibes1

Amazon, Google Book Search und KUG miteinander verknüpfen

Ob ein Buch in der Bibliothek vorhanden ist, lässt sich jetzt auch in Amazon oder Google Books feststellen. Dies funktioniert mittels Greasemonkey und KUG-Skripten.
Beim Aufruf der Titelanzeige wird in amazon dann angezeigt, ob ein Buch vorhanden ist oder nicht. Der Link führt von Amazon direkt zum entsprechenden Titel im KUG.
Die Installation braucht ca. 5 Minuten. Wie das funktioniert, beschreibt Herr Oliver Flimm von der USB in dem OpenBibBlog:
http://blog.openbib.org/2008/11/04/kug-verfugbarkeit-bei-amazon-und-google-books/