yet another useless homepage

We don't cut. We expand.

Friday June 24, 2011
von Stephan
Keine Kommentare

Sendmail und Google Apps unter CentOS 5

Meine E-Mails werden von Google (Apps, nicht das normale Mail) versendet und empfangen, da möchte ich auch meinen neuen vServer so einrichten, dass er E-Mails mit dem SMTP-Server von Google versenden kann.

Nach ein paar Anfangsschwierigkeiten und vielen verschiedenen Anleitungen hat dieser französischer Eintrag letztlich geholfen, sendmail korrekt einzurichten.

Ein minimales CentOS 5.5 mit korrekt gesetzten Hostname (FQDN mit einer per DNS auflösbaren Domain) war die Voraussetzung für die folgenden Schritte:

Zunächst müssen mittels yum ein paar Pakete installiert werden (nicht alle sind für die Einrichtung des Relay notwendig, aber da es sich bei meinem Server um ein Minimalsystem handelt, benötige ich sie sowieso für alle möglichen Gelegenheiten):

-bash-3.2# yum -y install vim-enhanced wget mlocate sudo sendmail sendmail-cf man telnet cyrus-sasl-plain passwd mlocate sudo openssh openssl make gcc cyrus-sasl cyrus-sasl-plain

Der nächste Schritt ist, die notwendigen Zertifikate nach /usr/share/ssl/certs zu kopieren bzw. dort zu erstellen. Die Zertifikate sind zehn Jahre lang gültig, bei Bedarf kann man natürlich auch kleinere Werte als 3650 Tage wählen.

-bash-3.2# mkdir -p /usr/share/ssl/certs
-bash-3.2# cd /usr/share/ssl/certs
-bash-3.2# cp /etc/pki/tls/certs/ca-bundle.crt /usr/share/ssl/certs/
-bash-3.2# openssl req -new -x509 -keyout cakey.pem -out cacert.pem -days 3650
-bash-3.2# openssl req -nodes -new -x509 -keyout sendmail.pem -out sendmail.pem -days 3650

Anschließend werden die Zugangsdaten in der Datei /etc/mail/authinfo angelegt:

-bash-3.2# vi /etc/mail/authinfo

