Results for category "Linux"

98 Articles

Running a Spring Boot JAR service with SELinux enabled

Just a quick reminder how to run a Spring Boot JAR (or any other self JAR executable) with SELinux enabled:

chcon --type=java_exec_t /opt/myapp/spring-boot-app.jar

To make this persistent you have to use the bin_exec_t type as java_exec_t is just an alias:

# apply the bin_exec_t
semanage fcontext -a -t bin_exec_t /opt/myapp/spring-boot-app.jar
# restore SELinux contexts
restorecon -R /opt/myapp

ll -Z /opt/myapp
# should look like
# -rwxr-xr-x. 1 myapp myapp unconfined_u:object_r:bin_t:s0 26500195 Aug 28 08:34 myapp.jar

To let systemd start this service, you have to create a systemd unit file at /etc/systemd/system/myapp.service:

Description=My Spring Boot application



And don’t forget to add the service user, reload the systemd services and enable the myapp.service.

Slow RAID performance with our new Linux storage

During the last months we periodically experienced performance problems with our storage system. Investigating the cause for the slow performance was problematic as we did not have direct shell access and could only rely on crippled information from the web GUI. Yesterday my collagues migrated the storage system from the proprietary operating system solution to Fedora 22.

After some problems with LVM and directory permissions for Samba, the storage went back online today in the morning. We noticed really fast, that our steady slow storage transformed into a “sometimes running fast, sometimes really slow” machine. One thing was, that copying ISOs from and to a Samba share resulted into really bad I/O performance on every VM which uses mounted iSCSI disks. For example, during a copy through SMB our internal JIRA and Confluence were no longer usable as the proxy timed out. Both VMs (JIRA/Confluence and proxy) were stored on the iSCSI disks provided by the storage.

We excluded the Samba daemon and the operating system as root causes for this issue. We tested the performance with help of dd and compared the results with Thomas Krenns. Our eyes exploded as we saw that the performance of our RAID was a magnitude (s)lower than the reference values. Even a software RAID were four times (!) faster than our hardware RAID. For direct read/writes we received constant slow throughput of 40 MByte/s. WTF? We thought about this issue and came to the conclusion that it had to be something with the LSI 9261-8i RAID controller of the storage. A defect on the controller itself seemed to be unlikely. But then we realized, that the Backup Battery Unit of the RAID controller had a defect. Could it be that an erroneuos battery could have such an impact? And indeed, Thomas Krenn supported this thesis: A defect or disabled BBU ensures that the RAID cache gets disabled and with that the performance.

Our BBU replacement is ordered and I am optimistic that we will fix the performance issue. I’ll update this blog post as soon as we have the new battery installed.

Update 2015-09-14: BBU has been installed. The RAID performance is fine now.

Dell XPS 15, Linux and HiDPI

A few weeks ago I bought a new notebook (Dell XPS 15, 15″, 512 GByte SSD, Core i7) for my after-work work and home usage. First of all: it is an awesome fast piece of hardware. Fedora 21 boots up in 3 seconds, Eclipse (STS) starts up in around 7 seconds. But it has some disadvantages regarding the hardware:

  • Having the laptop on the lap bends the case, randomly not releasing the buttons, see
  • At the beginning backspace and space key felt like already used. I must admit that I am using a mechanical keyboard at work and for my standalone PC at home, so every other rubber keyboard sucks 😉
  • Return key feels slightly too small at the beginning.
  • High pitching noise, probably coming from the touchscreen. Most of the time it occurs during scrolling through long documents and having CPU load. I am not sure why this happens.

Especially the problem with the non-releasable buttons drove me crazy at first because it seemed to occur randomly. After some days working with the notebook I accepted this failure. All in all it seems to be a very nice notebook for a developer like me, but…

… The HiDPI support for Linux software just sucks. Linus Torvald statement made his statement at the end of 2012 but the current state is still bad:

  • Default Chromium package has no support for HiDPI; buttons and menus have the wrong scaling. Firefox does support HiDPI and so I set it as my default browser.
  • Scaling of some GTK input fields (radio buttons, checkbox) is wrong, see
  • Using a second display (beamer) totally screws up the X server. I can’t  get a higher resolution than 800*600 when cloning both displays. Not sure, why this happens.
  • IntelliJ (including EAP 14), Eclipse (4.4) and Netbeans (8.x) are having wrong scaled icons. See wiki discussion for Eclipse at

For a list of workarounds, the ArchWiki is the first place to look for.

Fixing segmentation fault in libapt-pkg

I received the message “Segmentation fault” while running an apt-get install. My syslog contained the following lines:

Aug 11 11:34:19 srv kernel: [65729.407484] check-new-relea[12700]: segfault at 7f2dfd94746c ip 00007f2dfc0becd8 sp 00007fffd0671d20 error 4 in[7f2dfc069000+11c000]
Aug 11 11:35:52 srv kernel: [65822.603384] apt-get[12820]: segfault at 7f7d256e346c ip 00007f7d24252cd8 sp 00007fffdbb89140 error 4 in[7f7d241fd000+11c000]

I fixed it with

dpkg-reconfigure libapt-pkg4.12

