MySQL-Speicherverbrauch

Wer sich ein wenig mit MySQL beschäftigt hat, weiß, dass es nicht nur in den Features, sondern auch im Handling einige Unterschiede zwischen den DB-Engines MyISAM und InnoDB gibt.
Die Transaktionssicherheit von InnoDB erkauft man sich u.a. durch eine geringere Transparenz, wo welche Daten liegen und auch wie viel Speicherplatz von den einzelnen Tabellen und Datenbanken belegt werden, da die InnoDB im Gegensatz zur MyISAM ihre Daten nicht in separaten Dateien ablegt, sondern alle Daten aller Datenbanken in nur einer Datei vereint.. Hat man viele Datenbanken mit vielen Tabellen, erschwert dies die Fehlersuche und Optimierung ungemein.

Ich habe hier ein paar MySQL-Queries zusammen gestellt, welche die gewünschten Informationen aus den Tabellen der MySQL-eigenen Datenbank „information_schema“ lesen.

Wer sich ein wenig mit MySQL beschäftigt hat, weiß, dass es nicht nur in den Features, sondern auch im Handling einige Unterschiede zwischen den DB-Engines MyISAM und InnoDB gibt.
Die Transaktionssicherheit von InnoDB erkauft man sich u.a. durch eine geringere Transparenz, wo welche Daten liegen und auch wie viel Speicherplatz von den einzelnen Tabellen und Datenbanken belegt werden, da die InnoDB im Gegensatz zur MyISAM ihre Daten nicht in separaten Dateien ablegt, sondern alle Daten aller Datenbanken in nur einer Datei vereint.. Hat man viele Datenbanken mit vielen Tabellen, erschwert dies die Fehlersuche und Optimierung ungemein.

PHPMyAdmin zeigt zwar die Größe der Tabellen an, aber man muss dazu jede einzelne Datenbank anklicken und verliert so den Überblick.

Ich habe hier ein paar MySQL-Queries zusammen gestellt, welche die gewünschten Informationen aus den Tabellen der MySQL-eigenen Datenbank „information_schema“ lesen.

Voraussetzung für alle folgenden Queries ist eine SQL-Verbindung zum Server mit einem Account, der für das Lesen der Informationen aus der Datenbank „information_schema“ berechtigt ist – also z.B. „root“;

Warnung: Diese Anweisungen sammeln Daten über sämtliche Inhalte eines Servers, bei großen Datenmengen und langsamen Servern können diese eine Laufzeit von mehreren Minuten haben und den Betrieb des Servers stark beeinflussen!

Gesamt-Verbrauch aller DBs

Möchte man die Größe aller Datenbanken auf einem Datenbank-Server erfahren, so kann dazu der folgende SQL-Befehl verwendet werden:
SELECT concat( round( sum( data_length + index_length ) / ( 1024 *1024 ) , 2 ) , 'M' ) size
FROM information_schema.TABLES ;

Hierbei wird die Speicherplatzbelegung, die in Bytes vorliegt gleich in MB umgerechnet, für Fälle, in denen das nicht sinnvoll ist, lässt man natürlich die Funktionen round und concat weg und teilt auch nicht durch ( 1024*1024 ).
Diese Abfrage addiert den Speicherplatz-Verbrauch der Daten und ihrer Indices, wer diese Größen getrennt braucht, kann obige Abfrage leicht modifizieren.

Diese Abfrage lässt sich natürlich weiter verfeinern. Da man die Speicherplatzbelegung der MyISAM-Tabellen leicht anhand der Größen der einzelnen Dateien ablesen kann, gehen wir ab hier nur noch auf die InnoDB ein.

Gesamt-Verbrauch aller InnoDB-Tabellen

