Mediawiki

Heute hab ich versucht das Mediawiki für die UnixRouter Seite zu installieren.
Bei der Installation beschwerte sich das Mediawiki dass das folgende SQL Script nicht ausgeführt werden kann:

CREATE TABLE `wikijob` (
`job_id` int(9) unsigned NOT NULL auto_increment,
`job_cmd` varchar(255) NOT NULL default '',
`job_namespace` int(11) NOT NULL default '0',
`job_title` varchar(255) binary NOT NULL default '',
`job_params` blob NOT NULL,
PRIMARY KEY (`job_id`),
KEY `job_cmd` (`job_cmd`,`job_namespace`,`job_title`)
) TYPE=MyISAM;

Die maximale Key länge darf laut der fehlermeldung 500 nicht überschreiten.
Wenn sich Key also aus job_cmd (255), job_namespache(11) und job_title(255) zusammensetzt, kann das auch nicht funktionieren.
Nach änderung von job_title und job_cmd auf 240 Zeichen, wurde die Tabelle angelegt.
Glücklicherweise stellt Mediawiki bei der Installation fest das die Tabelle schon existiert, und legt sie nicht erneut an.
Bleibt nur noch abzuwarten ob die Änderung später Probleme macht.

Leider konnte ich die Installation trotzdem nicht fortsetzen, da g4w PHP Scripte auf 8 MB Speicher begrenzt, ich denke aber das auch dieses Problem bald gelösst ist.

unixrouter

Seit heute bin ich stolzer Besitzer der Domains unixrouter.de und unixrouter.org.
Auf diesen Seiten möchte ich ein Wiki installieren, was sich mit Routern/Firewalls beschäftigt die auf Unix oder Linux basieren.
Sowohl Howtos zum Router selbstbau, als auch links zu fertigen Router-Distributionen, wie ipcop soll man dort finden.
Momentan zeigen die Domains noch auf diesen WordPress Weblog, ich halte euch auf dem laufenden.
unixrouter.org soll die Englische Version von unixouter.de werden. Ich überlege noch ob ich 2 getrennte Wikis installiere, oder ob ich das in eins Packe.

Leere Verzeichnisse finden

Zum aufräumen meiner mp3 Sammlung hab ich ein Python Script geschrieben, welches leere Verzeichnisse findet:

#!/usr/bin/python

from os import path, listdir
from sys import argv, stderr

count=0

def find(dr):
    global count
    count+=1
    stderr.write("\rscanned "+count.__str__()+" dirs\r")
    stderr.flush()
    try:
        filelist=listdir(dr)
        if len(filelist) == 0:
            print "\'"+dr+"\'"
    except:
        filelist=[]
        stderr.write("could not read " + dr + "\n")
        stderr.flush()
    for file in filelist:
        df=path.join(dr,file)
        if path.isdir(df):
            find(df)

try:
    find(argv[1])
except:
    pass

Automounter

Der Automounter bietet die Möglichkeit bei Zugriff auf ein Verzeichnis automatisch etwas in dieses zu mounten.
Das kann eine Partition sein, aber vor allem auch Netzwerk freigaben.

Zuerst installieren wir das Paket autofs, welches im Paketmanager jeder vernünftigen Distribution enthalten ist.

Debian legt die Configdateien nach /etc, gentoo nach /etc/autofs.

In die Datei auto.master schreiben wir z.B:

/network /etc/auto.network --ghost --timeout=300

Das besagt das /network von autofs verwaltet wird. Die Mountpoints stehen in /etc/auto.network. –ghost sorgt dafür das die Mountpoints angezeigt werden, und –timeout besagt wie lange der mount bestehen bleibt wenn nicht mehr darauf zugegriffen wird (in sekunden).

Die datei auto.network legen wir an und schreiben z.B das rein:

server -fstype=cifs,username=xy,password=yx \
://10.0.3.1/bla

distfiles -fstype=nfs 10.1.0.1:/distfiles

Nach neustart von autofs stehen nun die Verzeichnisse /network/server und /network/distfiles zur verfügung. Bei Zugriff auf die Verzeichnisse wird automatisch die entsprechende Freigabe gemountet, und 300 Sekunden nach Zugriff wieder ungemountet.

SSH Ohne Passwort

Möchte man ssh in Scripts verwenden, um Dinge zu automatisieren, stört das Passwort.
Natürlich währe es zu unsicher keine Authentifizierung zu verwenden.
Der richtige Weg arbeitet mit einem Public/Private Key Verfahren.
Diese erzeugen wir auf dem Client Rechner mit:
# ssh-keygen -t dsa
im verzeichniss ~/.ssh wird dann unter anderem die datei id_dsa.pub erzeugt.

dieser Public key wird beim server an die datei ~/.ssh/authorized_keys angehängt.
Das kann man z.B. so machen:
# cat ~/.ssh/id_dsa.pub | ssh zielrechner 'cat >> ~/.ssh/authorized_keys'