Use your Uberspace server as relay host for your local postfix instance

Here are the instructions for letting your home server send e-mails with help of your Uberspace account. This small guide is based on Ubuntu 13.04. I assume your Uberspace username is $USUSER and your Uberspace host is $USHOST.

Setup an additional mail address


 ssh $USUSER@$
 vadduser local-server
 # enter a non-trivial password
 # the address "local-server" is now available via $

Setup postfix

apt-get install postfix libsasl2-modules bsd-mailx
# choose "Satellite System" for Postfix server type

Change /etc/postfix/

myhostname =
mydestination =, localhost
relayhost = $
smtp_sasl_auth_enable = true
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_password

Add your newly created mail account

touch /etc/postfix/sasl_password
chmod 600 /etc/postfix/sasl_password
vim /etc/postfix/sasl_password
# add the following line
# :wq
service postfix restart

Send a test mail

mail -s "Test" -- -f root@local-server.internal

tail -f /var/log/syslog should now contain something like

Aug 10 19:52:26 srv postfix/qmgr[11620]: 63EDB13C0F83: from=<root@local-server.internal>, size=309, nrcpt=1 (queue active)
Aug 10 19:52:26 srv postfix/smtp[11626]: connect to $[2001:1a50:11:0:xx:yy:zz:x]:587: Network is unreachable
Aug 10 19:52:26 srv postfix/smtp[11626]: 63EDB13C0F83: to=<>, relay=$[95.143.xx.yy]:587, delay=0.64, delays=0.26/0.12/0.19/0.07, dsn=2.0.0, status=sent (250 ok 1376157144 qp 15391)
Aug 10 19:52:26 srv postfix/qmgr[11620]: 63EDB13C0F83: removed

The Network is unreachable is not important, because I don’t have IPv6 enabled.

Update your HP TouchPad to CyanogenMod 10.1

Yesterday I read the article written by Christoph and thought about updating my current installed CyanogenMod 9 with the current version. Here are the instructions (assuming, you have already CM installed):

  • wget
  • wget
  • Restart the HP TouchPad and select ClockWorkMod Recovery on boot
  • Connect your notebook with the TouchPad via USB cable and select mounts and storage >  mounts USB storage
  • Copy both .zips to the connected USB mass storage device into the directory cminstall (or wherever you want)
  • Select mounts and storage > umount
  • Select wipe data/factory reset > yes
  • Select wipe cache partition > yes
  • Select install zip from sdcard > choose zip from sdcard for both files downloaded before
  • Select reboot system now

How to update the firmware for video codecs is described here. Two remarks: the newest build does work too and use Total Commander for moving the firmware.

Funkauswerter monitord um ActiveMQ-Support erweitern

Unsere bisherigen PlĂ€ne fĂŒr ZABOS sehen vor, dass wir die FunktionalitĂ€t der Alarmierung per SMS ĂŒber FĂŒnfton-Folgeruf (ZVEI) erweitern – nĂ€mlich um die digitalen Protokolle POCSAG und FMS. Unserer bisheriger FĂŒnfton-FolgerufempfĂ€nger ist ein selbstenwickeltes Board mit Mikrocontroller, der die FĂŒnfton-Folgen aufnimmt und dann ĂŒber die serielle Schnittstelle an ZABOS weiterreicht.

Bereits vor einiger Zeit hatten wir begonnen, uns nach Alternativen umzuschauen, denn die Eigenentwicklung der Auswertungssoftware fĂŒr die digitalen Protokolle wĂŒrde zu viel Zeit in Anspruch nehmen. Außerdem war fĂŒr jedes neue ZABOS-System ein neues Mikrocontroller-Board nötig. Da wir keine Hardwareschmiede sind, wollten wir darauf verzichten.
Als Alternativen liefen uns schließlich FMS Crusader ĂŒber den Weg und außerdem auch das Open Source-Tool monitord, das recht gut in unsere zukĂŒnftige Produktstrategie passte.

monitord ist in C++ geschrieben und lĂ€uft sowohl unter Linux als auch unter Windows. Mit einer Lua-Scripting-API kann die FunktionalitĂ€t des Systems erweitert werden. Allerdings wollte ich aus architekturbedingten GrĂŒnden keinen REST-Service auf ZABOS-Seite zum Übermitteln der Alarmierungen schreiben.
Stattdessen sollten die eingehenden Alarmierungen fĂŒr zukĂŒnftige ZABOS-Versionen in einer Message-Queue in Form von ActiveMQ auflaufen.
ZABOS kann dann innerhalb von ActiveMQ z.B. drei verschiedene Topics (zabos.pocsag, zabos.zvei und zabos.fms) abonnieren und die jeweiligen Schleifen im System alarmieren, sobald eine Nachricht in dem jeweiligen Topic veröffentlicht wird. monitord hingegen nimmt die Funksignale ĂŒber zwei Soundkarten auf (damit werden wir das Board mit dem Mikrocontroller und die nötige serielle Schnittstelle los), verarbeitet sie und und publiziert sie im passenden Topic der Queue.

