Systemd und LUKS-Filesysteme

Auf meinem Home-Server habe ich qemu & kvm installiert, mit ein paar laufenden virtuellen Maschinen. Die .img der virtuellen Server sind dabei auf einem LUKS-Device abgelegt, welches beim booten gemountet wird.

/dev/mapper/CRYPT_lv_virt 315G 84G 216G 28% /mnt/virt

Die Schwierigkeit darin ist, dass der Mount vor dem Start von libvirtd und des Services libvirt-guests verfügbar ist, da sonst die virtuellen Maschinen nicht automatisch starten können.

Unter Centos 7, neu mit Systemd kann das sehr einfach über Abhängigkeiten gelöst werden.
Ich habe ein luks.service mit folgendem Inhalt im Systemd Verzeichnis angelegt:

[Unit]
Description=Mount LUKS
Before=libvirtd.service libvirt-guests.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/unlock-luks
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Die wichtigen Parameter sind dabei die Before- und After-Statements, um luks.service vor libvirtd auszuführen.
Der eigentliche Hauptteil des unlocken und mounten übernimmt das Skript unlock-luks, welches von systemd ausgeführt wird, die Devices öffnet/entschlüsselt und sie mountet.

#!/bin/bash
SHELL=/bin/bash
TERM=xterm-256color
HISTSIZE=1000
USER=root
USERNAME=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LANG=de_CH.utf8
HOME=/root
LOGNAME=root

# Read from Dead Space
# can also be a file
KEY=$( dd if=/dev/usbkey1 bs=1024 skip=2 count=4 )
DEVICES=$( blkid | grep crypto_LUKS | cut -d':' -f 1 )
for dev in $( echo "${DEVICES}" )
do
    if cryptsetup isLuks ${dev}
    then
        LVNAME=$( lvs --noheadings -o lv_name ${dev} )
        LVNAME=$( echo $LVNAME )
        logger "$(date) unlock $dev"
        dd if=/dev/usbkey1 bs=1024 skip=2 count=2 | cryptsetup luksOpen ${dev} ${LVNAME} --key-file=- && mount /dev/mapper/${LVNAME}
    fi
done
exit 0

Der Schlüssel ist dabei auf einem USB-Stick, welcher das Script ausliest. Speziell dabei ist, dass der Schlüssel auf einem Bereich zwischen dem MBR und der ersten Partition versteckt ist.

Noch kurz

systemctl enable luks

Das Skript öffnet natürlich nicht nur das LUKS-lv der virtuellen Maschinen, sondern auch alle anderen verschlüsselten Devices.