Die Daten der InnoDB-Engine liegen, wie gesagt, in nur einer Datei. Häufig ist diese Datei mit der Option „autoextend“ konfiguriert, so dass die Datei automatisch vergrößert wird, sobald neue Daten in die Datenbank geschrieben werden. Jedoch schrumpft sie nicht, wenn Daten gelöscht werden. Der freigewordene Speicherplatz innerhalb der Datei, kann wieder von Daten in der InnoDB belegt werden, es dauert also, bis die InnoDB-Datei wieder voll ist, und sie mittels autoextend vergrößert werden muss, aber auf der Festplatte des Servers wird dieser Speicherplatz nie wieder freigegeben. So kann es sein, dass die Datei auf der Festplatte deutlich größer ist, als die Nutzdaten darin.
Um zu erfahren, wie viele Nutzdaten sich also derzeit wirklich in der InnoDB befinden, ist folgende Abfrage nützlich:
SELECT concat( round( sum( data_length + index_length ) / ( 1024 *1024 ) , 2 ) , 'M' ) size
FROM information_schema.TABLES
WHERE ENGINE='InnoDB' ;

InnoDB-Speicherverbrauch pro Datenbank

Um zu erfahren, in welcher Datenbank der Speicher verbraucht wird, kann man sich hiermit leicht einen Überblick verschaffen:
SELECT table_schema 'database', concat( round( sum( data_length + index_length ) / ( 1024 *1024 ) , 2 ) , 'M' ) size
FROM information_schema.TABLES
WHERE ENGINE='InnoDB'
GROUP BY table_schema
ORDER BY sum( data_length + index_length );

In diesem Fall wird das Resultat auch noch nach der Größe sortiert.

Hinweis: Nicht vergessen, in diesen Größen-Angaben werden alle Daten, die nicht mit der Engine InnoDB verwaltet werden ignoriert. Will man alle Daten sehen muss die Anweisung WHERE ENGINE='InnoDB' weggelassen werden.

InnoDB-Speicherverbrauch pro Tabelle

Um zu erfahren, in welcher Tabelle einer bestimmten Datenbank der Speicher verbraucht wird, kann hiermit die Datenbank näher inspizieren, dabei muss in der Abfrage natürlich der Name der betreffenden Datenbank anstelle des Platzhalters [DATABASE_NAME] eingetragen werden:
SELECT table_name 'table', concat(round((data_length+index_length)/(1024*1024),2),'M') size
FROM information_schema.TABLES
WHERE ENGINE='InnoDB'
AND table_schema = '[DATABASE_NAME]'
ORDER BY ( data_length + index_length );

Große InnoDB-Tabellen auf einem Server finden

Möchte man einen ganzen Server nach Tabellen einer bestimmten (Mindest-)Größe durchsuchen, ohne den Umweg über die Größe der Datenbanken zu nehmen, kann man dies auch direkt in einer Anweisung formulieren. Da viele Tabellen sehr klein sind, ist es selten sinnvoll sich die Größe aller Tabellen eines Servers anzuzeigen, daher dient die letzte hier vorgestellte Abfrage dazu, alle Tabellen eines Servers anzuzeigen, die in der InnoDB mindestens 100MB belegen. Die Angabe der Mindestgröße geschieht hierbei in Byte, daher steht in der WHERE-Anweisung des SQL die Zahl 104857600 (=100*1024*1024):
SELECT table_schema 'database', table_name 'table', concat(round((data_length+index_length)/(1024*1024),2),'M') size
FROM information_schema.TABLES
WHERE ENGINE='InnoDB'
AND data_length + index_length >104857600
ORDER BY ( data_length + index_length );

Viele Wege führen nach Rom – oder zur automatischen Konfiguration

Seit geraumer Zeit bietet das RRZK eine automatische Konfiguration des Mailkontos für Thunderbird und Outlook an. Damit entfällt für Smail- und UNI-Accounts im Regelfall das lästige Nachschlagen von zu verwendeten Servernamen und -einstellungen. Welche Schritte hinter den Kulissen notwendig sind, um diesen Service zu erbringen, und welche Fallen Microsoft den Implementieren ihres Verfahrens in den Weg gelegt hat, ist Gegenstand dieses Artikels.

Ein Mailprogramm für den Abruf eines bestimmten Mailkontos zu konfigurieren ist nicht immer leicht, besonders in Zeiten, in denen die Verwendung mehrerer unterschiedlicher Mailadressen für verschiedene Zwecke fast schon zum guten Ton gehört. Da ist es mitunter schwierig, den Überblick zu behalten über die an den verschiedenen Stellen erforderlichen oder möglichen Einstellungen und man ist schon sehr froh, dies typischerweise nur genau einmal machen zu müssen. Die auf den RRZK-Webseiten abrufbaren ausführlichen Anleitungen zur Konfiguration verschiedener Mailclients sind ein Zeugnis dieser vielfach als zu kompliziert empfundenen Prozedur.

Diesem Umstand haben verschiedene Anbieter von Mailclients in letzter Zeit Rechnung getragen, indem sie eine erleichterte Konfiguration ermöglichen – wenn auch leider jeder auf seine eigene Art. In jedem Fall wird damit die Einrichtung eines Mailkontos zum Kinderspiel: die gleichen Angaben, die man üblicherweise auch zur Anmeldung in einem Webmailer verwendet, also Mailadresse und Passwort, reichen aus, und schon funktioniert alles wie von Geisterhand. Doch damit das so einfach klappt, sind natürlich im Hintergrund einige dienstbare Geister erforderlich. Für die technisch Interessierten beschreibe ich daher im Folgenden, wie die seit einer Weile am RRZK verfügbare automatische Konfiguration für die weit verbreiteten Mailprogramme Thunderbird (ab Version 3.1) und Outlook (ab Version 2007) funktioniert. Wie nicht anders zu erwarten gibt es darüberhinaus natürlich noch weitere Ansätze zur automatischen Konfiguration von Mailkonten, z.B. auf dem iPod/iPad/iPhone, um die es hier aber nicht gehen soll.

Autoconfig für Thunderbird

Im Mozilla-Umfeld ist die automatische Konfiguration unter dem Begriff Autoconfiguration (oder kurz Autoconfig) bekannt. Ursprünglich mit Thunderbird 3.0 eingeführt, hat sich die Spezifikation mit Thunderbird 3.1 weiterentwickelt und dabei inzwischen ein nach meiner Ansicht recht brauchbares Stadium erreicht. Zwar wird weiterhin an Erweiterungen gearbeitet, die die Software in bestimmten Umfeldern noch besser einsetzbar machen, und der eine oder andere Fehler steckt auch noch im Konfigurationsassistenten, aber insgesamt macht diese nützliche Funktion schon einen sehr brauchbaren Eindruck.

Doch wie funktioniert die automatische Konfiguration bei Thunderbird überhaupt? Zunächst einmal wird aus der eingegebenen Mailadresse der Domainname, also der Teil rechts vom @-Zeichen, extrahiert. Dieser kann dann verwendet werden, um in einer vom Mozilla-Projekt betriebenen Datenbank nachzuschlagen, ob dort ein Eintrag mit Konfigurationsdaten für diesen Mailanbieter vorhanden ist. Das ist natürlich typischerweise nur bei sehr großen, weltweit tätigen Mailanbietern der Fall. Mit den so gewonnenen Informationen kann Thunderbird dann die Mailservereinstellungen von alleine vornehmen und versuchen sich mit dem eingegebenen Passwort beim Server anzumelden. Voraussetzung dafür ist jedoch, dass zum Login auf dem Server ebenfalls die Mailadresse (oder der sog. Localpart, der Teil links vom @ in der Mailadresse) verwendet wird. Das ist jedoch am RRZK nicht immer der Fall. Hier erfolgt die Anmeldung stets mit dem Benutzerkennzeichen und dieses kann – jedenfalls dann, wenn für den Account ein Alias angelegt wurde – nicht direkt aus der Mailadresse abgeleitet werden.

In diesem Fall ist es also etwas komplizierter. Um die automatische Konfiguration dennoch zu ermöglichen, betreibt das RRZK einen Server speziell für diesen Zweck, der von Thunderbird abgefragt werden kann. Über passende DNS-Einträge wird der Server von Thunderbird gefunden, und mittels der bei der Abfrage übermittelten Mailadresse ist der Konfigurationsserver seinerseits in der Lage, das hierzu passende Benutzerkennzeichen herauszufinden und dies – zusammen mit den zu verwendenden Servernamen und den Sicherheitseinstellungen – zurück an Thunderbird zu schicken. Auf diese Weise erhält also jeder Benutzer eine individuell für sein Benutzerkennzeichen angepasste XML-Datei vom Konfigurationsserver, wodurch diese komfortable Einrichtung des Mailkontos ermöglicht wird. (Neben den beiden zuvor genannten Möglichkeiten versucht Thunderbird im Notfall übrigens auch noch, die Servernamen zu erraten, indem bei einer Mailadresse foobar@example.com einfach häufig genutzte Namen wie mail.example.com ausprobiert werden, jedoch kann dieser Ansatz systembedingt beim RRZK-Mailservice nicht zuverlässig funktionieren.)

