Datei-Uhrzeit u.U. falsch bei vfat-Dateisystemen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
chhab
Beiträge: 36
Registriert: 16.10.2003 22:16:56
Wohnort: Haimhausen
Kontaktdaten:

Datei-Uhrzeit u.U. falsch bei vfat-Dateisystemen

Beitrag von chhab » 24.11.2003 12:45:58

Hallo zusammen,

ich bin beim Schreiben eines bash-Skripts auf ein Problem gestoßen, das mich an meinem Verstand zweifeln läßt (noch mehr als sonst eh schon :wink: ).

Mein System: Debian Woody 3.0r1 mit allen Security-Updates, Kernel 2.4.18-bf2.4

Das Problem:
- ich mounte ein Laufwerk, auf dem sich ein vfat-Dateisystem befindet
- dann kopiere ich eine Datei auf das gemountete Laufwerk mittels cp -a ...
- diese Datei hat eine Uhrzeit mit ungerader(!) Sekundenzahl
- ein ls --full-time ... zeigt, daß die Uhrzeiten zwischen Original und Kopie absolut identisch sind
- das Laufwerk wird aus- und mit mount wieder eingebunden

Soweit ganz normal, nur jetzt kommt der Hammer.
Jetzt ist die Sekundenzahl der Datei auf dem vfat-Laufwerk um 1 niedriger als ursprünglich!
Das ist auf meinem System mit Dateien unterschiedlicher Größe/Datum/Uhrzeit absolut reproduzierbar. Ich habe eine Windows-Partition (fat32) und einen USB-Speicherstick mit vfat. Bei beiden Laufwerken ist dieser Effekt zu beobachten. Bei Laufwerken mit ReiserFS und ext2 tritt der Effekt nicht auf.

Wird eine Datei mit gerader Sekundenzahl auf eines dieser vfat-Laufwerke kopiert, stimmt die Sekundenzahl auch nach umount und mount.

Das Problem tritt nicht auf unter SuSE 7.3 und Cygwin.


Weitere Infos:
1) Ich habe nach dem Kopieren der Datei mit ungerader Sekundenzahl auf das vfat-Laufwerk noch viele weitere Dateien auf das Laufwerk kopiert, um Linux zu zwingen die eigentliche Datei aus dem RAM-Puffer auf das Laufwerk zu schreiben.
Auch dann zeigt ls --full-time ... die richtige Uhrzeit der Datei an, also mit ungerader Sekundenzahl.
Erst nach einem umount / mount ist die Uhrzeit um eine Sekunde zu klein (gerade).

2) Ich habe die Datei mit ungerader Sekundenzahl unter Woody auf den USB-Stick mit vfat kopiert, umount durchgeführt und SuSE 7.3 gebootet. Dort wird dann ebenfalls eine zu kleine Sekundenzahl angezeigt. Daraus folgere ich, daß die Datei auf dem vfat-Laufwerk tatsächlich eine Uhrzeit hat, bei der die Sekundenzahl um eins zu niedrig (gerade) ist.
Woody hat also kein Problem beim Lesen der Uhrzeit, es schreibt wirklich die falsche Sekundenzahl auf das vfat-Laufwerk.


Hier noch die für meine vfat-Laufwerke relevanten fstab-Eingräge:
...
/dev/hda1 /mnt/winc vfat noauto,user 0 2
/dev/sda /mnt/penhdd auto noauto,user 0 0
...


Jetzt meine Frage und Bitte:
- Kann mir das einer erklären? Wenn ja, dann schon mal Hut ab :wink:
- Könnt ihr diesen Effekt auf eurem System bestätigen?

Testvorgang:
- "touch test.txt" solange durchführen, bis "ls --full-time test.txt" eine ungerade Sekundenzahl anzeigt
- ein vfat-Laufwerk mounten
- mittels "cp -a test.txt ...." Datei auf das vfat-Laufwerk kopieren
- vfat umount
- vfat mount
- "ls --full-time" auf Datei auf dem vfat-Laufwerk anwenden und schauen ob die Uhrzeit stimmt oder nicht - bei mir ist sie um eine Sekunde zu klein


Danke für euer Bemühen und
Viele Grüße

Christian

LittleBoy
Beiträge: 718
Registriert: 30.04.2002 14:32:26

Beitrag von LittleBoy » 25.11.2003 18:10:55

Ursache dafür ist eine Eigenheit von DOS, was nur die Sekundenanzahl/2 in der FAT speichert - dafür kann man aber den Wert "13:00:60" eintragen, was einige Viren genutzt haben, um eine erfolgreiche Infektion der Datei zu erkennen....

