Die Wolke in der eigenen Hand

Seit der iTunes-Version 11.2 und iOS 7.0.3 hat nun Apple das vollzogen, wovon ich nie gedacht hätte, dass es passieren würde. Man kann die Kalender- und Kontaktdaten nun nicht mehr lokal über WiFi oder USB zwischen Computer und iPhone/iPad synchronisieren. Stattdessen braucht man dazu seine Apple-ID um das über die iCloud abzugleichen. Aber die iCloud kommt für mich nicht in Frage, da die Daten nichts auf fremden Servern zu suchen haben, die zu allen Überfluss auch noch im Ausland stehen. Ich weis schliesslich nicht, ob sie dort auch verschlüsselt abgelegt werden und muss eventuell davon ausgehen, dass irgendwelche staatlichen Behörden auf diese Server zugriff haben. Deswegen habe ich nun beschlossen, einen meiner Raspberry Pi’s dazu zu nutzen und auf ihn ownClod installieren, der sicher in meiner eigenen Wohnung steht. Mit ihm werde ich meine Kalender- und Kontaktdaten über mein lokales Netz austauschen, währenddessen die Bilder-, Audio- und Applikationen sowieso ich über USB synchronisiere.

Raspberry Pi für ownCloud

Raspberry Pi für ownCloud

Anbei ein kleiner Workaround zur Installation von ownCloud.

Ich entscheide mich hierbei für den Webserver nginx, der wohl etwas Ressourcen schonender als der Apache-Webserver ist und flüssiger läuft.

Auf dem Server werden also folgende Komponenten zur ownCloud mit installiert:

  • nginx Webserver
  • PHP5
  • SQLite (Datenbank auf Dateibasis)
  • sowie diverse Pakete zum Performancegewinn

Nachdem man sich via http://www.raspbian.org/RaspbianInstaller mit den Raspbian-Installer ein Debian Weezy Grundsystem installiert hat, installiert man sich mit raspi-config ein sehr praktisches Konfigurationswerkzeug, um auf dem System ein paar grundlegende Einstellungen für das Gerät vorzunehmen.

sudo apt-get install raspi-config
sudo raspi-config
  1. change_locale zu „en_US.UTF-8“ für das komplette System (Ansonsten meckert ownCloud, dass es zu Fehlern bei Dateinamen mit Sonderzeichen kommen kann)
  2. memory_split auf „16“ MB einstellen. Dies ist die kleinst mögliche Einstellung. Die GPU bekommt somit 16MB.
  3. overclock auf „Medium“ 4. „Finish“ und danach die Frage nach dem Reboot mit „Yes“ beantworten.

Paketlisten aktualisieren

sudo apt-get update
sudo apt-get upgrade

Benutzer erstellen

sudo groupadd www-data
sudo usermod -a -G www-data www-data

Installation der Pakete

 sudo apt-get install nginx openssl ssl-cert php5-cli php5-sqlite php5-gd php5-curl php5-common php5-cgi sqlite php-pear php-apc curl libapr1 libtool curl libcurl4-openssl-dev php-xml-parser php5 php5-dev php5-gd php5-fpm memcached php5-memcache varnish

SSL Zertifikat erstellen (gültig für 1 Jahr)

sudo openssl req $@ -new -x509 -days 365 -nodes -out /etc/nginx/cert.pem -keyout /etc/nginx/cert.key
sudo chmod 600 /etc/nginx/cert.pem
sudo chmod 600 /etc/nginx/cert.key

nginx Webserver konfigurieren

sudo nano /etc/nginx/sites-available/default

Hier löscht man den kompletten Inhalt und fügt stattdessen den unten stehenden ein.
Darauf achten, dass man die IP-Adresse „192.168.XXX.XXX“ mit der des Raspberry Pi ersetzt.

server {
listen 80;
  server_name 192.168.XXX.XXX;
  rewrite ^ https://$server_name$request_uri? permanent;  # enforce https
}

server {
listen 443 ssl;
server_name 192.168.XXX.XXX;
ssl_certificate /etc/nginx/cert.pem;
ssl_certificate_key /etc/nginx/cert.key;
root /var/www;
index index.php;
client_max_body_size 1000M; # set maximum upload size
fastcgi_buffers 64 4K;


location ~ ^/owncloud/(data|config|\.ht|db_structure\.xml|README) {
  deny all;
}


location / {
  try_files $uri $uri/ index.php;
}

location @webdav {
  fastcgi_split_path_info ^(.+\.php)(/.*)$;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_param HTTPS on;
  include fastcgi_params;
}

location ~ ^(?.+?\.php)(?/.*)?$ {
  try_files $script_name = 404;
  include fastcgi_params;
  fastcgi_param PATH_INFO $path_info;
  fastcgi_param HTTPS on;
  fastcgi_pass 127.0.0.1:9000;
}
}

Danach in folgender Datei die Werte „upload_max_filesize“ sowie „post_max_size“ auf 1000M setzen.

sudo nano /etc/php5/fpm/php.ini
upload_max_filesize = 1000M
post_max_size = 1000M

Am Ende der Datei noch folgendes einfügen:

upload_tmp_dir = /srv/http/owncloud/data

Als nächstes muss folgender Ordner mit den dazugehörigen Rechten erstellt werden

sudo mkdir -p /srv/http/owncloud/data
sudo chown www-data:www-data /srv/http/owncloud/data

PHP konfigurieren

sudo nano /etc/php5/fpm/pool.d/www.conf

Hier ändert man folgende Zeile von:

listen = /var/run/php5-fpm.sock

zu

listen = 127.0.0.1:9000

Webserver und PHP neustarten

sudo /etc/init.d/php5-fpm restart
sudo /etc/init.d/nginx restart

ownCloud installieren
Als letztes wird ownCloud installiert. Folgende Befehle müssen abgearbeitet werden.

wget http://download.opensuse.org/repositories/isv:ownCloud:community/Debian_7.0/Release.key
apt-key add - < Release.key echo 'deb http://download.opensuse.org/repositories/isv:ownCloud:community/Debian_7.0/ /' >> /etc/apt/sources.list.d/owncloud.list
apt-get update
apt-get install owncloud

Nun lässt sich der Server im lokalen Netz aufrufen. In meinem Fall ist das https://192.168.1.104/owncloud. Als letztes muss nur noch ein Administratorkennwort und ein Benutzername festgelegt werden. Somit ist die Installation vollends abgeschlossen.

Der schnellste Weg, Adressbücher und Kalender in die eigene Wolke zu laden, führt über die Webanwendung von Owncloud, die Dateien im VCF- und ICS-Format importieren kann.

Bei Adressbüchern (.vcf) klappte der Import im Versuch allerdings nicht immer reibungslos. Bei einem Adressbuch, in dessen Feldern Doppelpunkte vorkamen, brach der Import leider ab. Im Zweifel muss man vor dem Import noch an den Daten feilen. Auch Gruppen ließen sich nicht importieren, da ownCloud sie als regulären Adressbuch-Eintrag interpretierte. Ein Fehler, der hoffentlich bald behoben wird.

Weiterführende Links:
Artikel bei iRights.info
Das Howto im RaspberryPi-Forum

Von Datenträgern und mit Lochkarten betriebenen Waschmaschine

Nicht all zu selten kommt es in meiner Peer-Group zu einer Diskussion über alte Speichermedien. Dann kommt es auch schnell zu den Aussagen, wer mit welchen Medium seine Computerkarriere begonnen hat. Es fallen dann Sätze wie: „Mein erster PC besaß nur eine zwei Gigabyte große Festplatte.“ oder „Ich habe meine Daten auf eine Datasette einst speichern müssen.“ Je nach Alter und vielleicht dem Einstiegsalter hat also jeder etwas andere Erfahrungen.

Der erste PC, der bei uns zu Hause stand, hatte anno 1991 auch nur eine 50 Megabyte große Festplatte und besaß sowohl ein 3,5 als auch ein Diskettenlaufwerk für die etwas wabbeligeren 5,25 Zoll großen Disketten. Aber meine eigene Computerkarriere begann schliesslich schon vorher mit dem DDR-Heimcomputer KC 85/4 von Robotron. Da wir mit beginnenden Besitz des Gerätes allerdings keinen Radiorekorder hatten, mit dem die Programme auf eine Kompaktaudiokasette als Datasette gespeichert werden können, mussten als Dauerspeicher die netten alten 7 Zoll Tonbänder herhalten. Da die zugehörigen Tonbandgeräte üblicherweise im Hausgebrauch für den senkrechten Betrieb gebaut wurden, hatte dies ein bisschen den Charme von Rechenzentren der 1960er und ’70er Jahre, wo große Magnetbänder im professionellen EDV-Betrieb üblich waren.

Eine etwas andere Begegnung hatte ich dann während meiner Ausbildung. Im zweiten Lehrjahr absolvierte ich in einem Betrieb mein Praktikum, wo ich gelegentlich große Filtersäcke mit einer auch ziemlich großen Industriewaschmachine waschen musste. Aber in Gegensatz zu den üblichen Waschmaschinen, bei denen man das Waschprogramm mit Druckknöpfen und Drehwählern einstellte, musste man das bei dieser mit Lochkarten machen. Die Karten bestanden allerdings nicht wie aus der EDV bekannt, aus Karton oder Pappe, da diese natürlich in einer feuchten Umgebung relativ schnell durchgeweicht gewesen wären. Sondern bestanden aus einem etwas weichen und flexiblen Kunststoff, damit sie auch nicht so schnell durchbrechen konnten. Das ganze war circa im Jahre 2001/2002.

Update 04. April 2021, 22:44 Uhr:

In der WRINT-Folge WR1014 war der Historiker Ilko-Sascha Kowalczuk zu Gast und sprach mit Holger Klein über seine Jugend in der DDR anlässlich seines im August 2019 erschienen Buch „Die Übernahme: Wie Ostdeutschland Teil der Bundesrepublik wurden“ (ISBN 978-3-406-74020-6). Dabei erzählt er etwas beiläufig, dass in der DDR die Tonbänder nur unwesentliche teurer waren als die Audiokassetten, aber eine bessere Tonqualität besaßen.

QBASIC Primzahlgenerator

Vor einer halben Ewigkeit hatte auch ich mich mal ein wenig mit der Programmiersprache BASIC auseinander gesetzt. Um genau zu sein, mit der Microsoft-Implementation QBASIC, die mit den DOS-Versionen 5 und 6.x kostenlos ausgeliefert wurde. Irgendwann bekam ich auch ein seinerzeit schon ein völlig veraltetes Lehrbuch zu QBASIC in die Hände, welchem eine Diskette mit Beispielprogrammen im Sourcecode beilagen. Eines davon war ein Generator für Primzahlen. Irgendwann hatte mir ein Bekannter geholfen, diesen Generator so auszubauen, dass er etwas flexibler mit den Start- und Endwerten war. Ein Riesen Nachteil von QBASIC zu dem etwas grösseren und kostenpflichtigen Quickbasic war, dass es keinen Compiler besass um aus dem Code einen direkten für die DOS-Shell ausführbaren Maschienencode zu erzeugen. Das erstellte Programm kann nur im BASIC-Interpreter selbst ausgeführt werden. Und so habe ich QBASIC und den Primzahlgenerator über die Zeit bis heute auf allen meinen Computerplattformen mit dem DOS-Emulator DOSBox mitgeschleift.

Neulich kam ich aber dann doch mal auf die Idee, dass man den Generator mit einer populäreren Sprache auf eine aktuelle Plattform implementiert. Der Hauptbewegpunkt dabei ist, dass der Generator so direkt die Rechenleistung des Computer nutzen kann und nicht noch eine Emulationsebene zwischen Programm und Hardware die ganze Geschichte ausbremst. Kurzum: so arbeitet er viel schneller.
Interessant war aber dann doch die Möglichkeit, welche Compiler und IDE’s es so gibt, die mit dem Q(uick)BASIC-Dialekt noch zurechtkommen und so ein Kompilat für ein aktuelles Mac OS, Linux oder Windows erstellen können. Hier bin ich mit QB64 fündig geworden. Es läuft auf allen diesen Plattformen, zuzüglich der Android-Plattform für Mobilgeräten.

Aber vielleicht werde ich mich dennoch mal hinsetzen und den Generator in einer aktuellen und populäreren Sprach wie zum Beispiel C, Erlang oder Python neu implementieren. Wobei letzteres nicht so toll performen wird, da Python eine Interpretersprache ist. Obwohl ich mir sicher bin, dass es da bereits Lösungen gibt.

Anbei hier der Sourcecode des Generator in QBASIC

Verschlüsselten USB-Stick mit Mac OS X erstellen

Da ein USB-Stick gerne mal verloren geht oder auch längere Zeit z.B. am Arbeitsplatz für jeden erreichbar liegt und entwendet werden kann (z.B. Mittagspause, Meetings), ist es nur von Vorteil wenn der USB-Stick verschlüsselt ist und somit nicht für andere einsehbar ist.

Hier gibt einem Apple seit Mac OS in der Version 10.7 Lion mit Core Storage eine nützliche Funktion in die Hand, verschlüsselte Partitionen auch auf externen Datenträgern zu erstellen, um sich vor ungewollter Einsicht in seine Daten zu schützen.

Korrektes Medium ermitteln

Im ersten Schritt muss das korrekte Medium ermittelt werden. Hier im Beispiel verwende ich meinen USB-Stick mit 64 MiB Kapazität, der unter /dev/disk2 angesprochen werden kann.

/dev/disk2
   #:                        TYPE NAME             SIZE       IDENTIFIER
   0:      FDisk_partition_scheme                 *65.9 MB    disk2
   1:                  DOS_FAT_32 NO_NAME          65.9 MB    disk2s1

CoreStorage logical volume group erstellen

Nun muss eine CoreStorage logical volume group erstellt werden.

sommteck:~ franky$  diskutil coreStorage create USB-Stick /dev/disk2
Started CoreStorage operation
Unmounting disk2
Repartitioning disk2
Unmounting disk
Creating the partition map
Rediscovering disk2
Adding disk2s1 to Logical Volume Group
Creating Core Storage Logical Volume Group
Switching disk2s1 to Core Storage
Waiting for Logical Volume Group to appear
Discovered new Logical Volume Group "EA1AFCC1-D33A-4948-B210-8A765E0BE902"
Core Storage LVG UUID: EA1AFCC1-D33A-4948-B210-8A765E0BE902
Finished CoreStorage operation

Die Core Storage LVG UUID sollte notiert werden, da diese für den nächsten Schritt in dem eine CoreStorage logical volume erstellt wird benötigt wird.

CoreStorage logical volume erstellen

In der CoreStorage logical volume group wird nun ein CoreStorage logical volume erstellt. Als UUID wird die vom vorherigen Befehl ausgegebene EA1AFCC1-D33A-4948-B210-8A765E0BE902 angegeben. Der Parameter jhfs+ steht für HFS+ mit Journaling, danach folgt der Name des Volumes und die Grösse (hier 100%). Der letzte Parameter -passphrase sorgt dafür, dass ein verschlüsseltes Volume angelegt wird. Das Passwort wird beim erstellen des Volumes eingegeben und wird immer abgefragt, wenn das Volume gemountet wird.

