Backup solution with Raspberry Pi – part 1

What I want to show you in this series is how to ...

  • (part 1) set up your Raspi to provide a mountable drive for your clients
  • (part 1) do an incremental and versioned back-up of your Linux clients to that drive via rsync
  • (part 2) mirror your backup to your friend's Raspi to have an (encrypted) copy in case of desaster
  • (part 2) include your phone or tablet into this scenario (well, kind of ...)
the hardware setup
(Icons made by srip from, licensed by CC 3.0 BY)

For this to work we only need the hardware and some basic Linux commands. This is what you'll need:

  • knowledge of basic Linux commands (sudo, mount, ...) and how to edit a file owned by root on the command line
  • ssh and root access (via sudo) on your Raspberry Pi
  • root access on the computers which are going to be backed-up

And these are the directories, device names and so on I will use in this article:

  • /dev/sda1: partition for the primary backup (see graphic above)
  • /media/Backup1: mount point for /dev/sda1
  • bean, luci: devices I want to backup (two Linux Mint laptops - my wife's and mine)
  • raspi: my Raspberry Pi
  • pi: the user I use to connect to my Raspiberry Pi (ssh pi@raspi)

Preparing your network

First, we must make sure, that the Raspberry Pi can address all laptops and desktops by their names or static IP addresses and vice versa.

static IP addresses and host names

To accomplish that I told my router (a Fritz-Box) to always give the same IP address to my Laptops and the Raspi. Then I edited the /etc/hosts file on all of them and added the names and corresponding IP addresses of the devices:

... other stuff here ...  bean  luci  raspi

... more other stuff here ...

I actually left out the corresponding line on the corresponding machine. Meaning: on bean I left out the " bean", on luci I left out the " luci" and so on.

Now I can address all of them by name or IP address. I prefer "by name". Like "ping luci" while being on raspi for example.

Another solution to accomplish this is to make your Router or your Raspberry Pi a DHCP server. But I wanted to keep it simple for now, concentrate on the backup task and not get caught up in other nasty fun stuff.

Setting up your Raspberry Pi

Ok, it's time to plug your designated backup drive into the Raspi right now. I formatted mine with an ext4 file system beforehand.

add the backup drive to /etc/fstab

Then create a mount point for it (here: mkdir /media/Backup1) and add your device to /etc/fstab. But first find out the UUID of your drive by issuing this command:

sudo blkid

My /etc/fstab entry for /dev/sda1 looks like this now:

UUID=a4ef22cd-b8ad-48f6-bd53-648805e9e58b /media/Backup1 ext4 defaults 0 1

I used the UUID instead of /dev/sda1 for device identification. This is more fail proof, because the partition /dev/sda1 of your backup drive may get a new name (e.g. /dev/sdb1) if you attach another drive to your Raspi.

NFS server

Now let's give the other devices access to the backup drive.

I did that by exporting the whole drive via NFS. NFS is perfect for laptops, because the mounts survive sleep mode flawlessly. You can also try Samba (SMB/CIFS); I won't, because I don't have any Windows installations here.

Some might say "Why do you want to mount that drive remotely? You can use rsync's remote copy abilities (root@raspi:/backup as target)!". Well, you could. But a) you would need to enter the Pi's root password every time you do a backup and b) I also have some media directories on that disk I want to provide to the client machines anyway and they will also be synced to the remote backup disk. (If you think not-mounting-the-drive-remotely is better for your purpose, just skip this part.)

Still on the Raspi install the NFS packages, ...

sudo apt install nfs-kernel-server

... edit /etc/exports and add something like this (all in one line) plus a helpful comment:

/media/Backup1 bean(fsid=0,rw,async,no_subtree_check,no_root_squash) luci(fsid=0,rw,async,no_subtree_check,no_root_squash)

# after changing anything here, do:
#   exportfs -ra && service nfs-kernel-server restart 

I added my two laptops (bean, luci) here by name. This means, no-one else should be able to mount the backup drive remotely.

You could only export a single directory of that drive, too. In my case I want to export the whole drive. It also holds GBs of media files which I want to be able to access from my laptops.

After editing /etc/exports run these commands to re-read the NFS configuration and restart the NFS server:

sudo exportfs -ra && sudo service nfs-kernel-server restart

NFS won't start at boot time

