Howto: Convert Ext2 to Ext3 to Ext4

Wie schoen ist es doch, dass man sein vor 15 Jahren angelegtes Dateisystem relativ einfach aktualisieren kann.
Interessant ist das ganze wenn man an die Grenzen des jeweiligen Dateisystems stoesst, wie z.B. die Dateigroessengrenze von 2Tebibyte bei ext2, oder die bei ext2 und ext3 gleiche Begrenzung von ~32000 Unterordnern pro Verzeichnis.
Die Konvertierung ist hier anhand eines simplen Beispiels einmal durchgespielt. Dafuer legen wir uns eine 50MB grosse Containerdatei an, in der ein Dateisystem erzeugt wird und wir dann die Konvertierung vornehmen.

Als erstes legen wir die Containerdatei an und binden diese unter /dev/loop0 als loop device ein:

$ dd if=/dev/urandom of=testfile bs=1M count=50
$ losetup /dev/loop0 testfile

Nun muss eine Partition in dem Container angelegt werden, z.B. mit fdisk:

$ fdisk /dev/loop0
n p 1 enter w

Danach legen wir ein Ext2 Dateisystem darin an, mounten dieses, erstellen darin eine Datei gucken das wir sie lesen koennen und haengen es wieder aus:

$ mkfs.ext2 /dev/loop0
$ echo foo >> /mnt/bar
$ cat /mnt/bar 
bar
$ mount | grep loop0
/dev/loop0 on /mnt type ext2 (rw)
$ umount /mnt

Jetzt konvertieren wir das Dateisystem zu einem Ext3, haengen es ein, gucken ob wir die Datei noch lesen koennen und haengen es wieder aus:

$ tune2fs -j /dev/loop0
$ mount /dev/loop0 /mnt/
$ cat /mnt/bar
foo
$ mount | grep loop0
/dev/loop0 on /mnt type ext3 (rw)
$ umount /mnt

Hat geklappt! Zuletzt bringen wir das Dateisystem auf Ext4 und probieren das gleiche nochmal wie bei den vorherigen Schritten:

$ tune2fs -O extents,uninit_bg,dir_index /dev/loop0
$ e2fsck -fDC0 /dev/loop0
$ mount /dev/loop0 /mnt
$ cat /mnt/bar
foo
$ mount | grep loop0
/dev/loop0 on /mnt type ext4 (rw)
$ umount /mnt

Und aufraeumarbeiten:

$ losetup -d /dev/loop0
$ rm testfile

Neues Projekt: file delivery

Nach Goetemp und Werdertweets schmeiss ich jetzt mal file delivery hier raus ins Netz. Die Idee des Projekts ist relativ simpel. Ueber einen einfachen Weg Dateien im Internet zur Verfuegung zu stellen ohne den echten Dateinamen bekannt zu geben sowie die Dokumente im DocumentRoot vorzuhalten.
Dabei herausgekommen ist file delivery. Es ist ein in PHP geschriebenes kleines System wo ueber ein Webinterface Dateien hochgeladen werden koennen. Die Dateien koennen irgendwo im Dateisystem liegen und muessen nicht im DocumentRoot des Webservers verfuegbar sein. Nach dem Upload gibt es eine URL die aus dem Benutzernamen des Nutzers der die Datei hochgeladen und der MD5-Checksum der hochgeladenen Datei besteht. Nur mit dieser kryptischen URL kann man nun die eine Datei herunterladen.
Als kleines Addon ist eine optionale Emailbenachrichtigung implementiert, die eine Email verschickt, wenn die gewaehlte Datei heruntergeladen wird.

Das System hat eine simple Benutzerverwaltung. Neue Nutzer koennen von dem Administrator Account hinzugefuegt werden. Wenn das PHP-Modul „apc“ installiert und aktiviert ist, wird auch ein Upload Fortschrittsbalken angezeigt. file delivery nutzt Smarty als Templateengine und kann dadurch komplett geskinnt werden.

Das System habe ich unter http://files.pregos.info installiert. Zugangsdaten zum Testen sind „admin/password“. Fuer diese Installation habe ich das Passwort aendern fuer den Administrator deaktiviert.

Wer Anmerkungen, Kritik oder aehnliches hat, bitte immer her damit. Code gibts fuer interessierte auf Anfrage per Mail.

HowTo: multiple Apache2 vhosts mit unterschiedlichen SSL-Zertifikaten

Die Aufgabe: in Apache bei verschiedenen vhosts verschiedene SSL-Zertifikate fuer die Verschluesselung definieren.
Das Problem: mit mod_ssl laesst sich das ganze nicht so einfach realisieren.
Die Ursache: vhosts basieren auf Basis von HTTP-Headers, SSL liegt ein Layer darunter. Die Verbindung wird gesichert bevor HTTP gesprochen wird. Der Server kann bei Verbindungsaufbau nicht wissen welchen vhost er danach bedienen soll, deswegen kann er das richtiger Zertifikat nicht auswaehlen.
Die Loesung: mod_gnutls
HowTo: das ganze unter Debian Lenny

Ich gehe an dieser Stelle davon aus, dass man bereits SSL-Zertifikate generiert hat (blubs).

Als naechstes ist es nun wichtig das Modul zu installieren, anzupassen und zu aktivieren:

aptitude install libapache2-mod-gnutls

Danach die /etc/apache2/mods-available/gnutls.conf anpassen:

<IfModule mod_gnutls.c>
  GnuTLSCache dbm /var/cache/apache2/gnutls_cache
 
  AddType application/x-x509-ca-cert .crt
  AddType application/x-pkcs7-crl    .crl
 
  GnuTLSCacheTimeout 300
  NameVirtualHost *:443
</IfModule>

und das Modul aktivieren:

a2enmod gnutls

Nun noch die Zeile:

Listen 443

zu der /etc/apache2/ports.conf hinzufuegen und dabei darauf achten, dass die Zeile vor der „Listen 80“ steht, da es sonst in der /var/log/apache2/error.log zu den folgenden Zeilen kommen kann:

[Sun Dec 05 14:37:06 2010] [error] [client ::1] GnuTLS: Handshake Failed (-8) 'A record packet with illegal version was received.'

Nun koennen die vhosts entsprechend eingerichtet werden. Hier ein generisches Beispiel fuer einen vhost:

<VirtualHost *:443>
    ServerAdmin webmaster@example.net
    ServerName www.example.net
    ServerAlias example.net
    DocumentRoot /var/www/example.net/
 
    <Directory /var/www/example.net/>
        Options +Indexes
    </Directory>
 
    GnuTLSEnable on
    GnuTLSCertificateFile /etc/ssl/myCA/private/www.example.net-key-cert.pem
    GnuTLSKeyFile /etc/ssl/myCA/private/www.example.net-key-cert.pem
    GnuTLSPriorities SECURE:!MD5
 
    CustomLog /var/log/apache2/example.net-access.log combined
</VirtualHost>

Nach einem Neustart von Apache2 kann nun per https auf den gewuenschten vhost zugegriffen werden, viel Spass beim Einrichten des zweiten und freien wenns klappt!