Technikbezogene Artikel, die nichts mit Fotografie zu tun haben.

34C3 – I talked about OmNomNom

Between Christmas and New Year’s Eve I attended the 34C3 in Leipzig. I visited the congress before but it was the first time that I gave a presentation (at the congress) myself. At the last day of the 34C3 I talked about OmNomNom, my open source Telegram canteen chatbot, as part of the Lightning Talks. I explained the architecture of the software and the infrastructure I use to run and deploy the bot.

All talks were recorded, you can check out my talk in the embedded video. It starts at 01:24:45.

If the video does not work you can check YouTube or Despite the fact that my talk was a little too long for the five minutes time slot it was a nice experience to talk on such a big stage and luckily I was done with the important part of my talk when the time was up.

Veröffentlicht unter Tech | Verschlagwortet mit , , , , | 1 Kommentar

Booting a live system without a USB stick

For some maintenance tasks you need a linux live system. For example when you or some updates broke your system or you want to resize the partitions of your hard disk.

The common way is to download a live system, searching for your lost USB stick for 30 minutes, flashing the system onto the stick and then you can finally start to work on your system. It is the same processes every time and I really don’t like repetitive work. So I was looking for a better solution.

It turns out that GRUB is able to boot a simple ISO image from your local hard disk. I am using Arch Linux to configure my GRUB but it should work similarly with other distributions.

At first you have to download an ISO image. (e.g. Arch Linux, but every other distribution should also work.)
You have to save it to a location that is accessible by GRUB. As most parts of my hard disk are encrypted I have chosen to increase my unencrypted /boot partition and saved the ISO image to /boot/iso/arch.iso.

Of course GRUB needs to know about this image. One way is to define an additional menu entry in /etc/grub.d/50_arch_live. You have to adjust the imgdevpath to your partition with the ISO image and isofile and to the path of the ISO image inside of the partition. /dev/sda1 is my boot partition and /iso/arch.iso is the image in /boot/iso/arch.iso.

exec tail -n +3 $0      
# This file provides an easy way to add custom menu entries.  Simply type the                   
# menu entries you want to add after this comment.  Be careful not to change                    
# the 'exec tail' line above.                   