There's one problem with NFS left: if you'd reboot your Raspberry Pi now, you would see that the NFS server hadn't started at boot time. This is because NFS is started before rpcbind or so. But the NFS server needs rpcbind to run. We can tell the Raspi that there is a dependency between these two by adding this to a new file called /etc/systemd/system/nfs-kernel-server.service.d/10-dep.conf:


On the next boot the NFS server will start automagically now.

bonus: securing sudo on the Raspberry Pi

You might have noticed, that sudo on the Raspi doesn't ask for a password. This is odd. And insecure. It actually is insane.

But if you don't experience this or don't know what you're doing, please skip this part of this How-To. I also don't know on which versions of Raspian-OS this happens. Mine is a Raspberry Pi 3 B+ of November 2018.

To make sudo ask for a password I had to add the user pi to the sudo group. I even had to create the sudo group first:

sudo su -
groupadd -g 27 sudo
usermod -a -G sudo pi
# leave this shell open! If something goes wrong, you might lock yourself out!

Then uncomment the line starting with "pi" in /etc/sudoers.d/010_pi-nopasswd.

Now connect to your Raspi from another terminal session, to check if you can still do things like "sudo ls". If not, don't close the other ssh session and repair that!

Mount your backup drive

On the Linux devices you want to backup, install the NFS client first and create a mount point for the remote drive:

sudo apt install nfs-common
sudo mkdir /media/Backup1 # this is the local mount point for the drive

Add the drive to /etc/fstab now. My entries look like this:

raspi:/media/Backup1 /media/Backup1 nfs defaults 0 0

To check if mounting works, do this:

sudo mount /media/Backup1
sudo touch /media/Backup1/x # checks write access

In your nautilus or nemo or whatever file browser you use, you should see the drive now and be able to access it - depending on the rights you set on the files and directories on it.

Back it up now!

There's some more to do and think about: Write a backup script, choose where to put it, what to include in / exclude from the backup and finally how to start the backup...

If you don't want to write your own scripts, you can also try other backup solutions like Back In Time, rsnapshot or rsbackup. But I wanted to write my own:

a backup script to start with

The following is my backup script which I run on each of my clients bean & luci:


# set terminal window title
wmctrl -r :ACTIVE: -N "Backing Up $HOSTNAME"


if [ ! -d "$TARGET" ]; then
  dialog --msgbox "$TARGET does not exist - aborting ..."
  exit 1

# pre backup

# gather some infos
mkdir -p /root/backup/
dpkg -l > /root/backup/dpkg.get-selections

# dump databases
# mysqldump -u root -p******** --all-databases > /root/backup/mysql.dump

# END OF pre backup

# temp files
PROG=$( basename "$0" )