Ich vermute jetzt mal, dass der VFAT-Treiber entweder das letzte Bit als eine Art Flag verwendet, oder dass das letzte Bit irgendwie zufällig erzeugt wird...

chhab
Beiträge: 36
Registriert: 16.10.2003 22:16:56
Wohnort: Haimhausen
Kontaktdaten:

Beitrag von chhab » 25.11.2003 19:30:05

Hallo LittleBoy,

beim Recherchieren bin ich inzwischen auch auf die Info gestoßen, daß zumindest die Urversion von FAT nur Sekunden/2 abgelegt hat, um so ein Bit zu sparen.

An dieser Stelle muß ich eine Aussage von meinem Einleitungstext revidieren:
Dort habe ich behauptet, daß unter SuSE 7.3 die Datei-Uhrzeit sekundengenau abgelegt wird. Das ist aber falsch. Auch unter SuSE 7.3 werden ungerade Sekunden zu geraden Sekunden. Beim Testen habe ich wohl einen umount / mount - Zyklus vergessen. Sorry für die Falschinfo.

Es bleiben aber noch zwei Punkte, die mir noch nicht klar sind:
1) Unter Windows haben Dateien auf FAT32-Systemen eine sekundengenaue Uhrzeit. Vom FAT32-Filesystem her besteht die Beschränkung auf Sekunden/2 also nicht mehr.
Warum unterstützt der vfat-Treiber das also noch nicht oder wenn er es unterstützt, warum ist er dann defaultmäßig so "schräg" eingestellt?

2) Beim Lesen von Dateien auf vfat-Laufwerken von Woody aus, können Dateien durchaus gerade und ungerade Sekunden haben. D.h. der vfat-Treiber kann die Uhrzeit sekundengenau lesen aber irgendwie zumindest defaultmäßig nicht schreiben. Was hat das für einen Grund?

Ich werde mir in den nächsten Tagen mal den Source-Code zum vfat-Treiber anschauen. Vielleicht finde ich dort die Antworten...

Grüße
Christian
Zuletzt geändert von chhab am 25.11.2003 22:18:30, insgesamt 1-mal geändert.

chhab
Beiträge: 36
Registriert: 16.10.2003 22:16:56
Wohnort: Haimhausen
Kontaktdaten:

Beitrag von chhab » 25.11.2003 22:03:51

Halloechen,

ich habe mir gerade die Spek zu FAT32 von Microsoft reingezogen. Jetzt ist mir das ganze klarer.
Auch unter FAT32 hat die Uhrzeit für die letzte Dateiänderung eine Auflösung von 2 Sekunden.
Time Format. A FAT directory entry time stamp is a 16-bit field that has a granularity of 2 seconds.
Here is the format (bit 0 is the LSB of the 16-bit word, bit 15 is the MSB of the 16-bit word).
Bits 0 4: 2-second count, valid value range 0 29 inclusive (0 58 seconds).
Bits 5 10: Minutes, valid value range 0 59 inclusive.
Bits 11 15: Hours, valid value range 0 23 inclusive.
Allerdings hat die Uhrzeit der Dateierstellung eine höhere Auflösung von 1/10 Sekunden. Hier sind also auch ungerade Sekunden möglich. Die habe ich gesehen und daraus geschlossen, daß die Datei-Uhrzeit ungerade sein kann. Das gilt aber nicht für die Uhrzeit der letzten Änderung.

Zusammenfassung: Unter FAT (...12,16,32...) hat die Uhrzeit der letzten Dateiänderung eine Auflösung von 2 Sekunden wobei folgende Werte möglich bzw. erlaubt sind: 0, 2, 4, ...58 Sekunden.

Konsequenz unter anderem: Man kann nicht - und das wollte ich in meinem bash-Skript machen - anhand des Datums / der Uhrzeit der letzten Dateiänderung festellen, ob eine Datei auf einem vfat-Dateisystem identisch mit einer Datei auf einem ext2/ext3/ReiserFS... ist, da diese Filesysteme eine unterschiedlich Auflösung in ihren Dateiuhrzeiten haben.
Also:

Code: Alles auswählen

  if [ file1_vfat -nt file2_ext2] 
oder

Code: Alles auswählen

  if [ file1_vfat -ot file2_ext2] 
ist in einem solchen Fall nicht sinnvoll.

Grüße
Christian

Antworten