eCryptfs Fehler und seine Ursache

Raphael Vullriede June 8th, 2010

Seit einigen Tagen ist mir folgender Fehler in dmesg aufgefallen:

Either the lower file is not in a valid eCryptfs format, or the key could not be retrieved. Plaintext passthrough mode is not enabled; returning -EIO

Heute bin ich endlich dazu gekommen, dem Ganzen auf den Grund zu gehen.
Wer nach der Fehlermeldung googelt, findet viele Fälle mit dem gleichen Problem, wie es zu dem Verhalten kommt, scheint aber bei den wenigsten klar zu sein.

Wie kommt es also zu dem Fehler?

Im Gegensatz zu TrueCrypt oder LUKS arbeitet eCryptfs auf Dateiebene, d.h., es werden keine logische Blöcke verschlüsselt, sondern der Inhalt der Datei. Außerdem werden alle notwendigen META-Informationen im Dateikopf abgelegt, sodass außer der Datei keine weiteren Informationen notwendig sind. Das vereinfacht z.B. den Transfer zu anderen Partitionen/Rechnern/Online-Backup erheblich.
Die oben genannte Fehlermeldung scheint nun immer dann aufzutreten, wenn 0-Byte-Dateien in dem eCryptFS-Verzeichnis existieren. Dies darf nie passieren, da selbst bei der Anlage einer leeren Datei wenigstens die META-Informationen im Kopf gespeichert werden müssen. Das kann man sehr leicht nachvollziehen:

Anlage einer leeren Datei im Home-Verzeichnis:

rv@dragonwing:~$ cd
rv@dragonwing:~$ touch ecryptfsTest
rv@dragonwing:~$ ll ecryptfsTest
-rw-r--r-- 1 rv rv 0 2010-06-08 17:11 ecryptfsTest
rv@dragonwing:~$ ls -ltr .Private/ | tail -n 1
-rw-r--r--  1 rv rv   12288 2010-06-08 17:11 ECRYPTFS_FNEK_ENCRYPTED.FWaJYa64rxF88kRDJ3jNxY2hIlwDcigV0J4HVk8Iaq8OE8IcE-EL4NPpak--

Man sieht also, dass diese leere Original-Datei verschlüsselt eine Größe von 12288 Bytes hat. Falls eCryptFS also auf eine leere Datei stößt, meckert es zu Recht die fehlenden META-Informationen an.

Wie kann es nun zu den 0-Byte-Dateien kommen?

Dafür gibt es eine ganze Reihe von möglichen Gründen: Programmabstürze beim Speichern einer Datei, ein alter Ext4-Bug oder wie in meinen Fall eine randvolle Partition ;-) Der notwendige Platz stand einfach mehr zur Verfügung. Ich bin allerding der Meinung eCryptFs sollte dieses im Vorfeld überprüfen, zumal das aus anscheinend relativ häufig vorkommt.

Wie wird man diese Dateien wieder los?

find $HOME/.Private/ -xdev -size 0c

findet die Dateien. Falls sie zur Zeit nicht im Zugriff sind kann man sie gefahrlos löschen, z.B. so:

for i in `find $HOME/.Private/ -xdev -size 0c`; do
  if ! fuser -v $i; then
    rm -f $i
  fi
done

Danach kann man das Log mit

sudo dmesg -c

leeren und sollte wieder Ruhe haben.

Leave a Reply