Autodiscover für Outlook

Auch Microsoft möchte es den Benutzern seiner Software besonders leicht machen und hat bereits seit der Version 2007 in Outlook eine automatische Konfiguration von Mailkonten vorgesehen, die den Namen Autodiscover trägt. Nicht nur Verbindungen zu den Microsoft-eigenen Exchange-Servern können damit automatisiert konfiguriert werden, sondern auch solche zu „normalen“ Mailservern nach den gängigen Internet-Standards (SMTP, POP, IMAP). Liest man die von Microsoft hierzu publizierte Spezifikation durch und vergleicht sie mit der des Mozilla-Projekts, so denkt man auf den ersten Blick „Hut ab!“, denn das Microsoft-Dokument erscheint wesentlich durchdachter. Beispielsweise wird auch das Thema Fehlerbehandlung darin genau abgehandelt, was bei dem Mozilla-Ansatz eher schlicht-pragmatisch nach dem Motto „wenn der Login nicht klappt merkt man ja, dass ein Fehler vorliegt“ gehandhabt wird.

Leider verflüchtigt sich dieser gute Eindruck schnell, wenn man sich intensiver mit dem Thema befasst. So ist es beispielsweise bei Outlook 2007 nicht mit Hilfe der Autodiscover-Funktion möglich, das Programm dazu zu bewegen, eine mittels StartTLS verschlüsselte Verbindung zum Postausgangsserver aufzubauen, obwohl das Programm diese Funktionalität sehr wohl beinhaltet (über die normale Benutzeroberfläche kann dies mit wenigen Mausklicks eingestellt werden). Während bei anderen Softwareherstellern ein solch offensichtlicher Fauxpas sicherlich bald mit einem Update auskuriert würde, hält man dies bei Microsoft offenbar nicht für nötig und behebt diesen Fehler erst in der kostenpflichtigen Nachfolgerversion Outlook 2010. Aus Programmierersicht lästig ist sicherlich auch der Ansatz, für die Übergabe eines einzelnen Parameters, nämlich der Mailadresse, gleich eine ganze XML-Datei mitzuschicken (darüber haben sich andere bereits ausgelassen), wenn auch letztlich nur konsequent, da Microsoft damals offenbar ganz und gar auf dem HTTPS-XML-Trip war – inzwischen bevorzugt man in Redmond offenbar SOAP.

Fast noch ärgerlicher als dieser Fehler ist jedoch die Art und Weise, wie die Verfügbarkeit von StartTLS bei der XML-Konfiguration von Microsoft kommuniziert wird. Liest man sich die Hinweise auf dieser Microsoft-Webseite durch, die von sich selbst behauptet, für die Version 2010 überarbeitet worden zu sein, so erfährt man nichts über die neu hinzugekommene Möglichkeit mittels des Encryption-Tags eben doch StartTLS angeben zu können. Erst an anderer Stelle sind die hoffentlich richtigen Informationen dann zu finden. Und weil zwei verschiedene Varianten noch nicht reichen, gibt es auch noch eine dritte Website bei Microsoft, die den Informationen auf den ersten beiden widerspricht, denn hier wird in diesem Beispiel das Error-Element als Kind des Account-Elements beschrieben, was es gemäß des veröffentlichten XML-Schemas (oder auch des Beispiels für eine XML-Antwort im Fehlerfall) hingegen nicht ist. Microsoft wäre jedoch nicht Microsoft, wenn man dort drei Dokumente bräuchte, um sich selbst zu widersprechen: Nein, schon innerhalb eines Einzelnen findet man zum Thema Autodiscover widersprüchliche Aussagen. So ist im Abschnitt 2.2.3.2.2 der zuvor genannten zweiten Spezifikation die Rede davon, Unterstützung für das RedirectUrl-Tag sei zwingend vorgeschrieben (MUST-Requirement), während wenige Zeilen später im Abschnitt 2.2.3.2.4 daraus ein SHOULD-Requirement wird.

