Forum: PC-Programmierung Datei sicher vom USB-Stick lesen, nicht aus dem Cache


von asd (Gast)


Lesenswert?

Hallo,

ich will USB-Sticks und SD-Karten auf Bitfehler beim lesen/schreiben 
testen und hab mir dazu ein kleines Skript geschrieben (Auszug):
1
for((i=1; i<20; i++))
2
do
3
  cp   $quelle $ziel/data_${i}.bin
4
  md5sum       $ziel/data_${i}.bin
5
  md5sum       $ziel/data_${i}.bin
6
  rm           $ziel/data_${i}.bin
7
done

Die zweite md5 Prüfsumme kommt aber so schnell dass ich vermute dass das 
gar nicht ein zweites mal vom Stick gelesen wir sondern aus einem Cache 
kommt. Dann ist die frage ob überhaupt die erste Prüfsumme von Stick 
gelesen wird und nicht auch schon aus dem Cache kommt.
Was könnte ich machen um sicher zu gehen dass wirklich geschrieben und 
dann wirklich gelesen wird? (Linux Mint 14, falls das wichtig ist)

Vielen Dank für alle Hinweise

von Timmo H. (masterfx)


Lesenswert?

Vielleicht reicht es den Stick mit dem Parameter "sync" zu mounten.
Oder aber du verwendest "dd" zum testen. Da gibt es auch 
"conv=fdatasync" als Parameter. Damit schreibst du natürlich ins RAW 
Device, die darauf vorhanden Daten gehen dann natürlich verloren.

: Bearbeitet durch User
von Kaj (Gast)


Lesenswert?

asd schrieb:
> Die zweite md5 Prüfsumme kommt aber so schnell dass ich vermute dass das
> gar nicht ein zweites mal vom Stick gelesen wird

asd schrieb:
> for((i=1; i<20; i++))
> do
>   cp   $quelle $ziel/data_${i}.bin
>   md5sum       $ziel/data_${i}.bin
>   md5sum       $ziel/data_${i}.bin
>   rm           $ziel/data_${i}.bin
> done

asd schrieb:
> Dann ist die frage ob überhaupt die erste Prüfsumme von Stick
> gelesen wird

Ohne jetzt große kenntnisse von shell/bash/batch oder was auch immer zu 
haben: das sieht für mich so aus als ob auch die erste prüfsumme nicht 
vom stick kommt... Ich denke dein script sollte eher so aussehen:

for((i=1; i<20; i++))
do
  cp   $quelle $ziel/data_${i}.bin
  md5sum       $quelle
  md5sum       $ziel/data_${i}.bin
  rm           $ziel/data_${i}.bin
done

Und wenn du jetzt sagst das du das falsch abgeschireben hast: Häng die 
verdamte scriptdatei einfach mit ran!

asd schrieb:
> Dann ist die frage ob überhaupt die erste Prüfsumme von Stick
> gelesen wird und nicht auch schon aus dem Cache kommt.
Wie sollte die erste Prüfsumme denn in einen Cache kommen? Das OS wird 
beim mounten von einem Medium mit sicherheit nicht pauschal ne Prüfsumme 
von jeder datei machen und die in einem Cache ablegen. Aber die erste 
prüfsumme wird mit sichheit nicht vom Stick kommen, weil du die 
prüfsumme beide male von der selben datei machst, nämlich vom ziel!

von Thorsten (Gast)


Lesenswert?

Das Stichwort heisst hier "Direct I/O".

Zum Kopieren könntest Du z.B. "dd" mit der "direct" Option verwenden:

dd if=foo of=/stick/bar oflag=direct

Und für die Prüfsumme:

dd if=/stick/bar iflag=direct | md5sum

Damit gehen die Daten komplett am OS Cache vorbei

von ich (Gast)


Lesenswert?

einfach ein
1
echo 3 > /proc/sys/vm/drop_caches
einbauen (muss aber als root ausgeführt werden. Das löscht den Cache.

von A. H. (ah8)


Lesenswert?

Meines Wissens nach gibt es unter Linux grundsätzlich keine Möglichkeit, 
den Cache zu umgehen. Das gibt das Blockdevice-Interface, mit dem das 
VFS auf die Geräte zugreift, gar nicht her. Das definiert nur eine 
request Funktion, die direkt aus dem bzw. in den Cache liest und. 
schreibt. Auch vermeintliche raw oder direct IO-Operationen müssen 
diesen Weg gehen. Sie können lediglich versuchen, die Lebenszeit 
gecachter Daten möglichst kurz zu halten um so dem gewünschte Verhalten 
möglichst nahe zu kommen. Wirklich ungecachter Zugriff ist aber in 
keinem Fall möglich. Zumindest war das bis zum Kernel 2.4 so, und ich 
glaube nicht, dass sich das unter 2.6 geändert hat.

In Deinem Fall würde ich ein unmount/remount versuchen. Ohne Kenntnis 
dessen, was der Kernel intern so treibt, ist das die meiner Meinung nach 
einzige sichere Methode zu garantieren, dass die Daten wirklich einmal 
über das Device gegangen sind. (Du kannst auch rebooten, dann gibt es 
definitiv keine Zweifel mehr :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.