# excluded paths
echo "# excludes
/home/*/.config/google-chrome/Default/Service Worker/CacheStorage

# do backup to external drive
VERSIONING_TARGETDIR=$( date "+%Y-%m-%d_%H:%M:%S" )
rsync -a \
  --progress \
  --backup --backup-dir="$TARGET/$VERSIONING_TARGETDIR/" \
  --delete --delete-excluded \
  --exclude-from="$EXCLUDE" \
  / "$TARGET/latest/" \
  2> "$ERRORS"

CLOSEMSG="* you can close this window now *"
if [ -f "$ERRORS" -a $( cat "$ERRORS" | wc -l ) -ne 0 ]; then
  MSG="$HOSTNAME backup completed with errors:"
  ERRORS=$( cat "$ERRORS" )
  #spd-say "$HOSTNAME backup complete with errors"
  dialog --title "Backup completed" --msgbox "$MSG\n\n$ERRORS\n\n$CLOSEMSG" 1000 1000
  MSG="$HOSTNAME backup completed without errors"
  #spd-say "$HOSTNAME backup complete without errors"
  dialog --title "Backup completed" --msgbox "$MSG\n\n$CLOSEMSG" 9 50

I changed it's access rights like this, so everyone can start it but only root can change it:

sudo chown root:root raspi-backup
sudo chmod 755 raspi-backup

It also uses the dialog command, so install that:

sudo apt install dialog

Some comments about the script:

  • $TARGET: this is the indiviual backup target
  • $HOSTNAME: Be aware: this is used to define the directory name into which the files are backed up. A malicious user could use this to overwrite another one's backup. Keep your host's names distinguishable!
  • # pre backup: here I do some things like making a list of the installed packages and dump my mysql database to a file
  • $EXCLUDE: this is the list of files and directories I don't want to backup. As I do a backup starting at the root directory / I exclude almost everything but /etc, /home and /root
  • $VERSIONING_TARGETDIR: this is the directory name for the --backup-dir option. It is a timestamp, for example "2019-01-02_15:23:04"
  • rsync options:
    • --delete and --delete-excluded: will delete files on the backup drive that are not existing on the client anymore
    • --backup: this tells rsync to not delete or overwrite anything - this is what makes the backup a versioned backuprsync's parameters:
    • --backup-dir: rsync before overwriting or deleting anything, rsync moves the old versions of these files to this directory
    • $TARGET/latest/: this is the directory where the backup will be put

where to put the script

I put the script on my backup drive under the name raspi-backup. It is suitable for both the laptops that I back-up with it.

If you need individual scripts for individual machines, you might just want to put them in the root directory of the laptops / desktop computers.

start the backup script

On your client machine the above script can be started like this now:

sudo /media/Backup1/raspi-backup

If you want to allow your user(s) to start it without entering a password (because of sudo), you can put something like this into your sudoers file by using the "sudo visudo" command:

krst ALL=(ALL) NOPASSWD: /media/Backup1/raspi-backup

krst is the username and raspi-backup is the script he is allowed to run without issuing a password. Nice and safe, eh?!

But wouldn't it even be nicer to just click on an icon on your desktop to start the backup? Let's do that!

On my Linux Mint 19 laptops I wrote this litle file named Backup.desktop and shoved it to my ~/Desktop folder. I think it will work on any Ubuntu based distribution:

[Desktop Entry]
Exec=sudo /media/Backup1/raspi-backup

My wife and me, we have different user names on our individual laptops. But their UIDs are the same (UID 1000). That's why we can peek into the other one's backed up files and they appear as if they are written with our own user. If you don't want this, you can ...

  1. change the UID of the users
  2. use /etc/export to only export the indiviual backup target (backup-$HOSTNAME) directory for the individual client

Final thoughts

This backup solution is basic, but it works without any backup file cataloges, strange or even proprietary backup file formats or databases. You can just restore your files from the backup media without any extra software.

If you have huge files like Virtual Box VMs in .vdi files, this can become quite nasty because it takes long time to back these files up. Especially over Wifi. Maybe I can find a solution for this.

possible improvements

  • Why not try letting the Raspberry Pi start the backup? It can ping the indiviual machines now and then and when they are up => grab the data. When done => sync to mirror backup media.

If you have any thoughts on this - feel free to leave a comment!

The second part is not released yet - I even haven't done the hardware setup right now... But it will come in the first quarter of 2019 - promised!

Have fun!

sniff own https traffic

In a Java programming project I needed to see what SOAP request my application sends out to a server. Everything soapy was done inside a 3rd-party-library and I couldn't make it log the request to the console.

So what I did was using a tool called mitmproxy. This provides a man-in-the-middle proxy server that accepts HTTP calls and can forward them via HTTPS.

First you need to create a configuration file. Mine is named and looks like this (it actually is a python program):

def request(context, flow):
  flow.request.scheme = 'https'
  flow.request.port = 443

Then fire up the server by running:

mitmproxy -s

Now tell your Java program to use a http proxy server by starting it with these JVM parameters:

-Dhttp.proxyHost=localhost -Dhttp.proxyPort=8080

To learn how to use mitmproxy's UI, check out their website.

MinimalXPert theme: links not working

Since WordPress 4.4 the MinimalXPert theme used here didn't produce correct links anymore. "Read more" links, clicks on the title, the featured image, search results or catagory links did not work anymore.

Solution: go to the theme's folder or your child theme's folder and find all the_permalink calls which have a parameter to them. (I found some the_permalink(' ') calls.) Remove the parameter (make it the_permalink()) and it works again.

Thunderbird: Move Messages (to SPAM) with Keyboard Shortcut

With the keyconfig extension you can attach little scripts to keyboard shortcuts. It took me quite some googleing to find the right commands for moving the selected message to a specific folder:

  • Download and install keyconfig
  • Right-click on your destination folder (here: SPAM) and choose "Prefences"
  • Copy the address of the folder (here: imap://
  • Open the Add-Ons-Manager and choose Prefences of keyconfig
  • Create a new shortcut and paste this as the code: MsgMoveMessage(MailUtils.getFolderForURI("<the-copied-folder-address>"));
  • Name it, save it and assign a keyboard shortcut

Ubuntu: User verstecken

Möchte man am Anmeldebildschirm und im Unity-Menü oben rechts einen User nicht anzeigen, hilft die Information, dass dort nur User sichtbar sind, deren UID >= 1000 ist.

Mit dem Befehl

sudo usermod -u 888 <username>

kann man die UID eines Users ändern. Danach ist er vom Anmeldebildschirm und aus dem Unity-Menü verschwunden.

Android, S4 mini: externe SD-Karte kaputt

Jetzt ist es schon zum 2. Mal passiert: die SD-Karte in meinem Samsung S4 mini hat sich verabschiedet. Ich soll sie formatieren, sagt Android. Aber wenn ich das tue, macht er es nicht. Auch im Recovery geht es nicht.

Hier ein paar Tipps:

  • unter Windows hilft angeblich ein chkdsk /X /F <driveletter>:
  • Installier testdisk, lass es als root laufen. Karte steckt im (USB-)SD-Karten-Adapter. Damit kannst du wenigstens die Dateien retten.
  • mach danach im Zielordner ein find -name "_*" -exec file {} \;. Damit findest du Dateien, deren Namen nicht mehr korrekt gerettet werden konnten.
  • zum wieder lesbar machen der SD-Karte: starte testdisk nochmal und versuch diese Optionen: (danach sind aber trotzdem sicherlich einige Dateien nicht lesbar oder haben 0 Byte -> find -size 0 -exec rm {} \; ):

>Create a new log file
[Choose Disk]
>Intel/PC partition
[Choose Partition]
>Repair FAT
[Accept Defaults and Write]
>(Q)uit until exited

Meine beste Lösung bei diesem Problem ist:

  1. Daten sichern mit testdisk
  2. SD-Karte wieder lesbar machen
  3. Karte formatieren im Recovery oder mit gparted (fat32)
  4. Backup aufspielen und danach die Dateien aus dem ersten Schritt aufspielen

Aktuelle mysql-Version für Uberspace kompilieren

Auf kann es passieren, dass die installierte MySQL-Version veraltet ist und man eine aktuellere Version verwenden möchte. Hier die Schritte um das zu realisieren.

In Kürze bedeutet es: CentOS installierenMySQL kompilierenkompilierte Version von MySQL zu Uberspace übertragenMySQL einrichtenStartscripte erstellenz.B. in WordPress verwendenaufräumenBackup einrichten

Ich benutze folgende beispielhafte Konventionen in dieser Anleitung:

  • grobi: der Username auf
  • enif: der Servername auf dem der Uberspace-Account liegt. Alle Server haben Namen von Sternen oder Sternbildern. Z.B. oder
  • ich verwende hier CentOS 6.6
  • ich installiere hier im Beispiel die MySQL-Version 5.6.24
  • ich installiere die Version nach ~/.mymysql
  • die MySQL-Version soll auf Port 33306 laufen

CentOS installieren

Zuerst finden wir raus, welche CentOS auf uberspace läuft. Also per SSH verbinden und dieses Kommando absetzen:

> cat /etc/redhat-release
CentOS release 6.6 (Final)

Also laden wir erstmal die Version herunter: Minimal ISO 64 Bit von Danach diese Version installieren, z.B. in eine VirtualBox VM.

  • Deutsches System
  • Rechnername: enif (siehe oben)
  • Netzwerk konfigurieren: eth0 bearbeiten → Automatisch verbinden
  • Zeitzone: Berlin

Nach der Installation loggen wir uns als root ein und richten einen Account für grobi ein:

> adduser grobi
> passwd grobi

MySQL kompilieren

Jetzt als root ein paar Pakete installieren:

> yum install wget cmake gcc-c++ ncurses-devel

Wir loggen uns als grobi ein, damit wir beim kompilieren auch ja nicht in den Genuss von root-Rechten kommen, denn die haben wir ja auf Uberspace auch nicht. Nicht dass da was passiert, was uns nachher - als normaler User - das Genick bricht.

> sudo su - grobi

Nun laden wir die gewünschte MySQL als Sourcen herunter:

  • per Browser auf einem anderen Rechner auf gehen
  • "Source Code" und "Generic Linux" auswählen
  • bei "Compressed TAR Archive" auf Download klicken
  • auf der nächsten Seite den Link "No thanks, just start my download." kopieren
  • im CentOS mit wget die Sourcen runterladen, entpacken und ins Verzeichnis wechseln. Z. B.:

> wget
> tar xzf MySQL-5.6.24.tar.gz
> cd mysql-5.6.24

Zum kompilieren müssen wir ein paar Optionen mitgeben (mehr hier: und dann geht's los:

> cmake -DCMAKE_INSTALL_PREFIX=/home/grobi/.mymysql/ -DSYSCONFDIR=/home/grobi/.mymysql/
> make
> make install

zu Uberspace übertragen

MySQL 5.6 ist nun im Verzeichnis /home/grobi/.mymysql installiert. Wir übertragen das ganze Verzeichnis in unser $HOME auf Uberspace. Z.B. mit scp:

> cd
> tar czf mymy.tgz .mymysql/
> scp mymy.tgz # nicht den Doppelpunkt am Ende vergessen

Es sind ca. 1 GB Daten - gepackt ein Viertel davon. Keine Ahnung, was davon alles wirklich benötigt wird... Vielleicht fummel ich das später mal raus ...

Fahr dein CentOS jetzt runter, es frisst nur Strom.

MySQL einrichten

Unser selbst installiertes CentOS hat jetzt ausgedient. Wir brauchen es nicht mehr. Eigentlich. Wenn du eventuell noch ein paar andere Optionen beim Kompilieren ausprobieren willst, solltest du es noch nicht wegwerfen.

Wir loggen uns erstmal per ssh auf unserem Uberspace ein, entpacken die übertragene Datei und wechseln ins Installationsverzeichnis

> ssh
> tar xzf mymy.tgz
> cd .mymysql/

Next step: Wir erstellen hier die Datei my.cnf mit diesem Inhalt:



Wir erstellen jetzt die Systemtabellen und können dann unseren MySQL-Server starten:

> scripts/mysql_install_db --basedir=/home/grobi/.mymysql/
> bin/mysqld

Nun noch root-Passwort vergeben und ein paar Einstellungen machen (auf einer weiteren Konsole). Dazu muss die Datei bin/mysql_secure_installation angepasst werden, so dass korrekte Werte für port und protocol verwendet werden (dies kann bei MySQL 5.7 angeblich per Kommandozeile geschehen). MySQL 5.6: In der Funktion "sub make_config" fügen wir diese Werte hinzu (nur die 2. Zeile ist neu):

"socket=''", "port=33306", "protocol=TCP", # diese Zeile einfügen

Und ausführen:

> bin/mysql_secure_installation

  • current password: Enter
  • set root password: Y
  • remove anonymous users: Y
  • disallow root login remotely: Y
  • remove test database and access to it: Y
  • reload privilege tables now: Y

Ok! Wir haben fertig und die Datenbank läuft! Cool? Sehr cool!

Jetzt kann man mit

> bin/mysql --port=33306 -u root -p

das Client-Programm verwenden. Dafür sollte man sich einen Alias einrichten. Zum Beispiel so:

> alias mymy='/home/grobi/.mymysql/bin/mysql --port=33306'

Dies funktioniert bei mir ohne User / Password, weil in der schon vorhandenen ~/.my.cnf Passwort und User der alten MySQL-Version stehen. Ich habe für die 5.6er die gleichen Werte für User und Passwort ringerichtet.

Startscripte erstellen

Auch Uberspace-Server werden wohl ab und an mal neugestartet. Selten, aber wenn, dann soll unser MySQL beim hochfahren mitgestartet werden.

> uptime
05:58:35 up 301 days, 10:50, 0 users, load average: 0.29, 0.51, 0.50

Dazu müssen wir einen Service einrichten. Die ganze Anleitung dazu gibt es hier: Wir beginnen mit der Vorbereitung:

> test -d ~/service || uberspace-setup-svscan

Schreib jetzt ein Script ~/bin/mymysqld das den MySQL-Daemon startet und mach es ausführbar. Inhalt:


exec ~/.mymysql/bin/mysqld

Die Startscripte erstellst du mit

> uberspace-setup-service mymysqld ~/bin/mymyslqd

Hier kannst du nachlesen, wie du ausprobierst, ob das Starten und Stoppen funktioniert (-u / -d / usw). Loggingausgaben kannst du dir mit

> tail -f ~/service/mymysqld/log/main/*

anzeigen lassen.

Beispiel: in WordPress verwenden

In WordPress musst du die DB_HOST Variable so setzen:

define('DB_HOST', ''); /* nicht localhost verwenden */


  • dein selbst installiertes CentOS kann jetzt gelöscht werden
  • Datei mymy.tgz im Home deines Uberspace kann gelöscht werden