Übertroffen wird diese Schlamperei nur noch durch die Implementierung der Spezifikation in Outlook selbst. Denn die zuvor lobend erwähnten Informationen im Fehlerfall, etwa wenn aufgrund eines Tippfehlers in der vom Benutzer angegebenen Mailadresse der Konfigurationsserver signalisiert, dass für diese Adresse keine automatische Konfiguration erfolgen kann, wertet Outlook nicht etwa aus oder zeigt die Fehlermeldung dem Benutzer an, nein, stattdessen wird einfach versucht die richtigen Einstellungen per Guessmart zu raten, was in diesem Fall natürlich zum Scheitern verurteilt ist und dem Benutzer stattdessen eine unklare Fehlermeldung beschert. Dass das Microsoft-Produkt im Gegensatz zu praktisch jeder anderen Mailsoftware auch nicht in der Lage ist, den Realm für eine DIGEST-MD5-Authentifizierung korrekt auszuhandeln (in Microsofts eigenem Jargon unter „SPA“ subsumiert) ist dann nur noch das Tüpfelchen auf dem i.

Während der grundsätzliche Ablauf der automatischen Ermittlung bei beiden Verfahren gleich ist (Ermitteln des Konfigurationsservers, Anfrage mit der zu konfigurierenden Mailadresse abschicken, XML-Datei empfangen), so besteht ein gewichtiger Unterschied zwischen der Autoconfig-Funktion von Thunderbird und dem Autodiscover von Outlook darin, dass beim Autodiscover standardmäßig eine per SSL verschlüsselte Verbindung zum Einsatz kommt. Dies macht es erforderlich, für jede Maildomain einen eigenen Webserver mit passendem Zertifikat zu betreiben, wenn nicht bei jedem Aufruf erst einmal eine Warnmeldung erscheinen soll. Aus diesem Grund ist die automatische Konfiguration für Outlook am RRZK auch nur für uni-koeln.de und smail.uni-koeln.de verfügbar, im Gegensatz zur automatischen Konfiguration von Thunderbird, die darüberhinaus auch für virtuelle Maildomänen verfügbar ist. Seitdem am RRZK auch Let’s Encrypt zur Verfügung steht, um Websites mit Zertifikaten für SSL/TLS auszustatten, steht der Autodiscover-Dienst nun auch für nahezu alle virtuellen Mail-Domänen bereit. Somit funktioniert auch für solche Mailadressen des Typs

name@einrichtung.uni-koeln.de

die Einrichtung der Mailadresse in Outlook – zumindest den Desktop-Versionen – automatisch. Allerdings ist Outlook als IMAP-Client auch nicht unbedingt zu empfehlen.

2.2.3.2.2

CSS neu laden, ohne die Webseite neu laden zu müssen…

Mit dem Add-on CSS Reloader kann man im Firefox, den CSS-Code einer Webseite neu laden, ohne den HTML-Code neu laden zu müssen.

Wer Webseiten erstellt und an dem Punkt angekommen ist, an dem das Fine-Tuning des CSS-Codes beginnt, kennt das Problem:

Eigentlich will man nur schauen, ob die jüngste Anpassung den gewünschten Effekt hatte aber beim Drück auf F5 muss man die ganze Seite neu laden, PHP-Skripte müssen gestartet werden, Datenbanken abgefragt usw.

Einfacher können es nun Benutzer des Firefox-Browsers haben: Mit dem Add-on „CSS Reloader“.

Einfach installiert, lädt er beim Druck auf F9 lediglich das CSS einer Seite neu, ohne den HTML-Code neu abzufragen.

Das Add-on kann man hier herunterladen: https://addons.mozilla.org/en-US/firefox/addon/46211/

Microsoft Office 2010 – Aktivierung, die Erste

