Autor Thema: [Tipp] Mit Linux Flash-Medien testen  (Gelesen 1967 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline Bitpicker

  • /dev/gamemaster
  • Famous Hero
  • ******
  • Beiträge: 3.506
  • Geschlecht: Männlich
  • Username: bitpicker
    • Nyboria - the dark side of role-playing
[Tipp] Mit Linux Flash-Medien testen
« am: 3.01.2008 | 18:40 »
Kurz vor Weihnachten hat heise.de gemeldet, dass unter anderem vom Heise Verlag selbst als Abo-Lockmittel verschickte 1GB USB-Sticks zum großen Teil gefälscht waren. Das heißt, dass die Sticks zwar 1 GB Platz melden, aber deutlich weniger Platz haben oder defekt sind. Heise hat eine Testsoftware für Windows in der Nachricht verlinkt, die aber den Nachteil hat, dass sie beim ersten falschen Byte abbricht. Wenn man genaueres wissen will, kann man das mit Linux herausfinden.

Meine Firma hat vor Weihnachten eine Ladung genau dieser USB-Sticks als Werbemittel geordert, und keiner der bisher getesteten Sticks hat den Test bestanden. Andere USB-Sticks bestehen ihn aber, es liegt also nicht am Test... ;) Wie Heise meldet, sind auch viele schwarze Schafe bei Testkäufen in Läden aufgetaucht, von daher ist es sinnvoll, generell alle Sticks auf Fehler zu testen. Das habe ich wie folgt gemacht (basierend auf einem Kommentar bei heise.de - manchmal steht da doch was Sinnvolles drin):


1. Mit dem Befehl
df /mnt/usbstickkann man herausfinden, wie viel Platz auf dem Stick ist. Am besten testet man es mit einem frisch formatierten oder gar neu partitionierten Stick. Der Pfad muss natürlich dem richtigen Mountpoint entsprechen.
Die Ausgabe des Befehls sieht zum Beispiel so aus:
Dateisystem          1K-Blöcke   Benutzt Verfügbar Ben% Eingehängt auf
/dev/sde1              1002056         8   1002048   1% /mnt/usbstick
Interessant ist die Zahl unter 'Verfügbar': hier sind 1002048 Blöcke von jeweils 1024 Byte frei; es handelt sich um einen 1 GB-Stick. Allerdings stammen diese Zahlen aus auf dem Stick gespeicherten Werten; bei den Fälschungen werden also wesentlich mehr Bytes angezeigt, als tatsächlich vorhanden sind.

2. Jetzt brauchen wir eine Datei, die exakt so groß ist, dass sie genau auf den USB-Stick passt. Das machen wir wie folgt:
dd if=/dev/urandom of=testdatei bs=1024 count=1002048

Dieser Befehl erstellt eine Datei aus Zufallszahlen, die im aktuellen Verzeichnis (nicht das des Sticks wählen!) unter dem Namen testdatei gespeichert wird; sie enthält 1002048 Blöcke zu 1024 Byte. Die Zahl unter 'count' müsst ihr natürlich entsprechend dem Ergebnis von df abändern.

3. Wenn die Datei fertig ist, was mehrere Minuten dauert, ermittelt ihr eine Prüfsumme für die Datei:
sha1sum testdatei >checksum.sha1
Das sind Ziffern 1, keine kleinen Ls. Dieser Befehl erstellt eine Datei namens checksum.sha1, in der die Prüfsumme der Datei namens testdatei gespeichert wird.
Zum Testen könnt ihr nun folgendes aufrufen:
sha1sum -c checksum.sha1
Dieser Befehl sollte ein 'OK' zurückgeben.

4. Anschließend kopiert ihr die Datei auf den Stick (Pfad wieder anpassen).
cp testdatei /mnt/usbstick
Sie sollte exakt passen, es sollten 0 Byte frei sein. Wenn der Stick meldet, dass er voll ist, und der Kopiervorgang abbricht, sind doch Daten auf dem Stick, z.B. in versteckten Dateien (Papierkorb). Der Test kann nur weitergehen, wenn der Stick die Datei klaglos annimmt. Im Zweifelsfall formatieren oder neu partitionieren und von vorne beginnen.

5. Jetzt benennt ihr die Datei auf eurer Festplatte um, falls ihr sie noch mal verwenden wollt:
mv testdatei testdatei.off
Das muss deshalb sein, weil die Prüfsumme nur für eine Datei mit unverändertem Namen überprüft werden kann.

6. Anschließend könnt ihr zur Sicherheit den Stick aus- und wieder einhängen.

7. Dann wird die Datei vom Stick zurück auf die Platte kopiert, in das Verzeichnis, in der die Datei checksum.sha1 liegt.

