Datei sicher vom USB-Stick lesen, nicht aus dem Cache

Gast #3682220
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
Gast #3682242
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!
Gast #3682256
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
#3682308
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 :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren