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

ZEVO ZFS Community Edition für Macintosh

Nach ewigen Hin und Her gibt es nun den Treiber für ZFS in einer kostenlos downloadbaren Community Edition. Der Nachteil von dieser gegenüber der vorherigen Kaufversion ist allerdings, dass man über das GUI-Frontend in den Systemeinstellungen keine Volumes erstellen kann, sondern nur den Intigritäts-Check durchführen kann.
Also werde ich hier mal einen kurzen Workaround aufstellen, wie man sich unter der Konsole ZFS-volumes erstellt und verwaltet.

Mit dem Befehl ls -l /dev/disk* lässt man sich erstmal alle verfügbaren Datenträger anzeigen.

sommteck:~ franky$ ls -l /dev/disk*
598 0 brw-r-----  1 root  operator    1,   0 27 Jul 21:26 /dev/disk0
600 0 brw-r-----  1 root  operator    1,   1 27 Jul 21:26 /dev/disk0s1
602 0 brw-r-----  1 root  operator    1,   2 27 Jul 21:26 /dev/disk0s2
604 0 brw-r-----  1 root  operator    1,   3 27 Jul 21:26 /dev/disk0s3
606 0 brw-r-----  1 root  operator    1,   4 27 Jul 21:26 /dev/disk1
835 0 brw-r-----  1 root  operator    1,   5 19 Aug 10:42 /dev/disk2
839 0 brw-r-----  1 root  operator    1,   6 19 Aug 10:42 /dev/disk2s1

Für eine detaillierte Auflistung aller Datenträger benutz man die Funktion list des Kommandozeilenprogramm diskutil.

sommteck:~ franky$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *320.1 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:          Apple_CoreStorage                         319.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Simba                  *318.9 GB   disk1
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *2.1 GB     disk2
   1:               Windows_NTFS Ohne Titel              2.1 GB     disk2s1

In der Ausgabe sieht man drei Datenträger.
/dev/disk0 ist der Erste und gleichzeitig die Festplatte des Computer auf der ich das hier veranstalte. Auf ihm liegt die Partitionstabelle, die EFI-Firmware des Computer selbst, die Partition mit dem Computerbetriebssystem und allerlei Daten, und eine spezielle Recovery-Partition für das Mac OS.
/dev/disk1 wird als ein weiteres Laufwerk angezeigt, ist aber in Wirklichkeit die Computerfestplatte und deshalb noch einmal aufgelistet, da es sich um ein LogicalVolume von Apple’s CoreStorage handelt, welches verschlüsselt ist.
/dev/disk2 ist schlussendlich der 2 Gigabyte große USB-Stick den ich für das ZFS verwenden möchte. Er beherbergt erst einmal ein Windows-Dateisystem.

Da die bisherige Community-Edition bisher keine bootfahigen ZFS-Volumes erstellen kann, zeigt der Befehl zpool showdisks nur die Laufwerksgeräte an, die für den Treiber in Frage kommen und man sollte nicht in der Lage sein, seine Systempartition zu zerschiessen. Also wird nur der USB-Stick angezeigt, der in Frage kommt und den ich verwenden will.

sommteck:~ franky$ zpool showdisks

DISK DEVICE      SIZE  CONNECTION    DESCRIPTION
/dev/disk2    1,91GiB  USB           SanDisk U3 Titanium Media

Jetzt ans Eingemachte! Mit zpool create wird ein ZFS-Volume mit einer Disk erstellt.

sommteck:~ franky$ sudo zpool create -f ZFS-Disk /dev/disk2

Da jetzt nun ein Laufwerk mit ZFS vorhanden ist, wird der Befehl zpool list eine Ausgabe geben.

sommteck:~ franky$ zpool list
NAME        SIZE   ALLOC    FREE     CAP  HEALTH  ALTROOT
ZFS-Disk  1,78Gi   672Ki  1,78Gi      0%  ONLINE  -

Mit zpool status und dem Namen des gewünschten Pool lassen sich die Informationen vertiefen.

sommteck:~ franky$ zpool status ZFS-Disk
  pool: ZFS-Disk
 state: ONLINE
 scan: none requested
config:

	NAME                                         STATE     READ WRITE CKSUM
	ZFS-Disk                                     ONLINE       0     0     0
	  GPTE_20835C0B-2B01-4E41-B117-3E88498CD134  ONLINE       0     0     0  at disk2s1

errors: No known data errors

Disclaimer:
Für meine Übungsbeispiele habe ich bewusst USB-Sticks genommen, weil sie einfach, leicht und handlicher als Festplatten sind. Allerdings performen sie so überhaupt nicht. Das Kopieren einer ca 700 MB grossen Filmdatei dauert mit ZFS auf ihnen ein vielfaches an Zeit, als wenn auf einem Stick ein FAT oder HFS+ betrieben wird. Beim Versuch, ZFS auf eine 250 Gigabyte grosse externe Platte zu bringen, wurden die Daten tatsächlich mit der Geschwindigkeit geschrieben, die auch der Bus zu leisten vermag. In dem Fall eine IDE-Platte.