Fertig

Backups mit Rsync – Part 3: Vereinfachung per Script

Das Script:


#!/bin/sh

# Diese Verzeichnisse nicht sichern
EXCLUDE="/proc/**:/dev/**:/mnt/**:/sys/**"

# Diese Datei hier einfügen, hierüber kann z.B
# EXCLUDE verändert werden, oder DIR und
# DEST fest eingetragen werden
if [ -f /etc/rbackup ]; then
source /etc/rbackup
fi

# einige optionen setzen:
# -z Kompression verwenden
# -v Verbose
# -H Hardlinks beibehalten
# -S Sparse Files als Sparse Files Kopieren
# -h Human readable
# -i Mehr infos pro datei Anzeigen
# --numeric-ids Berechtigungen anhand von uid/gid
# nummern setzen, nicht anhand des Namens
# --progress Fortschritt anzeigen
# --stats Zusammenfassung am Schluss anzeigen
# --link-dest Siehe Part2
OPTS="$OPTS --link-dest=../latest -azvHShi \
--numeric-ids --progress --stats"

# Wenn Verzeichnisse per Komandozeile übergeben
# werden, dann bitte Source und Destination
# angeben
if [ -n "$*" ]; then
if [ -z "$2" ]; then
echo "Missing destination"
exit
fi
DIR="$1"
DEST="$2"
fi

# Wenn DIR/DEST nicht aus /etc/rbackup hervorgeht
# und nicht über die Komandozeile mitgegeben wurde
# Mekern und Beenden
[ -z "$DIR" ] && echo "Missing source dir" && exit
[ -z "$DEST" ] && echo "Missing destination dir" \
&& exit

# Datum Feststellen (2006-12-27_20-43)
DATE=`date +%Y-%m-%d_%H-%M`

# unser Zielverzeichnis zusammensetzen
DATEDEST="$DEST/$DATE"

## Da wir oben die Excludes so faul angegeben
## haben, müssen wie das hier etwas entfalten
# Altes Trennzeichen sichern
IFSBACK=$IFS
# Trennzeichen auf : setzen
IFS=":"
# Excludes zu den Optionen hinzufügen
OPTS="$OPTS `for dir in $EXCLUDE; \
do echo -n \"--exclude=$dir \" ; done`"
# Alte Trennzeichen wieder herstellen
IFS=$IFSBACK

# Source zu Optionen hinzufügen
OPTS="$OPTS $DIR"

# Destination zu Optionen hinzufügen
OPTS="$OPTS $DATEDEST"

echo "Starting rbackup"

# Anzeigen welches komando wir uns erspart haben
echo rsync $OPTS

# rsync aufrufen
rsync $OPTS

# Exit Status sichern
rok=$?

if [ "$rok" == "0" ]; then

echo "Backup complete, creating softlink"

# Wir erzeugen einen softlink, der immer auf das
# letzte backup zeigt, benötigt, damit wir mit
# --link-dest=../latest arbeiten können. Wir
# erzeugen den link lokal, und kopieren ihn zum ziehlverzeichnis
ln -s $DATE latest
rsync -a latest $DEST/
rm latest
echo "done"

else
echo "Something went wrong"
fi

Die Datei /etc/rbackup sieht bei mir so aus:


# Eigene Excludes setzen
EXCLUDE="proc/:sys/:tmp/"
EXCLUDE="$EXCLUDE:/mnt/network/:mnt/cdrom/:lost+found/"
EXCLUDE="$EXCLUDE:'*~'"

# Ziel setzen
DEST="micha-server:/freigaben/backup/laptop"

# Quelle Setzen
DIR="/"

Festplatte kapput -> Wlan geht nicht mehr

Nachdem mein Laptop heute auf einmal keine Wlan Keys mehr annehmen wollte, stellte sich heraus das meine Festplatte ausgerechnet an der Stelle einen Lesefehler hat, an dem ein für Wep benötigtes Crypto Kernel Modul liegt.

Hier der Auszug aus dmesg

