Archive for the ‘Linux’ Category

Letzte Rettung von MySQL

Ich hatte heute wieder Spaß mit MySQL. Die InnoDB Tabelle einer Datenbank hat sich erfolgreich selbst zerstört. Das hat sich dahingehend geäußert, dass sich MySQL immer wieder neu gestartet hat. MySQL war leider nicht in der Lage die betroffene Tabelle selbst wieder her zu stellen.

Mit Hilfe von innodb_force_recovery kann man MySQL dazu bringen, dass es Tabellen wieder her stellt. Diese Option schreibt man einfach in die my.cnf. Er kann die Werte von 1 bis 6 annehmen. Je höher der Wert ist, desto höher ist die Wahrscheinlichkeit, dass die Tabelle wieder hergestellt werden kann. Aber Achtung: Je größer der Wert ist, desto mehr Daten kann MySQL beim Wiederherstellen zerstören. Es ist deswegen ratsam den Wert inkrementell zu erhöhen, dieses Vorgehen dauert evtl. länger, aber man geht nicht in Gefahr unnötig Daten zu verlieren.

noSQL Datenbanken

Ich arbeite inzwischen bei Unister als Junior Systemarchitekt. Zu meinen ersten Aufgaben hat gezählt eine Architektur für eine eine Datenbank zu schaffen, welche mit sehr hohen Schreibaufkommen zurecht kommt. Als Datenbank haben wir mongoDB benutzt. Dabei handelt es sich um eine noSQL-Datenbank. Diese Dazenbanken haben kein festes Datenbankschema.

Die ersten Ergebnisse waren sehr erschütternd. Die Schreibperformence war einfach zu gering. Da man bei mongoDB nichts konfigurieren kann (Im Vergleich zu klassischen Datenbanken, wie MySQL oder PostgreSQL) war ich erst einmal ratlos. Das ganze konnte mit Clustern nicht verbessert werden. Eine genaue Untersuchung der Applikation hat ergeben, dass die Daten synchron und damit blockierend geschrieben wurden. Nachdem die Inserts nicht blockierend und in Batches umgesetzt wurden konnte schon ein Performancesprung festgestellt werden. Das konnte weiter verbessert werden, als wir die einzufügenden Daten in der Applikation nach dem Index vorsortiert eingefügt haben. Die Ursache liegt darin, das die Datenbank den Batch schneller abarbeiten kann und weniger Operationen auf dem Index nötig sind.

Zum Schluss möchte ich noch ein paar Worte zum Clustern von mongoDB verlieren. Es wird alles mitgebracht um schnell einen Cluster aufzusetzten. Ich habe es es leider geschafft, durch den Absturz von einem Knoten, den gesamten Cluster zu zerstören. Also sollte man bei Wichtigen Daten für Redundanz im Cluster sorgen. Es gibt auch viele Mittel in mongoDB um diese Redundanz zu erreichen.

verschlüsselte Volumes bequem mounten

Ich habe mein home verschlüsselt. Dieses wird automatisch, beim anmelden gemountet. Da ich in mein home noch ein paar andere verschlüsselte Dateisysteme einhänge funktionieren die Standard-Mittel, wie /etc/crypttab nicht. Dabei ergibt sich das folgende Problem: Die Volumes werden beim booten eingehangen und zu diesen Zeitpunkt existiert mein home noch nicht.

Da ich faul bin möchte ich auch möglichst wenig Passwörter eingeben, weiterhin soll meine Freundin auch den Rechner anmachen können und nicht an meinen Passwort scheitern. Deswegen wird nur mein home via Passwort entschlüsselt, für die anderen Dateisysteme kommen key-files zum Einsatz. Diese liegen in meinen verschlüsselten home.

Da ich mir selbst nicht vertraue, möchte ich den sudo-Mechanismus oder suid-Bits nicht benutzten. Deswegen habe ich mir die beiden Skripte cryptdisks_start und cryptdisks_stop genauer angesehen. In einen ersten Schritt habe ich mir eine /etc/user_crypttab erzeugt.

root@walhalla ~ # cat /etc/user_crypttab
# definition             volume                        key                                   options      mountpoint                mountoptions
data--group-video_crypt  /dev/mapper/data--group-video /home/rennecke/key-files/video-key    luks         /home/rennecke/Videos     noatime

Die ersten vier Parameter entsprechen denen, der crypttab, mountpoint und mountoptions sind entsprechen den gleichnamigen Optionen von mount.

