Setting up a GPIO-Button “keyboard” on a Raspberry Pi

Back in late 2013, when I wrote the first Version of a raspberry-pi based software controlling a HD44780 based 4×20 characters LCD and 4 input buttons I started querying the buttons using the generic GPIO driver included in Raspbian and its sysfs interface.

However, this has a couple of drawbacks. First of all it is hardly portable to other Linux based hardware and one has to do a lot of stuff like debouncing on the application level.

Fast forward to early 2017. Raspbian now uses a device-tree based approach for system setup and a driver called gpio-keys is readily available in its standard kernel.

However, as it is often the case in the Free Software world, the Documentation of this driver is limited to some README files included in the Linux kernel and some discussions scattered all around the web.

Linux already has drivers for almost all of the common low level peripheral interfaces like I2C, SPI, OneWire, hardware PWM and generic GPIO. It is usually the better approach to use them instead of constantly re-inventing the wheel.

So here is my quick guide for setting up a “keyboard” made up from a couple of buttons connected via GPIO ports as shown in the image.


While this has currently only been tested on Raspberry Pi, it will likely also work on other Linux based boards with device tree enabled (e.g Beaglebone and others).

Keyboards in modern Linux Kernels are presented as a so called input event device. To inspect them I would recommend the installation of the evtest and input-utils packages on Debian/Ubuntu based distributions. The lsinput command (run as root) shows which ones are available on a system.

So now, what do we need to do to make a keyboard from our GPIO connected push-buttons?

The missing link between the gpio-keys driver and the setup of the actual GPIO ports, where the buttons are connected to, is a so called device-tree (DT) overlay.

While DT itself is a data structure for describing hardware, a DT overlay is something a user can put in place to change such a hardware description in a way which matches the actual application scenario (like buttons, buses etc. connected to the device).

So let’s build such an overlay for the four buttons shown in our schematic above.
The Documentation available at provides some clues about device tree overlays as well.

