Wer kennt das nicht, man hat nach und nach mehre Festplatten in seinen Homeserver nachgeschoben, der Platz reicht eigentlich, nur ist er auf viele Platten verteilt. Das ganze ist unübersichtlich, weil man auf jeder Platte einen Backup-Ordner hat und es nervt ganz gewaltig. Das Vollbackup vom Notebook passt ungeteilt sowieso nicht mehr auf den Server, der Verschnitt ist einfach zu groß. Was also tun?

Die erste, offensichtliche Lösung: Daten löschen. Gut, wenn das ausscheidet könnte man natürlich eine richtig große Platte kaufen, aber der Platz ist doch eigentlich da und Festplatten immernoch recht teuer.

Der zweite Ansatz wäre ein Raid0 aus allen Platten zu bauen. Hier tauchen nun aber gleich mehrere Probleme auf. Zum Einen müsste man die Daten irgendwo zwischenlagern und dann wieder zurückkopieren – zum Anderen sind meist alle Daten verloren, sobald eine der Platten ausfällt.  Hinzu kommt, dass diese Aktionen sehr viel Zeit brauchen.

Der dritte Ansatz besteht in einem speziellen Union-Dateisystem.

Was ist ein Union-Dateisystem?

Das ursprüngliche Union-FS wurde entwickelt, damit Live-Distributionen einen nur lesbaren Verzeichnisbaum mit einem Verzeichnisbaum im RAM überlagern konnten, so dass man Dateien ändern konnte. Die veränderten Dateien lagen dann im RAM, das Linuxsystem konnte überall schreiben. Auch für Rechner die per Netz booten ist dies attraktiv, da nur die geänderten Daten lokal liegen müssen und das Betriebssystem per NFS geladen werden kann.

Das klassische Union-FS wurde inzwischen mehrfach neu implementiert und am Ende kam aufs dabei heraus, das advanced multi layered unification filesystem. Und das tolle: Es ist bereits im Kernel und die aufs-tools sind ein Debian-Paket!

Das advanced multi layered unification filesystem

Mit aufs ist es nun möglich, mehrere Dateisysteme auch schreibbar zu vereinigen, das heisst dass nicht eine unveränderbare Basis mit einem weiteren Dateisystem überlagert wird sondern mehrere veränderbare Dateisysteme vereinigt werden können.

Doch wie bestimmt aufs nun, auf welchem der darunterliegenden Dateisysteme eine neu erzeugte Datei angelegt wird? Und was passiert beim Kopieren oder Modifizieren von Dateien?

Im Gegensatz zu Unionfs, wo derartige Operationen immer im Kopieren der Originaldatei in die oberste Ebene des Stacks resultierte und sie dort verändert wurde (copy-up) lässt sich das Verhalten bei aufs konfigurieren.

Neben round-robin kann die Entscheidung auch anhand des noch verfügbaren Platzes auf den Dateisystemen erfolgen. Das bedeutet, dass eine neue Datei immer auf dem Dateisystem angelegt wird, auf dem noch am meisten Platz verfügbar ist.

Die Mountoptionen für dieses Verhalten:

mount -t aufs -v -o br:/mnt/fs1=rw:/mnt/fs2=rw,create=mfs:60,sum none /mnt/aufs

Hier werden fs1 und fs2 nach aufs gemounted und alle 60 Sekunden geprüft welches am meisten Platz hat. Ausserdem wird bei df die Summe des Platzes aller Dateisysteme angezeigt.

Fällt nun eine der Platten aus, sind wenigstens nicht alle Daten weg. Ausserdem lassen sich verschiedene Dateisysteme kombinieren und die Platten jederzeit auch einzeln weiternutzen. Man kann zur Laufzeit Platten per remount-Befehl hinzufügen, etc.

Viel Spaß mit der neuen Freiheit!

Was macht man, wenn man möchte, dass xen die Finger von den iptables-Regeln lässt und einfach nur die virtuellen Interfaces auf eine Bridge werfen will? Ganz einfach folgendes Script in der xend-config.sxp als vif-script eintragen und den xend neustarten. Ausserdem die gewünschte Bridge in der Konfiguration der Virtuellen Maschine eintragen.

In Verbindung mit fest vorgegebenen Interfacenamen in der Konfiguration kann man so eine statische iptables-Konfiguration hinbekommen, die sich nicht bei jedem Neustart einer Maschine ändert.

#!/bin/bash
#
# Routerlab XEN-Vif-To-Brige script rxvtbs
# 

dir=$(dirname "$0")
. "$dir/vif-common.sh"

bridge=${bridge:-}
bridge=$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")

if [ -z "$bridge" ]; then
     fatal "Could not find bridge: none was specified"
fi

case "$command" in
    online)
        log debug "vif-dummy adding $vif to $bridge."
        setup_bridge_port "$vif"
        add_to_bridge "$bridge" "$vif"
        ;;

    offline)
        log debug "vif-dummy removing $vif from $bridge."
        do_without_error brctl delif "$bridge" "$vif"
        do_without_error ifconfig "$vif" down
        ;;