Backup einrichten

So! Nachdem nun alles sauber läuft, sollte man sich noch um den Backup kümmern. Denn auch wenn dein Server gesichert wird, ist es keine gute Idee, auf eine Dateisicherung des MySQL-Arbeitsverzeichnisses zu vertrauen. Hier im Beispiel machen wir einen MySQL-Dump in die Datei ~/.mymymsql/backup.dump.

~/.mymysql/bin/mysqldump --host= --port=33306 --all-databases > ~/.mymysql/backup.dump

Diesen Befehl in die crontab und gut ist. Denn die Datei backup.dump wird ja beim nächsten Backup mitgesichert.

Man beachte: während eines Dumps wird die Datenbank kurz gesperrt. Bei großen Datenbanken kann das natürlich zu Problemen führen (siehe auch hier).

Quartz in Tomcat 7 einbinden

Quartz ist ein Scheduler der es auf relativ einfache Weise ermöglicht, Aktionen zu bestimmten Zeitpunkten auszuführen. Wenn man Quartz in Tomcat einbindet, wird es automatisch gestartet und gestoppt. Außerdem zeige ich hier, wie man einen Scheduler erzeugt, den man dann in den Servlets / WebServices oder was auch immer verwenden kann um neue Jobs einzustellen.


Hier wird dafür gesorgt, dass Quartz gestartet und gestoppt wird. Der erste Parameter gibt an, wo die config-Datei zu finden ist. In diesem Beispiel liegt sie im root des classpath.