Neben der Lua-API existiert in monitord auch eine eigene Plugin-Schnittstelle die z.B. fĂŒr das MySQL-Plugin genutzt wird. Diese Plugins können dann direkt in C++ geschrieben werden.

Nachdem ich mich mit dem gesamten Konzept sehr schnell angefreundet hatte, schaute ich erst einmal nach, ob ActiveMQ denn irgenwelche Bindings fĂŒr C++ besaß. GlĂŒcklicherweise haben die Jungs von Apache (wie so oft) gute Arbeit geleistet und somit konnte ich mir ActiveMQ-CPP herunterladen und kompilieren. Vorher musste ich noch libaprutil1-dev nachinstallieren.
Das der ActiveMQ-CPP-Distribution beiliegende Beispiel unter src/examples/producers/SimpleProducer.cpp war fĂŒr mein Vorhaben genau der richtige Einstieg – mehr sollte mein Plugin ja auch eigentlich nicht können.

ActiveMQ-CPP hatte ich also soweit installiert – nun ging es daran, monitord mit ActiveMQ bekannt zu machen. Zuerst ließ ich den monitord-Quellcode kompilieren und testete, ob dieser soweit ĂŒberhaupt in Ordnung war.
Das Kompilieren funktionierte zwar, allerdings konnte der Daemon meine Soundkarte nicht erkennen. Erstaunlicherweise stand im Log, dass er ĂŒber OSS auf die Soundkarte zugreifen wollte, obwohl ich explizit in der monitord.xml als Soundkarte “plughw” verwendet und auch beim Kompilieren –with-alsa mitgegeben hatte. Ich schaute mir die configure-Ausgabe noch einmal an und stellte fest, dass das Paket libasound2-dev fĂŒr ALSA benötigt wurde – ist irgendwie auch klar -, ich es aber nicht installiert hatte. Das configure-Script brach aber bei fehlenden Headern nicht ab, sondern kompilierte stattdessen mit OSS-Support.
Ich also libasound2-dev nachinstalliert und meine Soundkarte wurde schließlich erkannt.

Die rudimentĂ€re Logik zum Laden der ActiveMQ-Konfiguration innerhalb der monitord.xml, dem Initalisieren der Verbindung u.s.w. tipperte ich in knapp drei Stunden runter, nachdem ich immer wieder mal in die C++-Dokumentation schauen musste. GlĂŒcklicherweise konnte ich viel von dem ActiveMQ-Beispiel als auch von dem monitord-MySQL-Plugin ĂŒbernehmen.

Anschließend erweiterte ich die und um die nötigen ActiveMQ-AbhĂ€ngigkeiten und konnte mit –with-activemq auch mein Plugin kompilieren.

Das ActiveMQ-Plugin ist noch nicht vollstĂ€ndig, sowohl Testen als auch das Veröffentlichen der Nachrichten in der Queue ist noch nicht implementiert. Ist aber auch nicht wild, da es mir erst einmal um die Evaluierung des Konzepts ging. Und das ging alles recht schnell, obwohl ich von C++ und den GNU-Buildtools null Ahnung habe 😉
Die geĂ€nderten Sourcen habe ich auf Github veröffentlicht – enthĂ€lt natĂŒrlich noch massig Bugs und ist ungetestet.

Use latest webOS SDK with Virtualbox 4.0 running on Ubuntu

HP does not allow the installation of the emulator in a VirtualBox running version 4.0+ because Oracle changed some APIs between 3.x and 4.x.

If you already have VirtualBox 4.0 installed, you have to follow these steps (do a backup of your VirtualBox configuration and virtual machines!):

# add non-free to VirtualBox source in /etc/apt/sources.list
sudo echo "deb maverick contrib non-free" >> /etc/apt/sources.list
sudo apt-get update
# replace virtualbox-4.0 by virtualbox-3.2
sudo apt-get install virtualbox-3.2
# install 320x400 VM
# install 320x480 VM
# finally replace virtualbox-3.2 by virtualbox-4.0
sudo apt-get install virtualbox-4.0

Howto: Ein Git-Repository auf resetten

Hin und wieder fĂŒhrt man einen Commit durch, von dem man im Nachhinein denkt: “Verdammte Axt”. So geschehen bei einem meiner, die ich seit lĂ€ngerer Zeit von unserem internen Subversion-System auf das öffentliche Git-Repository bei Sourceforge umstellen wollte.
Mein initialer Commit enthielt vertrauliche Informationen, die blöderweise nicht hÀtten auftauchen sollen, da ich in meiner .gitignore einen Typo hatte.
In solch einem Fall besteht nun die Möglichkeit, mit Hilfe von diversen Git-Kommandos die Datei zu entfernen oder aber man setzt das Repository komplett neu auf.
Um bei das Repository per Hand neu zu erstellen, muss man Administrator-Rechte im Projekt besitzen und sich mit

ssh -t USER, create
# bzw.

auf dem einloggen.

Mit den folgenden Kommandos werden nun alle Git-Dateien des Projekt-Verzeichnisses gelöscht und das Repository neu initalisiert.

cd /home/scm_git/P/PR/PROJECT
rm -Rf PROJECT/*
git --git-dir=PROJECT/ init --shared=all
vim PROJECT/description