esac

log debug "Successful vif-dummy $command for $vif."

if [ "$command" = "online" ]
then
  success
fi

Bei der freitagsrunde betreiben wir mittlerweile eine ansehnliche Zahl virtueller Maschinen auf xen-Basis. In den letzen Wochen hatten wir allerdings verstärkt mit korrupten Dateisystemen zu kämpfen.

Die Symptome: Aus heiterem Himmel ist das Dateisystem read-only und ein fsck findet eine Menge Fehler. Meist sind die Dateien kaputt, auf die zuletzt zugegriffen wurde. Es verschwindet aber durch den fsck durchaus auch mal der /sys Mountpoint. In lost+found taucht nicht auf, dafür in dmesg:

[   40.460059] EXT4-fs error (device xvda2): ext4_mb_generate_buddy: EXT4-fs: group 36: 24445 blocks in bitmap, 24418 in gd
[   40.460085] Aborting journal on device xvda2-8.
[   40.460307] EXT4-fs error (device xvda2): ext4_journal_start_sb: Detected aborted journal
[   40.460322] EXT4-fs (xvda2): Remounting filesystem read-only
[   40.460765] EXT4-fs (xvda2): Remounting filesystem read-only
[   40.461477] EXT4-fs error (device xvda2) in ext4_reserve_inode_write: Journal has aborted
[   40.461491] EXT4-fs error (device xvda2) in ext4_reserve_inode_write: Journal has aborted
[   40.461501] EXT4-fs error (device xvda2) in ext4_ext_remove_space: Journal has aborted
[   40.461514] EXT4-fs error (device xvda2) in ext4_reserve_inode_write: Journal has aborted
[   40.461524] EXT4-fs error (device xvda2) in ext4_ext_truncate: Journal has aborted
[   40.461537] EXT4-fs error (device xvda2) in ext4_reserve_inode_write: Journal has aborted
[   40.461547] EXT4-fs error (device xvda2) in ext4_orphan_del: Journal has aborted
[   40.461558] EXT4-fs error (device xvda2) in ext4_reserve_inode_write: Journal has aborted

Wir dachten zunächt daran, auf ext3 umzusteigen, doch auch das führte zu ähnlichen Fehlern. (Neues FS angelegt, rsync der Dateien, fsck ohne Fehler in der dom0, in der domU wieder: crash)

Natürlich waren die mysql-Tabellen beschädigt. Der Versuch diese per myisamchk zu reparieren reproduzierte dann stets das obige Fehlerbild. In einem chroot auf der dom0 gemounted funktionierte alles, in der domU nicht. Jeder Zugriff auf die ‚beschädigte‘ myi-Datei innerhalb der domU lies das Dateisystem sofort in sich zusammenfallen.

Letztlich geholfen zu haben scheint ein Update des kernels auf 3.2.0-3-amd64 aus wheezy.

 

Dieser Artikel erklärt die Installation von zentyal, einem Linux Small Business Server in eine xen Instanz.

Da der Zentyal kernel 2.6.32-38-generic von Zentyal 2.2-2 kein xen-kernel ist, müssen wir die initrd des Installers anpassen und die passenden Kernelmodule hinzufügen.

Ausserdem gilt es die korrekte kernel commandline zu nutzen,  damit das preseed file der Ubunut-Installation zum Tragen kommt. (mehr …)

Bei der Software BackupPC handelt es sich um ein feines Tool zum Sichern von Rechnern, nicht nur PC’s.

Man sollte sich also weder vom Namen noch dem Logo abschrecken lassen. (mehr …)

Heute morgen um 4 Uhr bemerkten wir die erste unschöne Überraschung mit Emma. Sie hat in den Flur gemacht.

Hier der Tip für alle Neukatzenhalter: In einem Badezimmer ohne Fenster reicht nachts das indirekt reflektierte  Straßenlicht wohl nicht ganz aus.  Die restliche Wohnung ist hell genug, aber im Klo will die Katze ihr Geschäft vergraben.

Wir probieren es dann mal mit einer LED-Lampe und Bewegungsmelder. Aber keine Angst, ich werde meiner Katze keinen Palast mit Wärmelampe bauen.

Auch dieses Blog bleibt nicht verschont – es wird in nächster Zeit mit Katzenbildern und Geschichten geflutet werden.

Der Grund: Seit vergangenem Sonntag lebt Emma bei uns, die allergiebedingt ein neues Zuhause gesucht hat.

Hier also, liebes Internet, ist Emma. Behandelt sie nett, sie ist eine ganz schüchterne. Noch. Und weil das Blog noch nicht umgezogen war hier eine Zusammenfassung der letzten Tage. Wem es zu lang zu lesen ist, die Kurzform lautet einfach: Es ist ein Abenteuer, aber ein schönes!
Foto von Emma, der Katze
(mehr …)

Alle die via meinem blogger-Link hierher kommen: Herzlich Willkommen!