8. Jetzt in diesem Verzeichnis noch einmal folgendes ausführen:
sha1sum -c checksum.sha1
Wenn das Ergebnis wieder ok ist, ist der Stick vollkommen in Ordnung. Ist das Ergebnis aber ein Fehlschlag, wurde mindestens ein Byte falsch gespeichert oder geschrieben. Das ist fatal.

9. Wenn das der Fall ist, solltet ihr einen Hex-Editor öffnen, z.B. ghex. Dieser Editor kann die vom Stick kopierte Datei öffnen (dauert etwas) und dann kann er in der Datei nach Zeichenfolgen suchen. Wir suchen nach
FF FF FF FF

weil es auch bei einem Gigabyte ausreichend unwahrscheinlich ist, dass der Zufallszahlengenerator aus 256 möglichen Zahlen viermal hintereinander FF ausgewählt hat. Wenn Speicher tatsächlich fehlt, gibt er FF zurück, also ist eine solche Stelle wahrscheinlich defekt. Der Hexeditor springt auch an die Stelle, so dass man schon sieht, wenn es noch mehr FF Bytes gibt. Wenn man ganz und gar ungläubig ist, kann man auch beide Dateien mit dem Hexeditor optisch vergleichen.

10. Bei den gefälschten Sticks sind große Bereiche mit FF gefüllt. Ich hatte einen Kandidaten, bei dem einige hundert Byte schon bei ca. 14 MB ausfielen, und ab 656 MB war dann komplett Schluss, es gab nur noch FFs.

11. Wenn der Checksummen-Test ein Fehlschlag war, der Hexeditor aber keine vier zusammenhängenden FFs findet, ist vielleicht nur ein Stück von weniger als vier Byte kaputt, aber auch das ist schon fatal für binäre Daten. Vertrauenswürdig ist ein Stick nur dann, wenn die Prüfsumme OK ist.

Robin
Wie heißt das Zauberwort? -- sudo