Nachdem viele Nutzer und Einrichtungen Office 2007 übersprungen und bislang mit Office 2003 gearbeitet haben, löst sich dieser Investitionsstau derzeit und resultiert in einer großen Nachfrage nach der aktuellen Version Office 2010 (analog zum Betriebssystem, wo sich Windows 7 nach dem oftmals übersprungenen Vista derzeit großer Beliebtheit erfreut).

Im Normalfall lässt sich Office 2010 problemlos über ältere Office Versionen installieren und erkennt auch viele der vorgenommenen Konfigurationseinstellungen, die dann meist auch beibehalten bzw. übernommen werden. Bei einem solchen Upgrade wird kein Aktivierungsschlüssel verlangt, sondern automatisch eine 30-Tage Testversion installiert, die spätestens nach Ablauf der Testphase freigeschaltet werden muss.

Für die Freischaltung rufen Sie in einem beliebigen Office 2010 Programm (z.B. Word) im Menü den Reiter „Datei“ auf und klicken dort dann (in der linken Spalte) auf „Hilfe“. In der rechten Spalte finden Sie nun die Option „Produkt Key ändern“. Nach dem Anklicken können Sie in einem neuen Fenster den Produkt Key eingeben und Ihre Installation von Office 2010 freischalten.

Wenn der Bildschirm überquillt

Netbook-Nutzer haben es manchmal nicht leicht: Das Display ihrer Winzlinge hat meist eine Auflösung von nur 1024×600 Pixeln zu bieten – für manche Fenster ist das zu wenig. Besonders die begrenzte Höhe von nur 600 Pixeln macht Probleme. Hin und wieder fehlen da ganze Reihen von Schaltflächen und Buttons, so dass z.B. Installationsdialoge nicht erfolgreich bis zum Ende durchgeführt werden können.

Während ein solches übergroßes Fenster bei gängigen Linux-Distributionen kein Problem ist (man verschiebt das Fenster in Kombination mit gedrückter Alt-Taste einfach durch Ziehen nach oben, damit auch die untersten Schaltflächen eingeblendet und nutzbar werden), bietet Windows selbst leider keine solche Möglichkeit (dort lässt sich ein Fenster nur mit einem Klick und Ziehen der Titelleiste bewegen, doch wenn die Titelleiste nicht mehr greif- und sichtbar ist, stößt Windows im wahrsten Sinne des Wortes an seine Grenzen). Das Tool „Teakwindow“ bereitet dem ein Ende, indem es das Ziehen und Verschieben von Windows-Fenstern – unabhängig von einer (nicht) sichtbaren Titelleiste – ermöglicht. Es ist ohne Installation lauffähig (damit auch portabel und auf USB-Sticks nutzbar) und lässt den Nutzer ebenfalls bei gedrückter Alt-Taste jedes beliebige Fenster auf dem Bildschirm in die gewünschte Position bewegen. Wer möchte, kann das Werkzeug natürlich auch mittels Autostart-Eintrag direkt beim Anmelden starten lassen, so dass es nach der Anmeldung sofort zur Verfügung steht.

Informationen und Download von „Teakwindow“ unter http://taekwindow.sourceforge.net/

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.

Intranettes Symbian – Nokia Handys mit Cisco VPN verbinden

Dienstag abend, in einem verspäteten Regionalexpress in der Pampa zwischen Pulheim und Stommeln: Ein netter kleiner RRZK-Mitarbeiter nutzt sein hypermodernes Präzisionsinstrument aus Finnland (a.k.a. Nokia E72), um die E-Mails zu lesen, die ihn nach der Bürozeit erreicht haben. Aha, der Herr Professor Hänneschen hat Probleme mit dem Zugriff auf seinen Webspace und hat daraufhin ein Ticket bei uns eröffnet. Der nette kleine RRZK-Mitarbeiter erkennt das Problem und möchte dem armen Professor den Abend retten, also schnell auf das OTRS zugegriffen und – BÄM… „Zugriff verweigert“. Ach ja, das Ticketsystem ist nur aus dem Uninetz erreichbar. Toll, dass die Uni dafür VPN anbietet. Blöd, dass Nokia Handys sich damit nicht verbinden können.