Here is the final result which works, so let’s go into the details:

    / {
       compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
       fragment@0 {
          target-path = "/";
          __overlay__ {
             keypad: breadboard_keys {
                compatible = "gpio-keys";
                #address-cells = <1>;
                #size-cells = <0>;
                button@22 {
                   label = "breadboard Menu";
                   linux,code = <28>;
                   gpios = <&gpio 22 1>;
                button@10 {
                   label = "breadboard down";
                   linux,code = <108>;
                   gpios = <&gpio 10 1>;
                button@9 {
                   label = "breadboard up";
                   linux,code = <103>;
                   gpios = <&gpio 9 1>;
                button@11 {
                   label = "breadboard enter";
                   linux,code = <14>;
                   gpios = <&gpio 11 1>;

Our overlay fragment contains a keypad called breadboard_keys. This is actually the string which lsinput will show as the actual name of our input device. 11, 10, 9 and 11 are the GPIO port numbers corresponding to the green wires in our schematic.

The file gpio-keys.txt from the Linux Kernel source-tree will show us what our four button definitions need to look like. We need a label, which is arbitrary text, a linux,code which is actually a keycode as defined in /usr/include/linux/input-event-codes.h and we need a gpio definition with two options, the number of the GPIO to use and a boolean value indicating if the button is active low (1, as in our case) or active high (0).

Another thing I would like to point at is the autorepeat keyword. If given this will activate a key-press repeat behavior known from ordinary keyboards. The production of key-press-events will be repeated as long as the button is pressed.

Now how to enable this overlay on Raspberry Pi?
Very simple, once you know how :)

First put the above code in a file e.g. breadboard.dts.

Then compile a binary version and put it into the right place:
dtc -I dts -O dtb -o /boot/overlays/breadboard.dtbo breadboard.dts

Finally the following line must be added to /boot/config.txt:

Now we are done.

Here is how this looks like on the software side without any other input devices like keyboards connected:

root@raspberrypi:~# lsinput
   bustype : BUS_HOST
   vendor  : 0x1
   product : 0x1
   version : 256
   name    : "breadboard_keys"
   phys    : "gpio-keys/input0"
   bits ev : EV_SYN EV_KEY EV_REP

root@raspberrypi:~# input-events 0
   bustype : BUS_HOST
   vendor  : 0x1
   product : 0x1
   version : 256
   name    : "breadboard_keys"
   phys    : "gpio-keys/input0"
   bits ev : EV_SYN EV_KEY EV_REP

waiting for events
20:00:23.629190: EV_KEY KEY_BACKSPACE (0xe) pressed
20:00:23.629190: EV_SYN code=0 value=0
20:00:23.749163: EV_KEY KEY_BACKSPACE (0xe) released
20:00:23.749163: EV_SYN code=0 value=0
20:00:23.969176: EV_KEY KEY_DOWN (0x6c) pressed
20:00:23.969176: EV_SYN code=0 value=0
20:00:24.099151: EV_KEY KEY_DOWN (0x6c) released
20:00:24.099151: EV_SYN code=0 value=0
20:00:24.329158: EV_KEY KEY_UP (0x67) pressed
20:00:24.329158: EV_SYN code=0 value=0
20:00:24.439154: EV_KEY KEY_UP (0x67) released
20:00:24.439154: EV_SYN code=0 value=0
20:00:24.669157: EV_KEY KEY_ENTER (0x1c) pressed
20:00:24.669157: EV_SYN code=0 value=0
20:00:24.759176: EV_KEY KEY_ENTER (0x1c) released
20:00:24.759176: EV_SYN code=0 value=0
root@raspberrypi:~# grep breadboard /sys/kernel/debug/gpio
 gpio-9   (                    |breadboard up       ) in  hi    
 gpio-10  (                    |breadboard down     ) in  hi    
 gpio-11  (                    |breadboard enter    ) in  hi    
 gpio-22  (                    |breadboard Menu     ) in  hi    

Finally something which is not strictly on-topic concerning this post. There is something one should know about keyboard like input event devices like this. Pressing a button will send events to all applications normally consuming them (e.g. applications running on Linux console or X-Window system).

This might be an unwanted behavior. If so, your application software needs to issue a EVIOCGRAB ioctl after opening the input device.

Die “Outdoor-Bier” Verkostung

Dank dem Basislager, unserem umtriebigen Karlsruher Outdoor-Laden, habe ich nun, nachdem es das Zeug in den USA schon zwei Jahre lang gibt, endlich auch in Deutschland so ein Outdoor-Bier von Pat’s Backcountry Beverages in die Finger gekriegt.

Weil ich zusammen mit meinem Hobbybrauer-Kollegen ohnehin am Verkosten unserer letzten selbstgebrauten Sude war haben wir deren PALE RALE mal dazu genommen:

Mit einem halben Liter Sprudelwasser gemischt und im Teku-Glas verkostet :)

Nachdem ich bisher meist eher positive Kritiken gelesen hatte kommt nun aber eine negative :( Zumindest das PALE RALE geht gar nicht! Das schmeckt nach allem möglichen aber nicht nach Bier und ich behaupte, dass ich ungefähr weiß, wie ein Pale-Ale schmecken sollte. Ein Haltbarkeitsdatum habe ich leider keines gefunden. Die Prägung 1013 auf der Packung ist hoffentlich eine Losnummer und kein Datum.

Nun lässt sich Geschmack schwer beschreiben, aber ich versuche es trotzdem mal.

Sowohl der Geschmack des Mineralwassers (Kohlensäure) als auch des Ethanols treten IMO zu deutlich hervor. Der malzige Geschmacksanteil erinnert (wohl auch deshalb) eher an einen Malzlikör als an ein Bier.

Durchaus ähnlich vom Geschmack her findet sich in meiner Erinnerung eigentlich nur der Irish-Mist Likör, von dem wir zum direkten Vergleich natürlich keinen da hatten.

Das Black IPA werde ich aus reiner Neugier vielleicht auch noch irgendwann einmal probieren. Insbesondere weil ich die Hoffnung habe, dass die Röstmalzaromen ebentuell den Ethanolgeschmack etwas dämpfen.

Fazit: Zu diesem obskuren bierähnlichen Getränk gibt es aus meiner Sicht bessere (auch alkoholische) Alternativen für den Abend am Lagerfeuer. Spontan würde mir ganz Old School ein Tee mit Rum einfallen. Oder man besorgt sich die Karbonisierungsflasche von Backcountry Beverages und mixt sich einen Wodka Lemon oder Jackie Cola.


icinga2 CheckCommand definition for calling a plugin with non-option arguments

Sometimes in my work as a Linux system adminstrator I come up with a solution which can not be found using Google, the all-knowing Trash Heap.

In this case I usually end up digging for the solution myself and sometimes I like to share them rather than documenting them only in house.

This way at least in future others will be able to google them :)

So here we go:

The most significant difference in icinga2 is the, arguably more clearly arranged, config file syntax.
Fortunately the actual tests from nagios/icinga1 can be used unmodified. However an appropriate CheckCommand definition is needed.

To create it for his custom tests or those tests which are not yet part of the official distribution an administrator need to create it from scratch or by means of copying and modifying another one.

In my case this has been proven to be quite easy with just one exeption. I have somne tests which require something that Unix slang usually calls non-options arguments.

What does this mean? Well a popular example of this kind of command would be git. Given the command git commit -a the term commit would be the non option argument.

So here is what a CheckCommand definition for this command would look like. Of course this does not make sense as an icinga test and can not be actually used.

object CheckCommand "git" {
	import "plugin-check-command"
	import "ipv4-or-ipv6"

	command = [ PluginContribDir + "/check_git" ]

	arguments = {
		# nonopt is the non option argument
		"nonopt" = {
			value = "$git_command$"
			skip_key = true
			order = 1
			required = true
		"-a" = {
			value = "$git_all$"
			description = "commit all"

Die Wahrheit über das “Reinheitsgebot” zum Tag des deutschen Bieres

Als wir vor vielen Jahren angefangen haben selbst Bier zu brauen war mein Glaube an das Reinheitsgebot kindlich naiv und ungebrochen.

Heute bin ich mir da nicht mehr so sicher, denn das was heute Reinheitsgebot genannt wird hat mit der Vorschrift von 1516 eigentlich kaum noch etwas gemein. Die Vorschrift von 1516 selbst ist im historischen Kontext interessant und war damals relativ sinnvoll, heute ist sie das ganz bestimmt nicht mehr.

Im folgenden poste ich hier mal eine Tabelle, was heute so alles als Zutat in Bier, das angeblich nach dem Reinheitsgebot von 1516 gebraut wurde, erlaubt ist. Verarbeitete Versionen einer Zutat gelten aus meiner Sicht als erlaubt. Nach dem Sinn darf man da bei so mancher Vorschrift nicht fragen.

Wer die aktuell gültige Vorschrift selbst lesen möchte kann das bei Gesetze im Internet tun.

Zutat Originalvorschrift von 1516 Heutige Vorschrift (2015)

Wasser OK OK

Hopfen OK OK

Hopfenextrakt unbekannt OK, lassen wir mal als verarbeiteten Hopfen gelten.

Malz Nur aus Gerste

Aus jedem Getreide im obergärigen Bier,
im untergärigen Bier ist nur Gerstenmalz erlaubt!

Hefe unbekannt, aber als “Zeug” verwendet OK

Getreide (unvermälzt) Nur Gerste.
Die Bezeichnung “Malz” kommt im Originaltext nicht vor.
Nicht erlaubt

Zucker Nein Im obergärigen Bier erlaubt

Polyvinylpolypyrrolidon (PVPP) unbekannt :) Im Prozess erlaubt, weil nicht im fertigen Bier enthalten.

Färbebier unbekannt :) Färbebier ist ein nahezu vollständig aus Röstmalzen gebrautes Pseudo-Bier, dem die Bitterstoffe die bei der Röstung enstehen entzogen wurden. Die Firma Weyermann vertreibt ein solches “Bier” unter der Bezeichnung Sinamar. Die Zugabe ist erlaubt.

Gewürze nein, aber schon 35 Jahre später wurde Kori­an­der und Lor­beer wieder erlaubt.


Zum Schluss noch ein paar Worte zum Wasser. Da steht oben in beiden Spalten lapidar OK. Heute wird aber kaum noch von einer industriellen Brauerei einfach Wasser aus der Leitung, der eigenen Quelle oder Brunnen verwendet. Stattdessen wird aufbereitet was das Zeug hält. Ist ja noch kein Bier, kann man also alles machen, was lebensmittelrechtlich zulässig ist.

Mein Fazit:

Die Zugabe von Sinamar finde ich grenzwertig. PVPP geht gar nicht. Zucker ist mir zumindest unsympatisch, dafür gibt es Malz.

Andererseits finde ich die Zugabe natürlicher Gewürze, die Verwendung unvermälzter Getreide und Früchte in Ordnung.

Das ist dann so ungefähr das, was in unser selbstgebrautes Bier rein darf :)


India Pale Ale (IPA) und Co. in Karlsruhe reloaded

Seit ich vor fast 3 Jahren meinen Artikel über IPA’s in Karlsruhe geschrieben habe ist in der deutschen Bierlandschaft und natürlich auch im Raum Karlsruhe einiges passiert. Es wird also Zeit für eine Fortsetzung.

Vorweg noch eine Begriffserklärung für diejenigen Leser, die mit den Begriffen Kalthopfung bzw. Hopfenstopfen nichts anfangen können. Die Wikipedia hat einen (nicht wirklich guten) Artikel dazu. Ich selbst mag den Begriff Kalthopfung lieber als Hopfenstopfen. Im englischen Sprachraum wird die Methode meist als “dry hopping” bezeichnet.

Im folgenden also eine Liste von Ereignissen und Fakten aus diesem Umfeld mit besonderem Fokus auf die Region Karlsruhe. Wer weitere Infos hat möge diese bitte in die Kommentare schreiben.

  • Deutsche Brauereien beginnen den Trend aus den USA zum “craft beer” langsam aufzunehmen. Darüber, dass dieser Begriff zu deutschem Bier aber nicht so recht passt habe ich einen ausführlichen Blogpost geschrieben.
  • Der Vogelbräu hat im Jahre 2013 ein schönes kaltgehopftes IPA als Saisonbier gebraut, das leider ziemlich teuer war. Die lange Lagerung wäre aus meiner Sicht nicht wirklich notwendig gewesen, dann wäre es vielleicht auch etwas preiswerter geworden.
  • Nicht in Karlsruhe, aber gar nicht so weit weg in Bad Rappenau braut der Hopfenstopfer schöne innovative Biere.
  • Auch wir selbst haben inzwischen schon mehrere gestopfte Biere gebraut, die im Bekanntenkreis sehr gut angekommen sind.
  • Zur Fußball WM 2014 und erneut im Juni 2015 hat Der Vogelbräu das kaltgehopfte untergärige “Samba Bier” gebraut, das mir recht gut geschmeckt hat. Für meinen Geschmack hätte die Kalthopfung ruhig deutlich ausgeprägter sein dürfen.
  • Der Oxford Pub hat die vermutlich beste Bierkarte der Stadt.
  • Der zugehörige Oxford Shop verkauft viele dieser Biere auch für daheim, ist aber leider relativ teuer.
  • Die Brauerei Ketterer aus Pforzheim braut mehre kaltgehopfte Ales als Saisonbiere, die man oft im kleinen Ketterer am Lidelplatz trinken kann
  • Die meisten Karlsruher Getränkemärkte haben keine solchen Biere im Programm. Bisher gibt es nicht eimal die Biere aus der Region (Ketterer, Hopfenstopfer)
  • Die Brauerei Schneider aus Kehlheim braut zwei interessante kaltgehopfte Weizenbiere, das TAP4 und das TAP5. Beide Biere sind bei Getränke Melter in Eggenstein erhältlich.
  • Die Biomarktkette Alnatura verkauft den Riedenburger Doldensud in Ihren Filialen.
  • Vom 25.-26. April findet in Heilbronn die Messe Artbrau statt, auf der innovativen Brauereien aus der weiteren Region vertreten sind.
  • Deutschlandweit gibt es nun mehrere Verbrauchermessen, die sich dem Thema Bier widmen. Die bekannteste ist wohl die Braukunst Live in München.

Update 8.6.:

  • Vergessen habe ich die Braufaktum Kühschränke bei Real und Scheck-In. Da die Firma zu Radeberger gehört sind die natürlich zu Recht umstritten.
  • Die neuen Sorten von Beck’s gibts zwar auch fast überall. IMO können die aber nix.
  • Getränke Schorpp in Bulach verkauft das Distelhäuser Blond zum normalen Kistenpreis. Die drei “Craft” Sorten aber leider nocht nicht.

Warum der Begriff “Craft-Beer” keine gute Bezeichnung für deutsches Bier ist

Eines gleich vorneweg, ich bin ein großer Freund der neuen Vielfalt in der Bierlandschaft und begeisterter Konsument kaltgehopfter Biere.

Mehr noch, ich braue solche Biere zusammen mit meinen Freunden sogar sebst.

Was mir jedoch nicht so recht gefällt ist die Bezeichnung “Craft-Beer”.

Einerseits, handelt es sich mal wieder um einen unnötigen Anglizismus und andererseits, passt seine ursprüngliche Bedeutung nicht so recht in die deutsche Brauereilandschaft.

Gemeint sind damit nämlich Brauereien, die sich in der Abgrenzung zum industriell hergestellten Bier als Brau-Handwerker verstehen. Eine solche Abgrenzung ist in den USA, wo es bis vor rund 20 Jahren ja fast ausschließlich ersteres gab, auch sinnvoll. Man muss schmunzelnd an den Spruch von Oscar Wilde denken: “I find American beer a bit like having sex in a canoe. It’s fucking close to water.”

In Deutschland ist das aber auch heute trotz Radeberger und Co. immer noch deutlich anders, auch wenn unsere Fernsehbiere auf dem besten Weg in Richtung Budweiser und Co. sind.

Zurück zur Bezeichnung “Craft-Beer”. Bei vermutlich 90% der deutschen Brauereien und mit Sicherheit bei 99% der Oberfränkischen handelt es sich nach der amerikanischen Definition um lupenreine Craft-Breweries.

Das Bier das man dort findet ist aber halt (von wenigen Ausnahmen abgesehen) kein (I)PA und auch nicht hopfengestopft.

Was machen wir jetzt?

Den oberfränkischen Brauereien ihr Handwerk abzusprechen wäre schlichtweg eine Frechheit! Im Gegenteil, die untergärigen Kellerbiere fränkischer Brauart sind meistens hervorragend.

Mein Vorschlag:
Wir begraben den Begriff “Craft-Beer” im deutschsprachigen Raum, denn das deutsche handwerklich gebraute Bier braucht sich nicht zu verstecken, auch wenn es sich meist nicht um kaltgehopftes Obergäriges handelt.

Lasst uns lieber von innovativen Brauereien sprechen, denn davon gibt es zum Glück wieder mehr :)


Das wartungsarme Fahrrad

Von Fahrrädern, die zwar technisch möglich sind, die man sich aber nicht kaufen kann

Vor nun fast mehr als 9 Jahren habe ich mein damaliges Fahrrad mit Shimano 21 Gang Kettenschaltung (einer Bauart, die es heute gar nicht mehr gibt) aufgrund schlechter Ganzjahrestauglichkeit ersetzt.

Der Nachfolger war ein Fahrrad mit einer vergleichsweise teuren Rohloff 14-Gang Nabenschaltung in der Hoffnung nun endlich mal ein wartungsarmes Fahrrad zu erwerben.

Letzteres war und ist für mich überaus wichtig, weil ich kein Auto besitze und das Fahrrad daher 24 Stunden am Tag, 7 Tage die Woche und 365 Tage im Jahr einfach funktionieren muss.

Die Entwicklung bei Kettenschaltungen hin zu immer mehr Gängen und noch weniger robusten Ritzeln mit mehr als 7 Kettenblättern hat meine Entscheidung für die Nabenschaltung ja eigentlich bestätigt, wären da nicht ein paar völlig blödsinnige Tatsachen, die die Rohloff Schaltung in letzter Konsequenz dann doch für wartungsarme Fahrräder untauglich erscheinen lassen.

Worum geht es?

Verbleibender Schwachpunkt bei meinem Rad ist die Kette und da gäbe es aus meiner Sicht zwei Lösungen:

  • Ersatz der Schaltungskette durch einen ungekapselten Riemenantrieb
  • Ersatz der Schaltungskette durch eine breite Kette und eine brauchbare Kapselung

Beides wären gangbare Wege aber beide scheitern an unterschiedlichen Gründen. Technische Gründe sind das nicht und das beweist in meinen Augen, dass das Fahrrad selbst von den Fahrradherstellern immer noch nicht als alltagstaugliches Verkehrsmittel angesehen wird.

Die erste Lösung scheitert am Preis. Fahrräder mit Riemenantrieb aka Gates Carbon Drive erfordern leider Spezialrahmen und sind in Verbindung mit der ebenfalls sehr teuren Rohloff Nabenschaltung dann preislich aus meiner Sicht oberhalb der Schmerzgrenze.

Eine Nachrüstung an meinem Rad würde die Anschaffung eines neuen Rahmens bedeuten.

Die zweite Lösung ist das ärgerlichere Problem! Das wäre nämlich technisch preisgünstig ohne Spezialrahmen machbar, wird aber von den Teileherstellern nicht unterstützt. Vollverkleidungen für die Kette wie den Hebie Chainglider gibt es nämlich nur für Schaltungsketten und schlimmer noch, weder die Firma Rohloff noch die Hersteller der Kurbeln liefern breitere Ritzel, wie sie bei Verwendung einer breiteren Kette notwendig bzw. zumindest wünschenswert wären.

So habe ich mich also gerade eben wieder einmal darüber geärgert, dass ich am hinteren Ende der Spannmöglichkeit meiner Kette angelangt bin und nun eine neue wenig haltbare Schaltungskette kaufen muss, die ich eigentlich gar nicht mehr haben möchte.

Ich hoffe ich werde die Verfügbarkeit wartungsarmer Alltagsräder mit aktzeptablem Preis- Leistungsverhältnis noch erleben. An der Technik liegt das nämlich nicht. Vielleicht findet sich ja in den Weiten des Internets jemand mit einem ähnlichen Problem und einer genialen Lösung.

Am Schluß auch noch etwas positives! Mein Fahrrad verfügt über hydraulische Bremsen der Firma Magura. Diese haben meine Erwartungen bzgl. Wartungsarmut vollumfänglich erfüllt und sind aus meiner Sicht ihren vergleichsweise teuren Preis wert.

A Raspbian read-only root-fs HOWTO

In embedded applications it is often a requirement, that the device must be able to sustain a power cycle almost any time.

Unfortunately this is not something which modern operating systems (including GNU/Linux) like very much.

Fortunately in Linux there are workarounds. While there are specialized filesystems like f2fs, the most simple approach is still to just run the OS from a read-only root filesystem.

So here is the solution I made for my brewing hardware.

We bootup our fresh raspbian image install available at

On the HDMI console expand the filesystem and setup i18n (german keyboard in my case).

All steps starting from here can now be done via ssh as well as the HDMI console.

  • Remove some stuff which is not needed or unsuitable for readonly operation:
  • apt-get remove --purge wolfram-engine triggerhappy
    apt-get remove --purge cron anacron logrotate dbus dphys-swapfile
  • Remove X-Server and related stuff:
  • apt-get remove --purge xserver-common lightdm
    insserv -r x11-common
  • auto-remove some X11 related libs
  • apt-get autoremove --purge
  • Install busybox syslog instead of rsyslog
  • The reason for doing this is because we do not want logfiles, but we want to be able to do some debugging (read logfiles). busybox-syslogd does not write logfiles but logs to a ring-buffer in memory which can be displayed using the logread command:

    apt-get install busybox-syslogd
    dpkg --purge rsyslog

The following steps are important, because we do not want any filesystem checks on our headless system at all!

  • Comment do_start in /etc/init.d/
  • Comment do_start in /etc/init.d/
  • ...
    case "$1" in
            echo "Error: argument '$1' not supported" >&2
            exit 3
            # No-op
            echo "Usage: [start|stop]" >&2
            exit 3
  • Comment Operations in /etc/init.d/
  • ...
    case "$1" in
            # Clean /tmp, /lib/init/rw, /run and /run/lock.  Remove the
            # .clean files to force initial cleaning.  This is intended
            # to
            # allow cleaning of directories masked by mounts while the
            # system was previously running, which would otherwise
            # prevent
            # them being cleaned.
            #rm -f /tmp/.clean /lib/init/rw/.clean /run/.clean /run/lock/.clean
            exit $?   
            echo "Error: argument '$1' not supported" >&2
            exit 3
            # No-op
            echo "Usage: [start|stop]" >&2
            exit 3
  • Comment swaponagain ‘swapfile’ in /etc/init.d/
  • Remove a couple of startup scripts:
  • insserv -r bootlogs
    insserv -r sudo
    insserv -r alsa-utils
    insserv -r console-setup
    insserv -r fake-hwclock 
  • Change /etc/fstab as follows:
  • proc              /proc           proc    defaults     0       0
    /dev/mmcblk0p1    /boot           vfat    defaults,ro  0       2
    /dev/mmcblk0p2    /               ext4    defaults,ro  0       1
    tmpfs             /tmp            tmpfs   defaults     0       0
  • append ro in /boot/cmdline.txt:
  • ...  elevator=deadline rootwait ro
  • Make dhclient write its leases file to /tmp instead of /var/lib/dhcp/:
  • rm -rf /var/lib/dhcp/
    ln -s /tmp /var/lib/dhcp

That’s it, have fun with your read-only Raspbian. As far as my brewing software is concerned, there is automated remount-rw/ro support included (see sample configfile).

Offener Port = Sicherheitslücke, ist das BSI wirklich so unfähig?

Soeben trudelt über die Abuse-Abteilung der Firma Hetzner eine Mail des Bundesamt für Sicherheit in der Informationstechnik (BSI) bei uns ein, dass es sich bei der von uns verwendeten IP-Adresse um einen Router mit Sicherheitslücke durch eine “undokumentierte Konfigurationsschnittstelle” handeln würde.

Gemeint ist die Backdoor in Routern, über die Heise in den letzten Tagen mehrfach berichtet hatte.

Nun frage ich mich schon welcher Praktikant beim BSI hier wohl ein script verbrochen hat, dass diese Router finden soll.

Klar, bei handelt es sich um einen Rechner, bei dem der Port 32764 offen ist. Jedem halbwegs in der Netzwerktechnik bewanderten Menschen sollte aber auch klar sein, dass die TCP/IP Protokollfamilie im Gegensatz zu ISO/OSI eben keine klare Trennung zwischen Dienst, Schnittstelle und Protokoll besitzt.

Prinzipiell kann ja jeder Dienst auf jedem Port laufen.

Im gegebenen Fall hat das BSI auf Port 32764 einen ssh-server gefunden und eben keine merkwürdige Backdoor.

Der manuelle Test mit telnet oder netcat hätte das auch bestätigt:

~/ > telnet 32764
Connected to
Escape character is '^]'.
SSH-2.0-OpenSSH_5.5p1 Debian-6+squeeze4
Protocol mismatch.
Connection closed by foreign host.

Ich muss sagen, ich bin enttäuscht. Vom BSI hätte ich mehr erwartet als automatisierte Abuse Emails an alle Betreiber von Rechnern, bei denen auf Port 32764 ein Server läuft.

Letztlich hat dieser Mist nun nicht nur mir, sondern auch der Abuse-Abteilung der Firma Hetzner unnötige Arbeit gemacht, denn ich bin im Netz von Hetzner ganz sicher nicht der Einzige, bei dessen Server auf diesem Port ein Dienst antwortet.

Update: Wieder Erwarten habe ich eine Rückmeldung vom BSI erhalten! Danke dafür. In der Meldung, die vom BSI an Hetzner ging steht wörtlich folgendes:

CERT-Bund hat von heise Security eine Liste von IP-Adressen erhalten, unter denen am 07.01.2014 Konfigurationsschnittstellen betroffener Router öffentlich über das Internet erreichbar waren. Nachfolgend senden
wir Ihnen eine Liste betroffener IP-Adressen in Ihrem Netzbereich mit entsprechendem Zeitstempel (MEZ).

Wer die Scans durchgeführt hat ist daher völlig Unklar. Klar hingegen ist, dass offensichtlich nur auf offene Ports getestet wurde und nicht auf die backdoor. Nach wiederholtem Lesen der Email ist mir inzwischen ehrlich gesagt völlig unklar, weshalb Hetzner diese überhaupt weiltergeleitet hat.

A simple way to localize (latinize) an Openstreetmap style

Based on a request on the german mailinglist back in july, I thought about how the perfect localization of the german mapnik style would look like and finaly implemented something which comes close. Unfortunately up till now I did not document it.

However Reading about a map in manx today, I came to the conclusion, that I really need to do this.

First of all I came up with the following assumptions (valid for all languages using latin script IMO):

  • always prefer mapped names over automated transliteration
  • prefer name:<yourlang> over any other name tags (name:de in my case)
  • prefer int_name over non-latin script
  • prefer name:en over non-latin script if int_name has not been specified
  • transliterate non-latin script as a last resort

So how has this been implemented?

I decided to do it inside the SQL-query. This way it is independent of the rendering Software. It will certainly work at least with mapnik, mapserver and geoserver. Even the proprietary ESRI rendering stuff should actually work :)

Basically any rendering system using a PostgreSQL backend can be easily adapted. Of course your database must provide all the required name columns.

So how would one enable rendering a latin name insead of just the generic name tag?

Assume your style uses something like this for rendering a street-name:

FROM planet_osm_line;

Now just replace this by the following:

SELECT get_localized_name(name,"name:de",int_name,"name:en") as name
FROM planet_osm_line;

Quite easy isn’t it?

Well, here comes the (slightly) more complicated stuff…

Of course PostgreSQL does not provide a get_localized_name function out of the box, we have to install it first. So here is how to do this in two steps:

The get_localized_name function has been implemented in PL/pgSQL and is available at

So first add this function to your database using the following command:
psql -f get_localized_name.sql <your_database>

Second add the transliterate function available at

To compile and install it on GNU/Linux (sorry, I don’t care about Windows) do the following:

  • svn co
  • Install the Server dev package (On Debian/Ubuntu this would be called postgresql-server-dev-x.y, postgresql-server-dev-9.2 in my case)
  • Install the libicu-dev package
  • compile and install calling make; make install
  • On Debian/Ubuntu you would be better off using dpkg-buildpackage and install the resulting package instead of using the make install procedure.

Now enable the function from the shared object using the following SQL command (from a postgresql admin account):

CREATE FUNCTION transliterate(text)RETURNS text
AS '$libdir/utf8translit', 'transliterate' LANGUAGE C STRICT;

Here is how to check if this works:
mydb=> select transliterate('Москва́');
(1 row)

Well that’s it, I hope that this will be useful for some people.

Unfortunately this stuff has currently (at least) two problems:

  • Transliteration of Thai Language uses ISO 11940 instead of the RTGS system
  • Transliteration of japanese Kanji characters end up with a chinese transliteration (e.g. dōng jīng instead of Tōkyō for 東京)

If anybody has some suggestions on how to solve these please post them here!