menuentry 'Arch Linux Live' {                   
        set imgdevpath="/dev/sda1"              
        set isofile='/iso/arch.iso'             
        loopback loop (hd0,1)$isofile           
        linux (loop)/arch/boot/x86_64/vmlinuz archisodevice=/dev/loop0 img_dev=$imgdevpath img_loop=$isofile
        initrd (loop)/arch/boot/x86_64/archiso.img                                              

Now you only have to rebuild the GRUB configuration:

$ grub-mkconfig -o /boot/grub/grub.cfg 
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux
Found initrd image(s) in /boot: intel-ucode.img initramfs-linux.img
Found fallback initrd image(s) in /boot: intel-ucode.img initramfs-linux-fallback.img

After the next reboot you should have an additional menu entry in GRUB that boots the live system.

Veröffentlicht unter Tech | Verschlagwortet mit , , , | Hinterlasse einen Kommentar

Improvised NGINX Maintenance Page

Sometimes I need to do some maintenance work on a webserver and I want to inform the users about it. Most of my websites run behind a NGINX reverse proxy which makes it quite easy to serve a maintenance page from there. This has the advantage that the maintenance page will even be served when the backend server is completely offline.

I was looking for a way to serve a short message without the need of an additional HTML document. Luckily the rewrite module of NGINX implements the return statement which I can use to accomplish this.

Here is an example:

server {
    listen          80;

    location / {
        add_header Content-Type text/plain;
        return 200 "Down for maintenance. Will be back soon.";

    location /maintenance {
        return 503;

Unfortunately most browsers will throw an error when you return a string with another status code than 200. But for most of my use cases it is enough and if you need more flexibility you can always use an extra HTML document in combination with the return statement or the error_page statement.

Veröffentlicht unter Tech | Verschlagwortet mit , , | Hinterlasse einen Kommentar

Deploy a Hetzner server in under three minutes

In the process of automation for my private server infrastructure I came along the task to install the base operating system with as less user interaction as possible. As I primary use Hetzner servers for my infrastructure I found an easy way to do this. When you have a Hetzner server you can boot your server into a rescue life system. There you can do all kinds of administration to fix your system or you can install a complete new one. There is a script called installimage in the rescue system which can be used to install different operating systems. Usually the script opens an editor where you configure your server and then it bootstraps your system. But as manual configuration really sucks in an automated environment I decided to write an ansible playbook to do this for me.

With this playbook it takes under three minutes to complete a Debian Jessie installation:

$ time ansible-playbook deploy_debian_hetzner.yml -e ''
PLAY [] *************************************************

TASK [setup] *******************************************************************
ok: []

TASK [copy ssh key] ************************************************************
changed: []

TASK [run installimage] ********************************************************
changed: []

TASK [remove dummy lv] *********************************************************
changed: []

TASK [mount root file system] **************************************************
changed: []

TASK [remove dummy lv mount] ***************************************************
changed: []

TASK [unmount root file system] ************************************************
ok: []

TASK [reboot host] *************************************************************
changed: []

TASK [wait for host to be up again] ********************************************
ok: [ -> localhost]

PLAY RECAP *********************************************************************    : ok=9    changed=6    unreachable=0    failed=0   

real	2m51.937s
user	0m17.600s
sys	0m3.130s

You can find the full playbook and detailed instructions at GitHub. If you extend the playbook for more use cases feel free to open a pull request.

Veröffentlicht unter Tech | Verschlagwortet mit , , , | Hinterlasse einen Kommentar

Find matching SSL certificates and keys

Sometimes I have multiple SSL certificates and keys and have no idea which of them belong together. Recently I found out that there is an easy way to test this.

[max@gaia]$ ls
certificate.crt  privateKey.key

[max@gaia]$ openssl x509 -noout -modulus -in certificate.crt | openssl md5
(stdin)= 5eaa10f15f3e4b6f93167a5c48e7498c

[max@gaia]$ openssl rsa -noout -modulus -in privateKey.key | openssl md5
(stdin)= 5eaa10f15f3e4b6f93167a5c48e7498c

If the two MD5 hashes are equal you have found a matching pair.

If you want to understand why the modulus in the certificate and key are equal I recommend to read more about the RSA algorithm.

Veröffentlicht unter Tech | Verschlagwortet mit , , | Hinterlasse einen Kommentar

TechTalk: Shell we begin?

Anfang Januar habe ich im Rahmen der TechTalks der Freitagsrunde einen Vortrag mit dem Titel „Shell we begin?“ gehalten. Der knapp zweistündige Vortrag ist ein Querschnitt durch die Grundlagen der Shell-Benutzung und eine kuze Einführung in das Scripting mit der Shell.

Den kompletten Videomitschnitt des Vortrags findet ihr auf Youtube und die zugehörigen Folien auf der Seite der Freitagsrunde.

Veröffentlicht unter Tech | Verschlagwortet mit , , , , , | Hinterlasse einen Kommentar

Rainmeter Skin Pack (BlueVision Mod) v2

Den ersten Part dieses Artikels findet ihr hier:
Artikel: Rainmeter MSI Afterburner Theme

Seit geraumer Zeit nutze ich nun Rainmeter um mir auf dem Desktop statistische Informationen zu meinem Rechner anzeigen zu lassen, um nicht immer den Taskmanager und andere Programme bemühen zu müssen. Dabei habe ich sowohl Funktionalität, als auch Design immer wieder angepasst. Da es andere vielleicht interessiert möchte ich hier meine aktualisierte Version bereitstellen. Den Download findet ihr am Ende des Artikels, aber nun zu den Unterschieden im Detail:




Veröffentlicht unter Software, Tech | Verschlagwortet mit , , , | Hinterlasse einen Kommentar

Rainmeter MSI Afterburner Theme

Rainmeter ist ein geniales Tool, um allerhand Informationen auf (oft) künstlerische Art und Weise auf dem Desktop anzuzeigen. Viele Infos – wie z.B. die CPU Auslastung oder den Netzwerktraffic – kann man bereits mit den integrierten Tools auslesen und Anzeigen, Dinge wie die GPU Auslastung, FPS oder GPU Core Clock jedoch nicht.

Der findige User stangowner hat dafür ein Plugin bereitgestellt, mit dem man Werte aus dem bekannten Tool MSI Afterburner auslesen kann. Den Download findet ihr hier: Klick!

Da das bereitgestellte Widget nicht besonders hübsch anzusehen ist und mir das BlueVision Theme sehr gut gefallen hat, habe ich mithilfe der gegebenen Elemente eigene Widgets erstellt:

MSIAfterburner Rainmeter

Der Autor des BlueVision Themes hat zwar selbst auch Skins dafür erstellt, jedoch habe ich keinen Download dafür gefunden. Mein Design ist (wie den meisten wahrscheinlich auffallen wird) einfach eine (leicht angepasste) Kopie des Designs für die CPU Auslastung.

Für mein System habe ich mir noch ein paar weitere Widgets eingerichtet, wie z.B. eine angepasste „Total CPU Load“ Anzeige oder einer „HDD Load“ Anzeige. Im gesamten sieht das bei mir dann so aus:


Meinen gesamten Skin könnt ihr euch hier runterladen:
Artikel: Rainmeter Skin Pack (BlueVision Mod) v2

Veröffentlicht unter Software, Tech | 2 Kommentare

Reservierter Speicher in ext[2,3,4] Dateisystemen

Als ich vor ein paar Tagen meine Home-Partition verkleinern wollte, stellte ich folgende Merkwürdigkeit fest:

ekeih@midgard> df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/vgroup-root   20G   13G  6.3G  67% /
/dev/sda1                118M   52M   58M  48% /boot
/dev/mapper/vgroup-home   84G   78G  1.4G  99% /home

Nun, was ist daran merkwürdig? 78G + 1.4G = 79.4G != 84G. Es fehlen also fast 5 Gigabyte auf meiner Home-Partition und auf meiner Root-Partition geht die Rechnung auch nicht so wirklich auf.

Woran liegt das? Seit ext2 gibt es die Möglichkeit einen Teil des Speichers für einen bestimmten Benutzer oder eine bestimmte Gruppe zu reservieren. Die Idee dahinter ist es, sicherzustellen, dass selbst wenn normale Benutzer die gesamte Platte vollgeschrieben haben, noch Speicher vorhanden ist, um zum Beispiel Logeinträge schreiben zu können oder Ähnliches.
Standardmäßig werden 5% jeder Partition für den Root-Benutzer reserviert. Diese tauchen dann zum Beispiel auch nicht in der Ausgabe von df auf.

Den aktuellen Wert findet man mit tune2fs raus:

ekeih@midgard> tune2fs -l /dev/mapper/vgroup-home | grep 'Reserved block count'

Reserved block count:     1114112

Auf meiner Root-Partition klingt das auch vernünftig, aber für die Home-Partition ist das Quatsch. Dort schreibt nämlich nur mein normaler Benutzeraccount hin und die reservierten 5 Gigabyte sind verschwendet.

Die Größe des reservierten Speichers kann man ebenfalls mit dem Tool tune2fs festlegen. Das -m 0 gibt an, dass 0% der Partition reserviert werden sollen.

root@midgard> tune2fs -m 0 /dev/mapper/vgroup-home 

tune2fs 1.42.9 (28-Dec-2013)
Setting reserved blocks percentage to 0% (0 blocks)

ekeih@midgard> tune2fs -l /dev/mapper/vgroup-home | grep 'Reserved block count'

Reserved block count:     0

Jep, das wars. Nichts kompliziertes, aber ich hatte davon vorher noch nie was gehört und ich bin mir sicher, dass es noch mehr Leute gibt, bei denen ungenutzter Speicher vergammelt.

Veröffentlicht unter Tech | Verschlagwortet mit , | Hinterlasse einen Kommentar

LVM Volume verkleinern

Als Notiz für mich selber, damit ich das in Zukunft nicht wieder ergooglen muss und als Hilfe für jeden, der auch wissen möchte, wie man ein LVM Volume verkleinert:

Vertippt man sich bei den Größenangaben oder irrt sich einfach in der Zahl, können hierbei sehr schnell mal Daten verloren gehen. Man muss also unbedingt vorher ein Backup anfertigen!
Alle Befehle müssen als root ausgeführt werden.
[…] sind Zahlenwerte in der Ausgabe, die ich mir nicht alle gemerkt habe.

Volume unmounten

root@midgard> umount /dev/mapper/vgroup-home

Dateisystem prüfen

root@midgard> e2fsck -f /dev/mapper/vgroup-home

e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/mapper/vgroup-home: [...]/[...] files (1.0% non-contiguous), [...]/[...] blocks

Dateisystem verkleinern

root@midgard> resize2fs -p /dev/mapper/vgroup-home 80G

Resizing the filesystem on /dev/mapper/vgroup-home to [...] (4k) blocks.
Begin pass 2 (max = [...])
Begin pass 3 (max = [...])
Begin pass 4 (max = [...])
The filesystem on /dev/mapper/vgroup-home is now [...] blocks long.

LVM Volume verkleinern

Das LVM Volume muss mindestens so groß sein, wie das Dateisystem. Macht man es kleiner, gehen die Daten, die nicht reinpassen, verloren.

root@midgard> lvreduce -L 80G /dev/mapper/vgroup-home

WARNING: Reducing active logical volume to 80.00 GiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce home? [y/n]: y
Reducing logical volume home to 80.00 GiB
Logical volume home successfully resized

Dateisystem prüfen

Nun wird nochmal das verkleinerte Dateisystem überprüft. Sollte das fehlschlagen, ist das der richtige Zeipunkt, um die Backups auszupacken ;-)

root@midgard> e2fsck -p /dev/mapper/vgroup-home

e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/mapper/vgroup-home: [...]/[...] files (1.0% non-contiguous), [...]/[...] blocks

Dateisystemgröße überprüfen/anpassen

Mit einem weiteren resize2fs ohne Größenangabe wird versucht, das Dateisystem auf die maximale Größe (also die des LVM Volumes) anzupassen. Hat man beim Verkleinern des LVM Volumes exakt die gleiche Größe verwendet wie beim Verkleinern des Dateisystem, sollte man hier nur die Ausgabe bekommen, dass es nichts zu tun gibt.
Ist das LVM jedoch größer als das Dateisystem, wird das Dateisystem entsprechend vergrößert, sodass man wirklich den gesamten Platz ausnutzt.

resize2fs -p /dev/mapper/vgroup-home

Volume wieder mounten

Nun kann man das Volume bei Bedarf wieder ganz normal mounten und sich freuen, dass man sich nicht das ganze Dateisystem kaputt gemacht hat!

mount /dev/mapper/vgroup-home /home
Veröffentlicht unter Tech | Verschlagwortet mit , , | Hinterlasse einen Kommentar