Nun stehen zur Lösung dieses Problems im Netz diverse kostenpflichtige VPN-Clients zur Verfügung. Aber das Schöne: Es geht sogar kostenlos! Eine ganz allgemeine Anleitung dazu findet man auf den Seiten von Mobilfunk-FAQ. Hier beschränke ich mich daher auf eine etwas kürzere Anleitung für diejenigen, die sich speziell mit dem VPN der Uni Köln verbinden möchten. Vorab: Die Nutzung erfolgt auf eigene Gefahr und ohne Support oder Gewährleistung, falls etwas schief geht!

Zunächst benötigt man diese SIS-Datei, also ein Symbian-Installationspaket. Eigentlich wäre das sogar schon alles, aber leider muss die Datei für jedes Handy einzeln signiert werden. Es besteht über die Seite Symbiansigned die Möglichkeit, ein Programm zu signieren. Wichtig ist dabei die IMEI (die Seriennummer des Handys), die über die Eingabe von *#06# auf dem Handy angezeigt werden kann. Nach dem Upload der Datei erhält man per Mail das signierte Programm als Download.

Sobald Sie über die nun signierte SIS-Datei verfügen, laden Sie diese einfach auf Ihr Handy (per OVI, Bluetooth, Speicherkarte etc.) und installieren Sie das Paket. Je nach Handymodell müssen Sie nun einen neuen VPN- oder Intranetzugangspunkt einrichten und dabei die VPN-Richtlinie bzw. -Policy „VPN-Policy“ auswählen. Der Name des Zugangspunktes selbst ist beliebig. Bei der Einrichtung des Zugangspunktes müssen Sie zudem noch auswählen, über welche Netzverbindung Sie sich mit dem VPN verbinden möchten (neuere Modelle bieten praktischerweise den generischen „Internet“-ZP hierfür an). Künftig können Sie sich dann direkt über den erstellten Zugangspunkt im Uninetz anmelden. Anmerkung: Dies funktioniert *nicht* im WLAN der Uni, ist dort ja auch völlig unnötig.

Willkommen in der schönen neuen 64-Bit-Welt

Seit Montag habe ich einen neuen iMac mit Core i5-Prozessor. Meine bisherigen Systeme bei der Arbeit waren ein PowerMac G5 und ein MacBook der ersten Generation, also noch mit dem ersten Core-Prozessor, der nur 32-bittig war. Der PowerMac unterstützte zwar 64 Bit, aber damals war Apple mit Mac OS X noch nicht so weit. Nur für Intel-Prozessoren des Typs Core 2 Duo und höher gibt es seit Mac OS X 10.6 (Snow Leopard) GUI-Programme im 64-Bit-Modus.

Warum erzähle ich das? Ein von mir geschriebenes QuickLook-Plugin funktionierte auf dem iMac nicht mehr. Mein erster Verdacht ging natürlich dahin, dass es sich um ein 64-Bit-Problem handele. Das war zwar gar nicht so, aber ein solches gab es auch …

Mir war zuerst nicht aufgefallen, dass die Dokumente, auf die ich das Plugin anwenden wollte, noch auf dem PowerMac erstellt worden waren. Nach einiger Zeit habe ich begriffen, dass das Problem darin lag, dass das Dokument in „native byte order“ geschrieben war. Neu auf dem iMac erstellte Dokumente funktionierten eigentlich sofort, da das Plugin nur in einer 32 Bit-Version vorlag. Da ich dann aber der Vollständigkeit halber das Plugin neu kompiliert hatte, so dass es als „universal binary“ vorlag, hatte ich mir erfolgreich selbst eine Falle gestellt. Denn jetzt hatte ich wirklich ein 64-Bit-Problem.

Der Datentyp long hat auf 32-Bit-Systemen eine Länge von 4 Byte, auf 64-Bit-Systemen hingegen eine von 8 Byte. Weil ich das Plugin nicht mit Sicht auf 64 Bit entwickelt hatte, wurden falsche Werte gelesen.

Um sowohl den Umstieg von PPC auf Intel als auch den von 32 Bit auf 64 Bit zu unterstützen, musste ich:

– statt long den Datentyp int32_t verwenden
– die Bytereihenfolge vertauschen, wenn der gelesene Wert zu hoch war

Für Neugierige: mehr Informationen zu dem Plugin.