Mein user_cryptdisks_start-Skript sieht wie folgt aus:

#!/bin/sh
 
# user_cryptdisks_start - wrapper around cryptsetup which parses
# /etc/user_crypttab, just like mount parses /etc/fstab.
 
# Initial code stolen from cryptdisks_start by Jon Dowland <jon@alcopop.org>
# Copyright (C) 2011 by Michael Rennecke <michael_rennecke@gmx.net>
# License: GNU General Public License, v2 or any later
# (http://www.gnu.org/copyleft/gpl.html)
 
CRYPTTAB="/etc/user_crypttab"
 
set -e
 
if [ $# -lt 1 ]; then
	echo "usage: $0 <name>" >&2
	echo >&2
	echo "reads $CRYPTTAB and starts the mapping corresponding to <name>" >&2
	exit 1
fi
 
. /lib/cryptsetup/cryptdisks.functions
 
INITSTATE="manual"
DEFAULT_LOUD="yes"
 
if [ -x "/usr/bin/id" ] && [ "$(/usr/bin/id -u)"  != "0" ]; then
	log_warning_msg "$0 needs root privileges"
	exit 1
fi
 
log_action_begin_msg "Starting crypto disk"
mount_fs
 
 
count=0
tablen="$(egrep -vc "^[[:space:]]*(#|$)" "$CRYPTTAB")"
egrep -v "^[[:space:]]*(#|$)" "$CRYPTTAB" | while read dst src key opts mnt mopts; do
	count=$(( $count + 1 ))
	echo ""
	if [ "$1" = "$dst" ]; then
		ret=0
		handle_crypttab_line_start "$dst" "$src" "$key" "$opts" <&3 || ret=$?
		echo ""
		fsck -pv /dev/mapper/$dst
		echo ""
		mount -o $mopts /dev/mapper/$dst $mnt
	elif [ $count -ge $tablen ]; then
		ret=1
		device_msg "$1" "failed, not found in user_crypttab"
	else
		continue
	fi
	umount_fs
	log_action_end_msg $ret
	exit $ret
done 3<&1

Zum Schluss noch mein user_cryptdisks_stop-Skript:

#!/bin/sh
 
# user_cryptdisks_stop - wrapper around cryptsetup which parses
# /etc/user_crypttab, just like mount parses /etc/fstab.
 
# Initial code stolen from cryptdisks_stop by Jonas Meurer <jonas@freesources.org>
# Copyright (C) 2011 by Michael Rennecke <michael_rennecke@gmx.net>
# License: GNU General Public License, v2 or any later
# (http://www.gnu.org/copyleft/gpl.html)
 
CRYPTTAB=/etc/user_crypttab
 
set -e
 
if [ $# -lt 1 ]; then
	echo "usage: $0 <name>" >&2
	echo >&2
	echo "reads $CRYPTTAB and stops the mapping corresponding to <name>" >&2
	exit 1
fi
 
. /lib/cryptsetup/cryptdisks.functions
 
INITSTATE="manual"
DEFAULT_LOUD="yes"
 
if [ -x "/usr/bin/id" ] && [ "$(/usr/bin/id -u)"  != "0" ]; then
	log_warning_msg "$0 needs root privileges"
	exit 1
fi
 
log_action_begin_msg "Stopping crypto disk"
echo ""
 
count=0
tablen="$(egrep -vc "^[[:space:]]*(#|$)" "$CRYPTTAB")"
egrep -v "^[[:space:]]*(#|$)" "$CRYPTTAB" | while read dst src key opts mnt mopts; do
	count=$(( $count + 1 ))
	if [ "$1" = "$dst" ]; then
		umount $mnt
 
		ret=0
		handle_crypttab_line_stop "$dst" "$src" "$key" "$opts" <&3 || ret=$?
	elif [ $count -ge $tablen ]; then
		ret=1
		device_msg "$1" "failed, not found in user_crypttab"
	else
		continue
	fi
	log_action_end_msg $ret
	exit $ret
done 3<&

Die beiden Skripte kann nun root ausführen, um Dateisysteme einzuhängen. Bei jeden einhängen wird geschaut, ob ein fsck nötig ist. Mein Dank gilt meet-unix, er hat stand mit mit Rat zu Seite, da ich noch etwas Solaris-geschädigt bin. Anmerkungen, bitte als Kommentar hinterlassen.

Cloud Computing

Ich höre immer öfter von Cloud Computing. Jedes mal hört sich das ganze wie eine ganz neue Idee an. Dabei ist Cloud Computing, nach meiner Ansicht, ein alter Hut. Dieser hat bestimmt schon 50 Jahre auf dem Buckel. Was man unter Cloud Computing versteht kann nachlesen. Was ist aber der eigentliche Kern hinter der ganzen Geschichte?

Beim   Cloud Computing werden Rechen-, Speicherkapazitäten oder Dienste dynamisch zur Verfügung gestellt. Diese Kapazitäten und Dienste werden in der Regel über ein Netzwerk zugänglich gemacht. Auf den Mainframes der 1960er Jahre wurden auch Dienste und Ressourcen dynamisch angeboten und verwaltet. Die Rechenzeit wurde zum Teil auch bei den verschiedenen Kostenstellen gebucht. Auf diese Weise kann man auch aktuelle Enterprise-Server bzw. Mainframes ansetzten und dabei die Hardware dynamisch partitionieren.  Wo ist nun der Unterschied, ob man 4 volle Racks hat oder nur einen großen Rechner (1960 oder heute)?

Der Unterschied zu 1960 ist, das man seit einigen Jahren vorkonfiguriertes Blech mit entsprechenden Diensten kaufen kann. Ich habe den Vorteil, das ich auf das Blech und dem Dienst Garantie bekommen kann. Weiterhin gibt es Dienstleister, welche einen Dienste anbieten. Als Kunde muss man sich nicht mehr mit der Hardware belasten. Es ist aber durchaus interessant  im eigenen Rechenzentrum eine private Cloud zu betreiben. So kann man schnell auf sich änderte Bedingungen  reagieren.

Wenn ich es genau nehme, dann betreibe zu Hause meine eigene Cloud. Das Herzstück ist walhalla, auf ihn läuft ein Solaris 11 Express Edition. In dem Rechner sind einige Festplatten. Wenn ich etwas ausprobiere, dann erstelle ich schnell eine  Zone oder setzte mit VirtualBox ein Linux auf. Je nach dem was ich mache, erzeuge ich mir eine maßgeschneiderte Umgebung. Einige werden sich fragen, wozu der ganze Aufwand. Die Antwort ist ganz einfach: Es ist möglich und es macht mir Spaß. Den größten Mehrgewinn sehe ich darin, das ich mein System sauber halte. Denn ich weiß für was welche Zone gut ist.

P.S.: Ich habe 1960 gewählt, weil mir nichts besseres eingefallen ist.

CF-Karten mounten

Wie ihr gelesen habt, bin ich unter die Digitalfotografen gegangen. Nun weiß ich endlich wozu der CF-Slot in meinen Notebook gut ist. Da muss man Compact Flash-Karten hineinstecken und solche stecken in meiner Kamera. Das dumme ist nur, dass mein Debian die CF-Karten nicht automatisch mountet. Zuerst habe ich nachgesehen, welches Device die CF-Karten haben. Anschließend erstellt man ein Verzeichnis in das die CF-Karten gemountet werden sollen.

rennecke@trantor ~ % blkid
/dev/sda1: UUID="5C8CF5697CA93BD8" TYPE="ntfs"
/dev/sda5: UUID="f1b2836f-81bf-4f75-9ae0-f2c284871891" TYPE="swap"
/dev/sda6: LABEL="debian-root" UUID="c00a4da53-1763-42e1-878d-3e096cad760b" TYPE="ext4"
/dev/sda7: UUID="60eca5b7-09ef-4b82-bf59-1a8360c8c6c1" TYPE="crypto_LUKS"
/dev/mapper/home: UUID="6cbebba6-e725-4549-bafe-8809ff73f27f" TYPE="ext4"
/dev/hda1: SEC_TYPE="msdos" LABEL="EOS_DIGITAL" TYPE="vfat"
rennecke@trantor ~ % su
Passwort:
root@trantor /home/rennecke $ mkdir /media/flash

Nun weiß ich, dass meine CF-Karten das Device /dev/hda1 haben. Nun füge ich die folgende Zeile der /etc/fstab hinzu:

/dev/hda1       /media/flash    auto        rw,user,noauto,exec     0       0

Nun kann man als normaler User mittels

rennecke@trantor ~ % mount /media/flash
rennecke@trantor ~ % umount /media/flash

die CF-Karte mounten und abmounten. Alternativ kann man das ganz nun auch grafisch mounten. Wo man klicken muss hängt vom Window-Manager ab.