Scheduler holen

Den Scheduler holt man jetzt aus dem ServletContext:

     * returns the scheduler
    public static Scheduler getScheduler(ServletContext context)
            throws SchedulerException {
        StdSchedulerFactory factory = (StdSchedulerFactory) context
        return factory.getScheduler("MyScheduler");

That's it. Jetzt kann man Quartz in Tomcat verwenden.

JobStore in der Datenbank

Um die in der web.xml definierte DataSource der Anwendung mitzubenutzen muss man in nur folgendes einstellen:

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.dataSource = <datasource-name>
org.quartz.dataSource.eweb_pool.jndiURL = java:comp/env/jdbc/<datasource-name>
org.quartz.jobStore.tablePrefix = QRTZ_

Die Definitionen für die Datenbanktabellen sind im Downloadpaket von Quartz enthalten.

Ubuntu 14.04: Tastatur auf “englisch” eingestellt nach Neustart

Wenn deine Tastatur ständig auf englisch anstatt auf deutsch eingestellt ist, wenn du den Rechner neu startest, kannst du das so in den Griff bekommen:

  • installier den dconf-editor
  • öffne ihn
  • geh zu desktop -> ibus -> general
  • setz das Häkchen bei "use-system-keyboard-layout"

Jetzt sollte deine Tastatur nach einem Neustart deutsch eingestellt sein.

PHP 5.5 unter IIS zum Laufen kriegen

In einem gerade beendeten Projekt musste ich mich mal wieder mit Windows herumschlagen. Diese Klickerei ... gruselig.

Da dieser Blog auch ein Notizbuch ist, möchte ich hier aufschreiben, wie man unter Windows Server 2012 einen IIS 8.5 mit PHP 5.5.11 und eine Anbindung an SQL Server Express 2014 hin bekommt.

Alles nur stichpunktartig, aber m. E. völlig ausreichend.

Windows Server 2012 R2

Man kann sich für lau eine Testversion herunterladen, z. B. als ISO-Datei. Sie ist nach Aktivierung für 180 Tage nutzbar.

Ich habe die "Standard Testversion mit grafischer Oberfläche" in einer VirtualBox mit 2GB RAM und 25GB HD installiert. Das langt massig. Hier auf meinem Lenovo X230, 8 GB, 4 Kerne, 2.9 GHz mit Ubuntu 14.4 läuft das ganz fluffig.

VirtualBox Gasterweiterungen

Danach sollte man die Gasterweiterungen installieren. Man findet sie, wenn Windows im Fenster läuft, oben im Menü.


Dann kommen erstmal ein paar Programme drauf, die unverzichtbar sind:

  • natürlich Firefox - der IE ist so komisch voreingestellt, er ist quasi unbenutzbar. Probier es aus, du wirst verzweifeln. Versuch gar nicht erst, das zu beheben. Das ist echt nicht nötig.
  • Notepad++ - ein ganz brauchbarer Texteditor. Natürlich ist das nur eine Krücke gegen den VI 🙂
  • den Web Platform Installer (WPI) - Das Ding kann ein paar Serverkomponenten installieren. Vorsicht: installieren ja, deinstallieren kann das Teil nicht. Man merkt, dass es aus Redmond kommt. Und damit installierte Sachen wieder wegzubekommen ist echt schwierig.

IIS (das ist ein Web Server!)

Die Installation macht man mit dem Server Manager:

  • Rechts oben auf Manage
  • Add Roles and features
  • Next, Next, Next
  • Web Server (IIS) Add Features
  • Next, Next, Next, Next
  • Install

SQL Server 2014 Express

Den gibt's auch gratis ... Microsoft, was ist los mit dir? Man könnte meinen ihr hättet was verstanden! Naja, der Druck durch MySQL ist wohl einfach zu stark.

Hier eine Version, die mit SQLEXPRWT beginnt, auswählen. WT heißt "with tools" ... Der Download läuft? Dann aber erstmal mit dem Web Platform Installer (WPI) ".Net 3.5 SP1" installieren.

Die Installation von SQL Express geht so:

  • "New SQL-Server Standalone bla bla bla ..."
  • Feature Selection: nix ändern
  • Instance Configuration: "Named instance" klicken, weiter, weiter, weiter usw.
  • Database Engine Configuration: hier habe ich "Mixed Mode" gewählt und ein Passwort vergeben - Das bedeutet, dass man auch User in der DB einrichten kann und nicht nur die User, die unter Windows eingerichtet sind, verwenden kann.

Noch nie war Windows einfacher, ehrlich. Ich war teilweise echt begeistert. Zumindest bis die ersten Probleme kamen und die Lösungen mal wieder nix mit den Fehlermeldungen zu tun hatten. Da hat sich seit den 80ern echt nichts dran geändert.

PHP 5.5.11

Jetzt kommt Butter bei die Fische:

  • PHP 5.5.11 per WPI installieren
  • fastcgi-Fehler beheben: "Visual C++ Redistributable for Visual Studio 2012 (Update 4)" installieren - vcredist_x86.exe, nicht x64! Dies ist nötig, weil irgendein PHP-Modul mit Visual C++ 2012 kompiliert wurde und wir die Libs (dll) noch nicht auf dem Rechner haben. WPI weiß das aber nicht.

PHP version prüfen:

PHP Driver für SQL Server installieren (v3.1 ist für PHP 5.5):

  • hier: - da es für PHP 5.6 noch keine Treiber gibt, bleibt uns nur 5.5. Auch das weiß WPI noch nicht.
  • SQLSRV31.EXE ausführen und als Pfad zum Entpacken "C:\Program Files (x86)\PHP\v5.5\ext\" angeben!
  • in php.ini ganz unten eintragen: "extension=php_sqlsrv_55_nts.dll"

Test ob SQL Server Extension geladen werden kann:

  • in der sogenannten Powershell (hier geht sogar ls) dies ausführen: php -d display_startup_errors=1 -d error_reporting=-1 -d display_errors -c "C:\Program Files (x86)\PHP\v5.5\php.ini" -m
  • es sollte sqlsrv im output erscheinen


So, das war's - jetzt am besten die VM ausmachen, klonen und zur Seite legen, bevor du wieder irgendwas kaputt machst, Junge!