sommteck:~ franky$ diskutil coreStorage createVolume EA1AFCC1-D33A-4948-B210-8A765E0BE902 jhfs+ USB-Stick 100% -passphrase
Passphrase for new volume:
Confirm new passphrase:
Started CoreStorage operation
Waiting for Logical Volume to appear
Formatting file system for Logical Volume
Initialized /dev/rdisk3 as a 27 MB HFS Plus volume with a 512k journal
Mounting disk
Core Storage LV UUID: A1A760EF-AD75-44FB-948D-30D5A5978A72
Core Storage disk: disk3
Finished CoreStorage operation

Einstellungen prüfen

sommteck:~ franky$ diskutil coreStorage list
CoreStorage logical volume groups (2 found)
|
+-- Logical Volume Group ...
|   =========================================================
|   Name:         ...
|
|   ...

|
|
+-- Logical Volume Group EA1AFCC1-D33A-4948-B210-8A765E0BE902
    =========================================================
    Name:         USB-Stick
    Sequence:     2
    Free Space:   0 B (0 B)
    |
    +- Logical Volume Family C1410A87-179F-4085-BDEF-51017F06C5B3
        ----------------------------------------------------------
        Sequence:               2
        Encryption Status:      Unlocked
        Encryption Type:        AES-XTS
        Encryption Context:     Present
        Conversion Status:      NoConversion
        Has Encrypted Extents:  Yes
        Conversion Direction:   -none-
        |
        +-> Logical Volume A1A760EF-AD75-44FB-948D-30D5A5978A72
            ---------------------------------------------------
            Disk:               disk3
            Status:             Online
            Sequence:           2
            Size (Total):       28065792 B (28.1 MB)
            Size (Converted):   -none-
            Revertible:         No
            LV Name:            USB-Stick
            Volume Name:        USB-Stick
            Content Hint:       Apple_HFS

Wie an Has Encrypted Extents: YES zu erkennen ist, wurde erfolgreich ein verschlüsseltes Volume angelegt. Wurde der Parameter -passphrase beim Anlegen der CoreStorage logical volume vergessen, so steht hier no.
Und wie ich schon zu Anfang erwähnte, habe ich für den Versuch einen uralten USB-Stick mit 64 Megabyte verwendet. Das Kuriose dabei ist, dass das GUI- „Festplattendienstprogramm“ (engl.: Disk Utility) unter Mac OS X Lion prinzipiell beim Versuch ein Logical Volume zu erstellen immer abstürzte. Deswegen habe ich das ganze Prozedere auf dem Terminal mit dem Befehl diskutil durchgeführt. Man muss ausserdem dazu sagen, dass je geringer die Speicherkapazität des Medium ist, umso weniger für die restlich verfügbare Kapazität bleibt. Im Fall meines USB-Stick bleiben von den 64 nur noch 28 Megabyte an nutzbaren Speicher übrig. Der Rest geht für die Metadaten drauf. Das macht mir aber in diesem Fall nichts aus, da ich diesen Stick als ein weiteres Backup-Medium für die KeyChain der Schlüsselbundsoftware von Mac OS und für weitere asymmetrische Schlüsselpaare der SSH und OpenVPN nutze. Das macht bei mir nur ein bis zwei Megabyte aus.

Bei Mac OS X Montain Lion hat zwar Apple die Stabilität vom Festplattendienstprogramm verbessert, aber der kleine USB-Stick lässt sich sowohl unter diesen als auch mit dem diskutil-Terminalbefehl nicht mehr zu einem logical Volume verwandeln. Hier moniert das Programm, dass das Medium dafür über zu wenig Speicher verfüge. Einen Sinneswandel, den ich technisch überhaupt nicht verstehen kann.

Endlich auch mal eine SSD