Mein  Blog liegt also nicht mehr bei blogger google. Das hat aber erstmal nichts mit einer google-Ablehnung oder Angst zu tun. Schließlich ist alles, was ich verblogge, ohnehin öffentlich. Aber ich möchte meine Abhängigkeit von externen Diensten einschränken.

Jemand der seine eigenen Server betreibt um dort eigene Mailserver und sein eigenes DNS betreiben, sollte vielleicht auch ‚privat‘ auf eigenen Füßen stehen. Und dies ist der Versuch dazu.

Ich verliere jetzt zwar in Bezug auf ‚SEO‘, aber das ist dann halt so. Wenn ich bei blogger etwas geschrieben habe, konnte ich es nach wenigen Sekunden bereits bei google finden, und im Pagerank waren die Artikel auch immer oben.

Aber damit ist jetzt nach knapp 10k Page views Schluss 😉

Nachdem in letzter Zeit immer und immer wieder Webseiten vor allem dadurch auffallen, dass sie Passwörter im Klartext speichern, hier zwei Funktionen aus der User-Klasse eines meiner letzten Projekte…

Übrigens: Wenn Ihr bei Klick auf ‚Passwort vergessen‘ von einer Webseite das Passwort im Klartext per Email zugesendet bekommt, macht man dort genau das falsch. Schaut dann mal in deren AGB oder Datenschutzbestimmung, ob sie dort behaupten die Passwörter zu hashen. Oft sind die nur Copy&Paste. Und bittet sie das Verfahren umzustellen. Oder schreibt Heise.

Der Code

Für die meisten Probleme gibt es Standards, so auch für das Passwort-Hashing. Es gibt also keinen Grund sich selbst mit Funktionen wie (der nicht mehr zu benutzenden) md5() und String-Operationen seine eigene crypt-Funktion zu schreiben.

Hier nun also eine Lösung mit php, weil die grade hier rumlag.

    /* Code Licence: Public Domain
     *
     * $this->pwhash wird in der DB gesichert bzw. daraus gelesen.
     * die Konfiguration in $_CONFIG sieht z.B. so aus:
     *
     * // Hier ist ein zufälliger Wert pro Webseite einzutragen:
     * $_CONFIG["pw_sitekey"]="897a-d21lk.a8q";
     * // Und hier der Hash-Also. sha1, sha512, NICHT md5!
     * $_CONFIG["pw_hashalgo"]="sha512";
     *
     */

    public function setPassword($password){
        global $_CONFIG;
        $site_key=$_CONFIG["pw_sitekey"];
        $algo=$_CONFIG["pw_hashalgo"];
        $nonce=uniqid();
        $hash = hash_hmac($algo, $password . $nonce, $site_key);
        $this->pwhash = $nonce.':'.$hash;
    }

    public function verifyPassword($password){
        global $_CONFIG;
        $site_key=$_CONFIG["pw_sitekey"];
        $algo=$_CONFIG["pw_hashalgo"];
        $nonce= strstr($this->pwhash, ':',TRUE);
        $hash = strstr($this->pwhash, ':',FALSE);
        $chash= ":".hash_hmac($algo, $password . $nonce, $site_key);
        return ($hash == $chash);
    }

Demo

Was kommt da nun also heraus? Dazu eine kleine Demo

        //Passwort
        $password="very secret";

        //Konfiguration:
        $site_key="12345";
        $algo="sha512";

        $nonce=uniqid();
        $hash = hash_hmac($algo, $password . $nonce, $site_key);
        $pwhash = $nonce.':'.$hash;

        //ausgabe zur Kontrolle
        echo "pwhash= $pwhash\n";

        //zu pruefendes Passwort:
        $check_password="very secret";

        $vnonce= strstr($pwhash, ':',TRUE);
        $vhash = strstr($pwhash, ':',FALSE);
        $chash= ":".hash_hmac($algo, $check_password . $vnonce, $site_key);

        if ($vhash == $chash){
            echo "passwords match!\n";
        }

Die Ausgabe bei übereinstimmenden Passwörtern:

pwhash= 50000b502b234:b038dfb61ba609604e7be78f3aa2cd84fb03970031f5e8d6f2eacc10542741dda5b7f41a716f3f78c305f6898d9b82838ce6b9df15dc94d00c37af393cc51de1
passwords match!

Passwort vergessen!

Wie setzt man das nun organisatorisch mit dem ‚Passwort vergessen‘ Link zusamen? Ganz einfach. Wenn die Nutzer ihr Passwort vergessen können sie sich an ihre Emailadresse einen Link zusenden, mit dessen Hilfe sie auf der Webseite ihr Passwort selbst zurücksetzen können. Der Link enthält dabei ein zufällig erzeugtes Token und verliert nach Benutzung (erfolgreiches Ändern des Passworts) seine Gültigkeit.

Nachtrag: Und natürlich sollte der Link wenn er nicht benutzt wurde nach X Tagen ebenfalls invalidiert werden.

Rumms!

Seit Jahren immer mal wieder versucht – heute geschafft 😉

(Also das Photo zu machen bei Gewitter, nicht den Fernsehturm zu treffen…)