Dec 25 22:59:09 micha-mobile ieee80211_crypt: registered algorithm 'WEP'
Dec 25 22:59:14 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:14 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=22
459325 22:59:14 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:14 micha-mobile end_request: I/O error, dev hda, sector 224593
Dec 25 22:59:19 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:29 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:29 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:34 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:34 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=22
4601
Dec 25 22:59:34 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:34 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:39 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:39 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=22
4601
Dec 25 22:59:39 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:39 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:39 micha-mobile Module len 8192 truncated
Dec 25 22:59:39 micha-mobile modprobe: WARNING: Error inserting crypto_algapi (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/c
rypto_algapi.ko): Invalid module format
Dec 25 22:59:39 micha-mobile modprobe: FATAL: Error inserting cryptomgr (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/cryptom
Dec 25 22:59:39 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=224601
Dec 25 22:59:39 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:39 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:39 micha-mobile Module len 8192 truncated
Dec 25 22:59:39 micha-mobile modprobe: WARNING: Error inserting crypto_algapi (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/crypto_algapi.ko): Invalid module format
Dec 25 22:59:39 micha-mobile modprobe: FATAL: Error inserting cryptomgr (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/cryptomgr.ko): Unknown symbol in module, or unknown parameter (see dmesg)
Dec 25 22:59:09 micha-mobile ieee80211_crypt: registered algorithm 'WEP'
Dec 25 22:59:14 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:14 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=22
459325 22:59:14 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:14 micha-mobile end_request: I/O error, dev hda, sector 224593
Dec 25 22:59:19 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:29 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:29 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:34 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:34 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=22
4601
Dec 25 22:59:34 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:34 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:39 micha-mobile hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Dec 25 22:59:39 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=22
4601
Dec 25 22:59:39 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:39 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:39 micha-mobile Module len 8192 truncated
Dec 25 22:59:39 micha-mobile modprobe: WARNING: Error inserting crypto_algapi (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/c
rypto_algapi.ko): Invalid module format
Dec 25 22:59:39 micha-mobile modprobe: FATAL: Error inserting cryptomgr (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/cryptom
Dec 25 22:59:39 micha-mobile hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=224604, high=0, low=224604, sector=224601
Dec 25 22:59:39 micha-mobile ide: failed opcode was: unknown
Dec 25 22:59:39 micha-mobile end_request: I/O error, dev hda, sector 224601
Dec 25 22:59:39 micha-mobile Module len 8192 truncated
Dec 25 22:59:39 micha-mobile modprobe: WARNING: Error inserting crypto_algapi (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/crypto_algapi.ko): Invalid module format
Dec 25 22:59:39 micha-mobile modprobe: FATAL: Error inserting cryptomgr (/lib/modules/2.6.19-gentoo-r2/kernel/crypto/cryptomgr.ko): Unknown symbol in module, or unknown parameter (see dmesg)
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_unregister_notifier
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_larval_error
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_register_notifier
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_register_instance
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_lookup_template
Dec 25 22:59:39 micha-mobile ieee80211_crypt_wep: could not allocate crypto API arc4
Dec 25 22:59:39 micha-mobile eth1: could not initialize WEP: load module ieee80211_crypt_wep
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_unregister_notifier
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_larval_error
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_register_notifier
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_register_instance
Dec 25 22:59:39 micha-mobile cryptomgr: Unknown symbol crypto_lookup_template
Dec 25 22:59:39 micha-mobile ieee80211_crypt_wep: could not allocate crypto API arc4
Dec 25 22:59:39 micha-mobile eth1: could not initialize WEP: load module ieee80211_crypt_wep

Hab direkt die hier bestellt:
http://www.alternate.de/html/productDetails.html?artno=AAAW09
wenigstens hab ich danach 3x so viel Platz, 40g waren so wie so viel zu wenig.

Backups mit Rsync – Part 2: Snapshots

Im ersten Teil haben wir nur ein Backup erstellt. Wen wir uns nun eine Datei überschrieben haben, und das erst merken, nachdem wir ein weiteres Backup erstellt haben, ist unsere Datei auch im Backup überschrieben worden.
Um das Problem zu lösen, müssen wir mehrere Backups machen, ein weiteres vollständiges Backup braucht sehr viel Platz. Ein inkrementelles Backup spart zwar den Platz, aber gelöschte Dateien werden nicht registriert und eine wiederherstellung ist mit viel suchen, oder Zusammenführen der Backups verbunden.
Rsync löst das Problem mit der Option --link-dest.

# rsync -a \
–-exclude=’/proc/**’ \
–-exclude=’/sys/**’ \
-–exclude=’/mnt/**’ \
-–exclude=’/tmp/**’ \
--link-dest='../laptop' \
/ server:/backups/laptop2

Rsync vergleicht nun vor der übertragung einer Datei, ob diese schon im Verzeichnis ‘../laptop’ vorhanden ist. Wenn die Datei vorhanden ist, wird die Datei nicht erneut kopiert, sondern stattdessen ein Hardlink zu der bereits vorhandenen Datei angelegt.
Der angegebene Pfad muss immer relativ zum Ziel angegeben werden.
Das Backup in laptop2 verhällt sich jetzt wie ein Vollständiges Backup, die Verzeichnisse laptop und laptop2 benötigen zusammen aber nur den Platz eines vollständigen, und eines inkrementellen Backups. Durch die Verwendung von Hardlinks kann das Verzeichnis laptop auch gelöscht werden, und laptop2 ist immer noch vollständig, da tatsächlich nur Daten gelöscht werden die sich im 2. Backup geändert haben.