Das Dateisystem ReiserFS wird nicht mehr gepflegt, zumindest nicht in Version 3. Das ist bedauerlich, denn ReiserFS kann viele kleine Dateien platzsparend speichern und hat auch sonst ein paar Vorzüge. Allerdings scheint es einen ernsthaften Bug zu geben.
Wie hier beschrieben, habe ich versucht, die Änderungszeitstempel von einigen hunderttausend Dateien zu setzen.
Das Problem: Mit dem Kernel 2.6.26-xen-686 (Debian) gibt es nach etwa 1000 bis 7000 Änderungen auf einem ReiserFS (auf einem Raid5) einen plötzlichen Reset. Das ist nicht das, was man normalerweise von Linux erwartet. Nun muss ich wohl auch von ReiserFS abraten.
Mit dem Kernel 2.6.22-3-k7 und ext3 ging das ganze problemlos, aber die Dateisystemumstellung machte natürlich eine weitere Umkopieraktion nötig.
Sonntag, 7. Juni 2009
nicht glücklich mit ReiserFS
Backups! 10: modification time wiederherstellen
Wegen eines Fehlers beim Umkopieren eines großen Datenbestands sind mir die Änderungszeitstempel (modification time, mtime) abhanden gekommen. Ein weiterer guter Grund, ein Backup zu haben!
Um die Zeitstempel wiederherzustellen, ohne die Dateien selbst zu überschreiben, habe ich aus dem Backup eine Liste erzeugt, in der Dateipfade und Zeiten getrennt durch
Die Einträge in dirfilelist.txt sehen dann etwa so aus:
Das folgende Script liest diese gespeicherten Daten und ändert die Dateien auf dem Zielsystem:
Die äußere Schleife bewirkt, dass die Liste gleich um die abgearbeiteten Einträge (evtl. abzüglich einer Zeile zu wenig) bereinigt wird, verhindert aber, dass das Script terminiert. Man kann es also auch mal abbrechen, muss dafür aber die Logfiles im Auge behalten.
Die Scripte sind nicht unbedingt elegant, und natürlich gibt es viel Raum für Verbesserungen. Vor allem an der Geschwindigkeit lässt sich sicher noch etwas machen, wenn man z.B. Aufrufe von stat einspart.
Wie dem auch sei: Have a backup!
Um die Zeitstempel wiederherzustellen, ohne die Dateien selbst zu überschreiben, habe ich aus dem Backup eine Liste erzeugt, in der Dateipfade und Zeiten getrennt durch
" #+# "
gespeichert werden. Das geht z.B. mit stat
, und zwar so:#!/bin/sh
ifs_backup="$IFS"
TARGETDIR=/actual/place
find . | while IFS= read -r DIRFILE; do
IFS="$ifs_backup"
MODTIME=`stat -c %y "${DIRFILE}"|sed -s "s/\..*//"`
DIRFILE2="${TARGETDIR}"`echo -n "${DIRFILE}"|sed -s "s/^.//"`
echo "${DIRFILE2} #+# ${MODTIME}">> dirfilelist.txt
done
Die Einträge in dirfilelist.txt sehen dann etwa so aus:
/home/adorno/test/script.sh #+# 2009-06-06 15:23:00
Das folgende Script liest diese gespeicherten Daten und ändert die Dateien auf dem Zielsystem:
#!/bin/sh
ifs_backup="$IFS"
while true; do
COUNT=0
cat dirfilelist.txt | while IFS= read -r DIRFILE; do
IFS="$ifs_backup"
DIRFILE2=`echo "${DIRFILE}"|sed -s "s/\ #+#\ .*//"`
NEWMODTIME=`echo "${DIRFILE}"|sed -s "s/.*\ #+#\ //"`
if [ -e "${DIRFILE2}" ]; then
MODTIME=`stat -c %y "${DIRFILE2}"|sed -s "s/\..*//"`
touch -cm -d "${NEWMODTIME}" "${DIRFILE2}"
NEWTIME=`stat -c %y "${DIRFILE2}"|sed -s "s/\..*//"`
echo "${DIRFILE2} has modification time ${MODTIME}, changed to ${NEWMODTIME}. Result: ${NEWTIME}" >> mtimeset.log
COUNT=$((COUNT + 1))
else
echo ${DIRFILE2}" does not exist!" >> mtimeset_error.log
fi
if [ ${COUNT} -gt 10000 ]; then
echo "Deleting 10000 lines from dirfilelist.txt."
sed '10001,$w dirfilelist2.txt' dirfilelist.txt >/dev/null
mv dirfilelist2.txt dirfilelist.txt
break;
fi
done
done
Die äußere Schleife bewirkt, dass die Liste gleich um die abgearbeiteten Einträge (evtl. abzüglich einer Zeile zu wenig) bereinigt wird, verhindert aber, dass das Script terminiert. Man kann es also auch mal abbrechen, muss dafür aber die Logfiles im Auge behalten.
Die Scripte sind nicht unbedingt elegant, und natürlich gibt es viel Raum für Verbesserungen. Vor allem an der Geschwindigkeit lässt sich sicher noch etwas machen, wenn man z.B. Aufrufe von stat einspart.
Wie dem auch sei: Have a backup!
(Seite 1 von 1, insgesamt 2 Einträge)