(Avatar von brunocb, http://tux.crystalxp.net/)

Offline Monkey McPants

  • Famous Hero
  • ******
  • The Hammer is my Monkey
  • Beiträge: 3.191
  • Geschlecht: Männlich
  • Username: Minx
    • Story-Games Österreich
RE: [Tipp] Mit Linux Flash-Medien testen
« Antwort #1 am: 3.01.2008 | 23:16 »
Cool. Und jetzt noch am besten ein shell script das das ganze mit einem Befehl macht... ;D

Naja, aber meine USB sticks sind glücklicherweise tatsächlich 1 GB Sticks, aber wenn ich mir in Zukunft wieder mal einen zulege: Gut zu wissen.

Auf jeden Fall interessant.

M
Ich praktiziere leidenschaftlich 4enfreude.

Story Games Österreich

Offline Bitpicker

  • /dev/gamemaster
  • Famous Hero
  • ******
  • Beiträge: 3.506
  • Geschlecht: Männlich
  • Username: bitpicker
    • Nyboria - the dark side of role-playing
RE: [Tipp] Mit Linux Flash-Medien testen
« Antwort #2 am: 4.01.2008 | 14:04 »
Cool. Und jetzt noch am besten ein shell script das das ganze mit einem Befehl macht... ;D

Daran habe ich auch schon gedacht. Vielleicht habe ich mal Zeit dafür...

Robin
Wie heißt das Zauberwort? -- sudo

(Avatar von brunocb, http://tux.crystalxp.net/)

Offline Bitpicker

  • /dev/gamemaster
  • Famous Hero
  • ******
  • Beiträge: 3.506
  • Geschlecht: Männlich
  • Username: bitpicker
    • Nyboria - the dark side of role-playing
RE: [Tipp] Mit Linux Flash-Medien testen
« Antwort #3 am: 11.01.2008 | 22:48 »
So, ich habe tatsächlich ein Shellscript dafür geschrieben... Mein erstes Shellscript übrigens.

Hier ist es:

#!/bin/bash

# Festlegung einer maximalen Datenträgergröße in Kilobyte:

MaxSize=1100000

# Als erstes wird der Parameter geholt und überprüft.

StickPath=${1}

# Fehlt er?

if [ -z "$StickPath" ]; then
echo "Es wurde kein Mountpunkt für einen USB-Stick angegeben."
echo "Verwendungsbeispiel: $0 /mnt/usbstick"
exit
fi

# Ist er ein gültiger Pfad?

if [ ! -d "$StickPath" ]; then
echo "Der angegebene Parameter ist kein gültiger Pfad."
echo "Verwendungsbeispiel: $0 /mnt/usbstick"
exit
fi

# Entfernung eines abschließenden Slash, sofern vorhanden.

StickPath=$(echo $StickPath | sed -e 's,/$,,')

echo "Datenträger an $StickPath wird auf Fehler getestet."

# Jetzt wird die Größe des gemounteten Sticks ermittelt.

declare -a StickSizeArray

# df ermittelt die Werte des Sticks; grep reduziert die Ausgabe
# auf die zweite Zeile; awk nimmt daraus den zweiten und vierten Wert
# (d.h. Gesamtgröße und freier Platz).

StickSizeValues=$(df $StickPath | grep $StickPath \
| awk '{print $2" "$4}')

StickSizeArray=($StickSizeValues)

# Sicherheitscheck: ist der Platz größer als die Variable MaxSize
# erlaubt, wird die Überprüfung abgebrochen.

if [ ${StickSizeArray[0]} -gt ${MaxSize} ]; then
echo "Das Ziel überschreitet die erlaubte Größe von $MaxSize Kilobyte."
echo "Bitte die Variable MaxSize am Skriptanfang höher setzen,"
echo "falls kein Fehler vorliegt."
exit
fi

# Überprüfung: ist der Stick völlig leer? Sonst Warnhinweis.

if [ ! ${StickSizeArray[0]} -eq ${StickSizeArray[1]} ]; then

let UsedCapacity=${StickSizeArray[0]}-${StickSizeArray[1]}
echo "$UsedCapacity Kilobyte sind von Daten belegt!"
echo "Der belegte Bereich wird nicht getestet!"

fi

echo "${StickSizeArray[1]} Kilobyte freier Speicher werden getestet."

# Eine Datei aus Zufallszahlen wird generiert. Sie ist exakt
# so groß wie der freie Platz auf dem Stick.

echo "Generiere Testdatei. Das kann einige Minuten dauern."
dd if=/dev/zero of=testfile bs=1024 count=${StickSizeArray[1]}>/dev/null
echo "Testdatei generiert."

# Für die Datei wird eine Checksumme ermittelt.
echo "Ermittle Checksumme..."
sha1sum testfile >checksum.sha1
echo "Checksumme ermittelt."

# Die Testdatei wird auf den Stick kopiert.
echo "Kopiere Testdatei auf Stick..."
cp testfile $StickPath
echo "Fertig."

# Die originale Testdatei wird gelöscht.
echo "Lösche Testdatei im aktuellen Verzeichnis..."
rm testfile
echo "Fertig."

# Die Testdatei wird vom Stick zurückgeholt.
echo "Kopiere Testdatei vom Stick zurück..."
cp $StickPath/testfile testfile
echo "Fertig."

# Die Checksumme der kopierten Testdatei wird überprüft..
echo "Überprüfe die Checksumme der kopierten Datei..."

if sha1sum -c checksum.sha1>/dev/null
then echo "Der Stick ist in Ordnung, keine Lesefehler!"
else
echo "Der Stick hat Lesefehler!"
echo "Bei Benutzung besteht das Risiko von Datenverlusten."
fi

# Aufräumen...

rm $StickPath/testfile
rm testfile
rm checksum.sha1
echo "Testdateien erfolgreich gelöscht!"

Wer das Skript mal ausprobieren möchte (Auf eigene Gefahr! Ich übernehme keine Haftung usw.), kann den Inhalt des obigen Codeblocks in eine Datei namens checkstick kopieren. Diese Datei muss für den Benutzer ausführbar gemacht werden und sollte im Pfad für ausführbare Dateien gespeichert werden.

Der Aufruf erfolgt dann so:

checkstick /mnt/usbstick

wobei der Pfad zu einem bereits gemounteten USB-Stick (dürfte auch mit anderen Arten von Wechseldatenträgern funktionieren) führen muss.

Damit bei versehentlicher Angabe eines Verzeichnisses auf einer Festplatte diese nicht bis zum letzten Byte gefüllt wird, was bestimmt ein böses Ende nimmt, wird zu Anfang des Skriptes sicherheitshalber eine Variable MaxSize auf etwas über 1 GB gesetzt. Die dort angegebene Zahl muss entsprechend angepasst werden, wenn Datenträger mit einer größeren Kapazität als 1 GB getestet werden sollen.

Das Skript räumt auch hinter sich auf, es bleiben also keine Dateien von Testläufen übrig.

Was man noch machen könnte: da ich die Testdatei mit Nullen fülle, könnte man die vom Stick zurückkopierte Datei im Fehlerfall auf die Menge, Größe und Örtlichkeit der statt mit 00 mit FF gefüllten Bytes darin überprüfen, aber ich weiß momentan noch nicht, wie. Mein Hirn schmerzt, ich höre für heute auf...

Robin
Wie heißt das Zauberwort? -- sudo

(Avatar von brunocb, http://tux.crystalxp.net/)