USBIP auf einem Raspberry Pi starten

Innerhalb meiner Peergroup hatte die Tage jemand versucht, mit Hilfe der Linux-Software USBIP Geräte, welche an einem USB-Port hängen, auch für ein Netzwerk nutzbar zu machen. Im Gegensatz zu einem normalen Debian-Kernel für Standart-PC’s, sind die entsprechenden USBIP-Module aber für die ARM-Architektur im Kernel nicht enthalten. Und irgendwie scheint es prinzipiell wohl Probleme zu geben, die Treiber für den Kernel zu bauen. Dies trifft also nicht nur auf den Raspberry Pi, sondern auch so netter Embeded-Hardware wie der Dockstar. Nach ein bischen stöbern über die allseits bekannten Suchmaschienen bin ich aber hier auf eine – für’s erste funktionierende Lösung gestossen. Sie ist auf ein Debian Wheezy abgestimmt.

Als erstes sollte man sich vergewissern, dass man für sein Raspberry Pi sowohl den aktuellsten Kernel, als auch die neuen Firmware-Treiber und Module geladen hat. Dann wie folgt:

sudo apt-get install git
git clone git://github.com/raspberrypi/linux.git kernel
cd kernel
wget https://raw.github.com/raspberrypi/firmware/master/extra/Module.symvers
zcat /proc/config.gz > .config

Als nächstes öffnet man mit einem Editor die .config und fügt am Ende folgendes hinzu:

CONFIG_USBIP_CORE=m
CONFIG_USBIP_VHCI_HCD=m
CONFIG_USBIP_HOST=m
CONFIG_USBIP_DEBUG=n

Danach auf der Kommandozeile folgende Befehle absetzen:

make oldconfig
make LOCALVERSION=+ modules_prepare
make SUBDIRS=drivers/staging/usbip
sudo make SUBDIRS=drivers/staging/usbip modules_install
sudo depmod -a

Jetzt USBIP installieren:

sudo apt-get install usbip

Nun den Host-Treiber laden (um USB-Geräte teilen zu können)

sudo modprobe usbip-host

Zum Geräte auflisten:

sudo usbip list -l

Man sollte sich die Bus-ID merken, damit man das Gerät dann zum Teilen frei geben kann:

sudo usbip bind --busid 'BUSID'

Als Antwort kommt dann:

bind device on busid 'BUSID': complete

Für den Client wird dann folgendes ausgelöst:

sudo modprobe vhci-hcd
usbip list --remote 'pi ip'
sudo usbip attach --host 'pi ip' --busid 'BUSID'
lsusb

Kaputter Papierkorb

Neulich hatte mich der Finder auf dem Mac geärgert. Plötzlich konnte ich als Systemadministrator keine Daten ohne eine Passwortabfrage löschen. Dies betraf Daten die Systemweit verfügbar waren, als auch die Dateien im eigenen Benutzerverzeichnis. Die erste Vermutung war, dass irgend etwas mit den Rechten des gesammten eigenen Benutzerverzeichnis nicht stimmte. Eine kleine Recherche im Internet ergab aber, dass dies Problem schon öfter bei Nutzern auftrat. Das Problem war, dass die eigenen Schreib- und Leserechte für den eigenen Papierkorbordner gänzlich fehlten und so der Finder die zu löschenden Daten in den Papierkorb nicht verschieben konnte und sie stattdessen direkt löschen musste. Deswegen die Passwortabfrage.
Um jetzt den Papierkorb aber wieder benutzbar zu machen, gibt es eine Möglichkeit, bei der man auf dem Terminal folgenden Befehl absetzt, um sich die versteckten Ordner und Dateien im Finder anzuzeigen lassen.:

defaults write com.apple.finder AppleShowAllFiles -boolean true;killall Finder

Alternativ kann man dies auch mit hübschen GUI-Programmen wie Onyx machen.

Ist der Ordner des Papierkorb im Finder sichtbar, so kann man nun über die Ordnerinformationen ihn die nötigen Rechte zurück geben.

Syntax-Highlighting in vi abschalten

Ich bin ja eher ein schlichter Typ und mag es deshalb nicht, wenn etwas bei einem möglichst ergonomischen Arbeitsprozess anschreit. Dazu zählt das Syntax-Highlighting auf einem Kommandozeilenterminal. Und der Editor vim macht aber eben genau das standartgemäss unter einem Linux. Mit dem Befehl :syntax off im Kommandomodus lässt sich das Highlighting abschalten und mit :syntax on bei Bedarf wieder einschalten.

Will man dauerhaft auf dieses Feature verzichten, ändert man entsprechend die Zeile Syntax on in den Wert off um. Auf einem System mit root-Zugriff macht man das Idealerweise gleich in der globalen Konfigurationsdatei unter /etc/vim/vimrc. Hat man keinen vollen Administrationszugriff oder befindet sich unter einem Darwin-System, setzt man sich diese Option in seinem Heimverzeichnis in der Datei ~/.vimrc.