Nachdem ab heute die dreijährige Garantie von meinem Apple MacBook Pro abgelaufen ist, habe ich mich entschieden, das Gerät ein wenig zu pimpen. Neben dem Austausch des Arbeitspeicher – von insgesamt vier auf acht Gigabyte – werde ich die 320 Gigabyte grosse Festplatte durch eine etwas kleinere 250 Gigabyte grosse Solid State Disk (SSD) ersetzen. Diese Maßnahmen sollen dem Gerät noch einmal einen kleinen Speedpump geben. Wurde uns ja schliesslich seit Jahren erzählt, dass wir immer schnellere Prozessoren brauchen, hat sich in den letzten Jahren doch heraus kristallisiert, dass doch die Festplatten mit ihren drehenden und sonstig bewegenden Teilen den Flaschenhals in einem Computer bilden.

Für meinen Laptop habe ich mich nun also für die Samsung 840 Basic-Variante mit 250 Gigabyte entschieden. Da der Computer, in der sie verbaut wird, schon eben drei Jahre alt ist, gibt sich allerdings schon eine kleine Einschränkung: Die Disk ist für die aktuelle Serial-ATA-Schnittstelle mit bis zu einer Transferrate von 6 Gigabit pro Sekunde konzipiert, während die Schnittstelle im Computer maximal 3 Gigabit pro Sekunde in der Lage zu transferieren ist. Zum Glück ist aber der S-ATA-Bus gegeneinander auf- und abwärts kompatibel. So kann ich zwar nicht die volle Leistung der SSD ausschöpfen, aber sie liegt deutlich über die einer konventionellen Festplatte, so dass zumindest der Bus bis zum Maximum ausgenutzt wird. So liegen die Lese- und Schreibgeschwindigkeit in einem Benchmark beide bei 210 bis 220 Megabyte pro Sekunde. Obwohl sie laut Datenblatt bis zu 540 Megabyte pro Sekunde lesen und 250 Megabyte pro Sekunde schreiben kann. Die herkömmliche Festplatte schaffte in dem selben Benchmark nur 210 Megabyte pro Sekunde im Lesen und 65 Megabyte pro Sekunde im schreiben.

Benchmark HDD

Benchmark HDD

Benchmark SSD

Benchmark SSD

Eine Anwendung, wo dieses Kernfeature schon deutlich zum Tragen kam, war das Verschlüsseln des Datenträgers auf Dateisystemebene. Hat diese mit FileVault2 bei der 320 Gigabyte grossen Festplatte über fünf Stunden gedauert, so waren es mit der 250 Gigabyte SSD nur noch 45 Minuten.
Ausserdem ergeben sich durch den Einsatz einer Solid State Disk noch zwei weitere Effekte: Zum einem ist eine SSD vom Gewicht viel leichter als eine herkömmliche Festplatte. Gemessen habe ich 45 Gramm (SSD) zu 104 Gramm (HDD). Das macht auch den tragbaren Computer insgesamt um circa 60 Gramm leichter. Ausserdem kommen hier keine beweglichen Teile mehr zum Einsatz, welche angetrieben werden müssen. So eine SSD verbraucht also auch weniger Strom. Was dazu führt, dass zum einem der Akku ein klein wenig mehr geschont wird und zum anderen, wenn sie extern über USB konnektiert werden, sie damit mal endlich die USB-Spezifikation hinsichtlich der Stromaufnahme nicht überschreiten.

Erwähnenswert wäre noch, welche Software ich für den „Plattentausch“ genutzt habe. Mit dem Carbon Copy Cloner habe ich die ursprüngliche Festplatte auf die Zielplatte, welche über FireWire oder USB extern an dem Rechner angeschlossen ist, eins zu eins geklont. So braucht diese dann nur noch einfach getauscht werden, ohne dass irgendetwas neu installiert werden muss.
Da es sich aber nicht um eine original von Apple verbaute SSD handelt, schaltet das Mac OS X den Trim-Befehl nicht ein. Obwohl der Befehl im Betriebssystem vorhanden ist, muss er manuell eingeschaltet werden. Hier empfiehlt sich das Programm Trim Enabler.