Verschlüsselte Dateisysteme bei suspend/hibernate automatisch aushängen

Update: Eine etwas verfeinerte und an systemd angepasste Version befindet sich am Ende des Artikels.

Wie der ein oder andere von euch sicherlich bereits mitbekommen hat, habe ich nur Teile meines Notebooks verschlüsselt, da eine vollständige Verschlüsselung nur unnötig Performance fressen würde. Wenn ich meinen Laptop allerdings schlafen schicke (suspend bzw hibernate), will ich nicht jedes Mal manuell die einzelnen Dateisysteme unmounten. Wäre einfach zu viel Aufwand. Allerdings wäre es auch ziemlich dumm, wenn ich sie gemounted lassen würde. Da könnte ich mir die Verschlüsselung direkt sparen. Da ich suspend/hibernate unter ArchLinux mittels der pm-utils realisiere, habe ich mir in /etc/pm/sleep.d ein Script (74encfs genannt; chmod +x nicht vergessen!) angelegt, welches mir die Arbeit abnimmt. So kann ich den Aufwand auf ein Minimum reduzieren und muss die Dateisysteme lediglich manuell mounten, nachdem ich mein System wieder aufgeweckt habe.

Allerdings wäre es hier von Vorteil, wenn vor dem suspend/hibernate alle Prozesse die auf eines der verschlüsselten Dateisysteme zugreifen, beendet würden.

#!/bin/sh

case "$1" in
    hibernate|suspend)
        while [ "`grep ^encfs /etc/mtab`" != "" ]; do
            umount encfs
        done
    ;;
    *) 
        exit $NA
    ;;
esac

Wie ihr seht, startet das Script, wenn es mit dem Parameter hibernate oder suspend aufgerufen wird, eine while-Schleife, die solange läuft, bis in der /etc/mtab kein Eintrag mehr auffindbar ist, der mit “encfs” anfängt.

Könnte man sicherlich noch etwas verfeinern und auf andere Verschlüsselungsmethoden (wie z.B. TrueCrypt) ausweiten, aber für meine Zwecke reicht es.

Update: Da bei ArchLinux mittlerweile systemd zum Einsatz kommt, habe ich den Anlass genutzt, das Script etwas zu verfeinern. Bei jedem mit EncFS gemountetem Dateisystem wird nur noch max. 5x im Abstand von jeweils 5 Sekunden versucht, es auszuhängen. In der ursprünglichen Version konnte das schnell in einer Endlosschleife enden, falls noch irgendwo Zugriffe auf das jeweilige Filesystem stattgefunden haben. Aber auch hier gilt: chmod +x nicht vergessen!

#!/bin/sh
# /usr/lib/systemd/system-sleep/encryptedfilesystems

if [ "$1" = "pre" ];
then
    IFS=$'\n'
    for entry in `grep encfs /etc/mtab`;
    do
        POINT=$( echo $entry | cut -d ' ' -f2 )
        trys=0
        status=256
        until [ $status == 0 ];
        do
            umount $POINT
            status=$?
            trys=$(($trys + 1))
            if [ $trys -gt 5 ];
            then
                echo "Number of re-trys exceeded. Exit code: $status"
                continue
            fi
            if [ $status != 0 ] ; then
                echo "Failed (exit code $status)... retry $trys"
                sleep 5
            fi
        done
    done
    unset IFS
fi