Der Inhalt der Datei sieht dann in etwa so aus (die Platzhalter in müssen durch die tatsächliche E-Mail-Adresse bzw. das Klartext-Passwort ausgetauscht werden:

AuthInfo:smtp.gmail.com "U:root" "I:<appsexample.com>” “P:“ “M:PLAIN”@
AuthInfo:smtp.gmail.com:587 "U:root" "I:<appsexample.com>” “P:“ “M:PLAIN”@

Die Authinfo-Datei wird nunmehr gehasht und die Dateiberechtigung angepasst:

-bash-3.2# makemap hash /etc/mail/authinfo < /etc/mail/authinfo
-bash-3.2# chmod 600 /etc/mail/authinfo

Die Datei /etc/mail/sendmail.mc muss ebenfalls noch angepasst werden. Vor der ersten Zeile, die mit MAILER beginnt, müssen diese Zeilen eingefügt werden:

FEATURE(`authinfo',`hash /etc/mail/authinfo.db')
define(`SMART_HOST',`smtp.gmail.com')dnl
define(`RELAY_MAILER_ARGS', `TCP $h 587')
define(`ESMTP_MAILER_ARGS', `TCP $h 587')
define(`confCACERT_PATH',`/usr/share/ssl/certs')
define(`confCACERT',`/usr/share/ssl/certs/ca-bundle.crt')
define(`confSERVER_CERT',`/usr/share/ssl/certs/sendmail.pem')
define(`confSERVER_KEY',`/usr/share/ssl/certs/sendmail.pem')
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')
define(`confAUTH_OPTIONS', `A')dnl

Nun noch die Änderungen wirksam werden lassen und sendmail neu starten (bzw. bei jedem Neustart automatisch starten lassen):

-bash-3.2# cd /etc/mail
-bash-3.2# m4 sendmail.mc > sendmail.cf
-bash-3.2# /sbin/service sendmail restart
-bash-3.2# /sbin/chkconfig sendmail on

Das Verschicken einer Testmail dürfte nun funktionieren (als Beispiel wird der Inhalt der Datei /etc/hostname per E-Mail an eine funktionierende Adresse versendet):

-bash-3.2# sendmail -v mailexample.com < /etc/hostname@

Sunday November 21, 2010
von Stephan
Keine Kommentare

Schneller, Apache, schneller!

Es gibt zahlreiche Tips, wie man die eigene Webseite beschleunigen kann. Spätestens seit bekannt ist, dass der eigene Page-Rank (die Bewertung einer Seite durch Google) unter anderem an der Ladegeschwindigkeit einer Site gemessen wird, interessieren sich nicht nur technikverliebte Geeks für das Thema.

Meine Webseite habe ich in den letzten Tagen ebenfalls eingehend mit YSlow und Firebug unter die Lupe genommen. Einige der Tips zur Verbesserung der Ladegeschwindigkeit lassen sich mit ein paar recht einfachen Einstellungen in der httpd.conf (der Konfigurationsdatei des Webservers Apache) umsetzen.

Für wiederkehrende Besucher ist es zumeist sinnvoll, bei häufig besuchten Seiten bereits abgerufene Resourcen im Zwischenspeicher aufzubewahren. Apache ist in der Lage, sogenannte ETags zu generieren, die einem Browser mitteilen, ob eine Datei sich verändert hat. Generell gibt es aber auch eine Performance-freundlichere Lösung hierzu: Cache-Control.

In der httpd.conf empfiehlt es sich entsprechend, die ETags auszuschalten und statt dessen pro Dateityp unterschiedliche Cache-Lebensdauern zu definieren:

Header unset Etag
FileETag none
# 480 Wochen
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>
# 2 Tage
<FilesMatch "\.(xml|txt)$">
Header set Cache-Control "max-age=172800, public, must-revalidate"
</FilesMatch>
# 2 Stunden
<FilesMatch "\.(html|htm)$">
Header set Cache-Control "max-age=7200, must-revalidate"
</FilesMatch>

Eine weitere Möglichkeit, die Auslieferung von Webseiten zu beschleunigen, liegt darin, Inhalte auf dem Server mittels gzip zu komprimieren und im Browser wieder zu dekomprimieren. Da in der Regel nicht die CPU-Leistung, sondern die Geschwindigkeit der Netzwerkleitung den Flaschenhals bildet, können häufig alle Arten von Inhalten durch die Nutzung von mod_deflate zur Beschleunigung der Seite konfiguriert werden.

SetInputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/rtf
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom+xml
AddOutputFilterByType DEFLATE application/rdf+xml
AddOutputFilterByType DEFLATE application/postscript
AddOutputFilterByType DEFLATE application/msword
AddOutputFilterByType DEFLATE application/vnd.ms-excel
AddOutputFilterByType DEFLATE application/vnd.ms-powerpoint
AddOutputFilterByType DEFLATE image/svg+xml
AddType image/svg+xml .svg

Thursday August 5, 2010
von Stephan
Keine Kommentare

Quickly change bash environment variables using files

Nachdem ich jetzt tagelang versucht habe mich zu erinnern, wie der nette Oracle-Consultant das Wunder bewerkstelligt hat, unzählige Umgebungsvariablen mit einem simplen Befehl zu setzen, bin ich endlich fündig geworden.

Um Oracle-Systeme zu warten, ist es bisweilen notwendig, zum Beispiel die Umgebungsvariable $ORACLE_SID anzupassen. Oder den Pfad. Oder das Prompt (damit man weiß, welche SID man gerade bearbeitet).
Der findige Oracle-Consultant hat mir dazu ein paar Dateien in der Art env.SID hinterlassen. Deren Inhalt ist im wesentlichen unspektakulär:

env.infra (Es handelt sich um Node 2 eines RAC)

PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/oracle/bin
   export PATH
ORACLE_HOME=/opt/oracle/gridinfra
   export ORACLE_HOME
ORACLE_SID=+ASM2
   export ORACLE_SID
PATH=${ORACLE_HOME}/bin:$PATH
   export PATH
PS1="$LOGNAME@`uname -n| cut -f1 -d.`[INFRA]> "
   export PS1

env.MYSID2

PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/oracle/bin
   export PATH
ORACLE_HOME=/ora/product/rdbms11.2
   export ORACLE_HOME
ORACLE_SID=MYSID2
   export ORACLE_SID
PATH=${ORACLE_HOME}/bin:$PATH
   export PATH
PS1="$LOGNAME@`uname -n| cut -f1 -d.`[$ORACLE_SID]> "
   export PS1

Der Trick besteht nun darin, diese Dateien zu sourcen:

$ . env.infra

Dank dieses Blogeintrags werde ich das hoffentlich nie mehr vergessen. Übrigens ist der Titel in englischer Sprache, da ich in Google keine relevanten Treffer finden konnte, weder in deutsch noch in englisch.

Sunday July 18, 2010
von Stephan
4 Kommentare

Downgrade iPod Touch 2G von iOS 4 auf iOS 3.1.3 unmöglich

iOS 4 ist ja sicherlich toll, aber die Akkuleistung meines iPod Touch (2. Generation, 32 GB) ist seit dem Update deutlich schlechter geworden. Ein Downgrade ist allerdings nicht so einfach möglich.

Obwohl ich die IPSW-Datei (also die eigentliche Firmware) noch von früheren Updtes in meinen Backups gefunden habe (alternativ auch bei Felix Bruns zu finden), ist es nicht möglich, diese wieder auf den iPod aufzuspielen

Um die Firmware auf den iPod zu bekommen, kann man auf der Übersichtsseite des iPods in iTunes auf “Nach Update suchen” bei gedrückter Alt-Taste (unter Windows wäre das wohl Shift) die IPSW-Datei auswählen und los geht es. Dummerweise muss nach erfolgter “Aktualisierung” der iPod wiederhergestellt werden, wobei dann als einzige Option iOS 4 installiert wird.

Auch das Einrichten eines alternativen Anwenders oder der Trick über Windows unter Parallels hat nichts gebracht. Schade, denn ich hätte gerne auf die für mich irrelevanten Features von iOS4 verzichtet. Statt dessen habe ich meine WLAN-Keys, gespeicherten Spielstände und sonstigen Konfigurationsoptionen während des Experimentierens verloren.

Update:
Dank an Dennis, jetzt hat es doch geklappt. Leider klappt 3.1.3 nicht, aber immerhin die 3.1.2.
Die Kurzfassung:

  1. iPod Firmware 3.1.2 herunterladen
  2. iPod Touch 2G in den DFU-Modus versetzen (10 Sekunden beide Tasten gedrückt halten, wenn das Display dunkel wird für weitere 10 Sekunden nur den Home-Button drücken, so dass der Bildschirm dunkel bleibt, aber iTunes zum Wiederherstellen bereit ist)
  3. die /etc/hosts anpassen, indem die folgende Zeile hinzugefügt wird:
    74.208.10.249 gs.apple.com
  4. In iTunes mit gedrückter Alt-Taste auf Wiederherstellen klicken, 3.1.2-Firmware auswählen und aktualisieren.
  5. Fertig

Tuesday June 29, 2010
von Stephan
Keine Kommentare

Mini-Displayport mit Audioausgang

Mein neues MacBook Pro mit i5-Prozessor kann auch Ton über den Mini-Displayport ausgeben. Dafür muss man auch nicht zig Euros ausgeben, denn eine ganz einfache Lösung für nicht einmal 7 Euro bei Amazon hat bei mir hervorragend funktioniert. TV via HDMI-Kabel an den Adapter, in den Systemeinstellungen die Tonausgabe auf den Adapter geleitet und das VLC-Bild auf den rechten Monitor (also unseren Fernseher) geschoben. Fertig.

Tuesday June 22, 2010
von Stephan
Keine Kommentare

FreeNAS #6 - iSCSI

iSCSI erlaubt die Nutzung des SCSI-Protokolls via TCP. FreeNAS bietet eine eingebaute Unterstützung hierfür, jedoch gibt es ein paar prinzipielle Einschränkungen.

Als Target bezeichnet man die Serverseite, der Initiator ist der Client.
iSCSI stellt im Netz entweder ein Device (also eine Festplatte) oder eine Datei bereit, die vom Client als Laufwerk betrachtet werden. Die Partition einer Platte kann nicht als iSCSI Target verwendet werden. Die gleichzeitige Verwendung eines iSCSI Targets durch mehrere Clients ist nicht vorgesehen, bzw. wird durch Dateisysteme wie NTFS oder HFS gar nicht unterstützt.

Zur Nutzung einer kompletten Platte muss lediglich die entsprechende Platte (z.B. ad2) ausgewählt werden. Allerdings kann dann die Platte auch nicht teilweise für andere Zwecke genutzt werden.

Trotz etwas schlechterer Performance empfiehlt sich in diesem Fall die Verwendung einer Datei als iSCSI-Container. Eine 200GB große Datei lässt sich mit dem Befehl dd einfach und schnell erzeugen:

# dd if=/dev/zero of=templun3 count=0 obs=1 seek=200G

dd if=/dev/zero of=templun3 count=0 obs=1 seek=200G

Zunächst wird ein neuer Extent angelegt:

iSCSI Target add an Extent

Dann folgt das sogenannte Portal:

iSCSI Target add Portals

Der Initiator gibt an, aus welchem Netzwerk heraus das Target genutzt werden kann:

iSCSI Target add Initiators

Zur Authentifizierung wird ein einfacher Benutzer angelegt.

iSCSI Target add User

Als letztes folgt das eigentliche Target:

iSCSI Target add Target

In den Settings ist vor allem der Base Name relevant, alles andere kann bei den Standardeinstellungen belassen werden.

iSCSI Base Name

Extent und Target sollen bei richtiger Konfiguration in etwa so aussehen:

iSCSI Targets Overview

Um iSCIS unter Mac OS X nutzen zu können, reichen die Bordmittel leider nicht aus. Dafür gibt es ein kostenloses Hilfsprogramm namens globalSAN. Die Systemerweiterung funktioniert auch unter Mac OS X 10.6.4 einwandfrei:

globalSAN iSCSI als Systemerweiterung

Beim Hinzufügen eines Portals wird das Target automatisch angezeigt. Es kann ausgewählt und die Verbindung hergestellt werden:

iSCSI - globalSAN mit dem Portal verbinden und iSCSI kann genutzt werden

Da die Datei auf dem FreeNAS, welche die Grundlage des iSCSI-Laufwerks bildet, noch kein Dateisystem enthält, muss dieses nun zunächst initialisiert werden:

Medium kann nicht gelesen werden - Möchten Sie es initialisieren?

Im Festplattendienstprogramm wird das iSCSI-Target als eigenes Laufwerk dargestellt und kann beispielsweise mit HFS+ (Journaled) initialisiert werden:

Anzeige des iSCSI-Targets im Festplattendienstprogramm

Sobald die Formatierung erfolgt ist, fügt sich das Laufwerk in die Liste der verfügbaren angeschlossenen Geräte am Mac ein.

Das iSCSI-Target auf dem Desktop

Die Performance von iSCSI war überraschend gut, auch über WLAN, wo Werte bis zu 8,8 Megabyte pro Sekunde erzielt wurden:

iSCSI Netzwerkdurchsatz

Saturday June 19, 2010
von Stephan
Keine Kommentare

FreeNAS #5 - Performance

Das von mir eingesetzte System ist vergleichsweise leistungsschwach. Da die Festplatten via USB angeschlossen sind, darf man keine außergewöhnliche Leistung erwarten. Dennoch ist die Performance insgesamt deutlich schlechter, als bei einem direkten Anschluss der Platte an den USB-Port des Rechners.

Typischerweise kann man in etwa 20-25 MB/s bei Festplatten, die via USB 2.0 angeschlossen sind erwarten. Unabhängig ob AFP oder FTP (oder auf SFTP) als Protokoll verwendet werden, das Thinkpad X40 kommt mit der Western Digital 1TB Platte auf durchschnittliche 11,5 MB/s (und bleibt damit deutlich unter der theoretischen Übertragungsgrenze von Gigabit-Ethernet von 47-60 MB/s).

Throughput/Performance of FreeNAS using AFP/FTP

Es handelt sich bei der Installation um eine Standardkonfiguration ohne jegliche Anpassungen zur Performanceverbesserung. Das Forum bietet eine gute Anlaufstelle, um noch mehr Leistung aus FreeNAS herauszukitzeln.

Friday June 18, 2010
von Stephan
Keine Kommentare

FreeNAS #4 - Backups

Sobald Dateien durch FreeNAS gespeichert werden, sollte auch über das Thema Backup nachgedacht werden. Viele Anwender greifen beim Thema Datensicherung gerne auf implizite Lösungen wie RAID-1 oder gar ZFS zurück. Doch ein echtes vollwertiges Backup ist durch solche Strategien nicht zu ersetzen.

RAID-Lösungen sorgen dafür, dass Daten ausfallsicher gespeichert werden. Selbst wenn eine von mehreren Festplatten ausfällt, stehen die Daten weiterhin bereit. Gegen Datenverlust, der durch den “DAU”:http://de.wikipedia.org/wiki/Dümmster_anzunehmender_User hervorgerufen wurde, helfen sie gar nicht. Aufgrund des Netzwerkspeichers existiert kein Papierkorb, aus dem versehentlich gelöschte Dateien wiederhergestellt werden könnten.

Mein FreeNAS nutzt Rsync für die redundante Datenhaltung. Nachdem ich gute Erfahrungen mit rsnapshot für inkrementelle Backups und mehrere vollständige Datenbestände gemacht habe, wollte ich eine ähnliche Lösung implementieren.

rsnapshot synchronisiert mehrere komplette Backups, benötigt aber nicht für jedes Backup den tatsächlich belegten Speicher, sondern nutzt die unter Unix als Link bekannten Verknnüpfungen um Speicherplatz zu sparen. Im Ergebnis kann man so für jeden Tag der Woche ein komplettes Backup haben, wobei jeden Tag nur die Unterschiede zum Vortag gesichert werden. Eine ähnliche Lösung stellt übrigens Apples TimeMachine dar.

Gut versteckt im Forum von FreeNAS fand ich einen Beitrag über ein Shell-Skript mit ähnlicher Funktion wie rsnapshot. Da ich ein embedded FreeNAS nutze, habe ich das Programm unter /mnt/wdrive/system/rsnapshot.sh gespeichert.

FreeNAS Con for rsnapshot.sh

Die Syntax von rsnapshot.sh ist vergleichsweise einfach:

rsnapshot.sh <quellverzeichnis> <zielverzeichnis> <anzahl backups>

Will man die letzten 30 Tage als Backup vorhalten, dann kann dies anhand eines täglich ausgeführten Cron-Jobs erledigt werden:

FreeNAS Con for rsnapshot.sh

Es ist übrigens nicht notwendig, Rsync unter den Services zu aktivieren.

Code:
rsnapshot.sh