Nachdem ich auf Amazon in einem Angebot von 10 Verbatim CD-RW-Rohlingen las[9], dass ca. 1000 Schreibzyklen möglich sein sollen (Zitat: “Kann mindestens 1000 mal wiederbeschrieben werden”), wunderte ich mich ein wenig. Fragt man in die Runde, sind meist 20-50 Zyklen realistisch. Dies ist vermutlich eine der Informationen, die sich über die Zeit immer weiterverbreitet hat, aber nur selten wirklich überprüft wurde.
Also kam mir der Gedanke, einen CD-RW Dautertest durchzuführen. Nach einiger Recherche merkte ich, dass es für diesen Zweck kaum bis keine fertigen Lösungen gibt. (Zumindest nicht öffentlich, ich gehe davon aus, dass die Hersteller von Rohlingen und Laufwerken sehrwohl Software parat haben.) Daher entschied ich mich für eine Eigenkreation. Sehr praktisch für diesen Zweck fand ich Bash.
Die Idee
Die Idee war, Zufallsdaten zu erstellen, einen Hash zu bilden, die CD maximal mit Daten zu beschreiben, die CD zu lesen und von den gelesenen Daten wiederum einen Hash zu erstellen. Ist der Hash gleich, ist davon auszugehen, dass keine Korrumption der Daten erfolgte.
CDs maximal mit Daten beschreiben
Um die maximale Anzahl an Sektoren zu ermitteln fand ich eine Lösung, bei der die maximalen Sektoren mithilfe des Befehls
wodim dev=/dev/sr0 -atip
ermittelt werden.[1] Der Wert von “ATIP start of lead out” teilt uns die maximale Anzahl an Sektoren mit – hier sind das 359849.
Anschließend werden 35 Blöcke (1 Block ist 2K groß) für ISO 9660-Metadaten abgerechnet. Verbleiben in meinem Fall also 359814 Blöcke mit einer größe von je 2K.
Erstellen der MD5-Prüfsumme
Die Erstellung der MD5-Prüfsumme ist einfach. Aber ich hatte einen kleinen Logikfehler.
Normalerweise ist die Ausgabe des Befehls “md5sum” zweispaltig. Der Befehl
md5sum Mercedes-Werk\ Bremen\ Montage\ der\ 190er\ W201\ im\ Jahr\ 1989-ztvkh0afbhA.mp4
wird also folgende Ausgabe erzeugen
fea21c126856401bc8c21ad38a3b071b Mercedes-Werk Bremen Montage der 190er W201 im Jahr 1989-ztvkh0afbhA.mp4
Da im Skript die Eingangs-ISO “image.iso” und die Ausgangs-ISO “example.iso” hieß, war die Ausgabe von “md5sum” also in jedem Fall unterschiedlich, was beim späteren Vergleich zu Schwierigkeiten führte:
if [ "$MD5ORIG" = "$MD5DUP" ]; then
Eine Lösung[2] hierfür war, die Ausgabe als ein Array zu schreiben und schließlich beim Vergleich nur den ersten Wert zu vergleichen:
MD5ORIG=($(md5sum image.iso))
MD5DUP=($(md5sum example.iso))
if [ "${MD5ORIG[0]}" = "${MD5DUP[0]}" ]; then
Zum Erstellen der Prüfsumme gäbe es noch eine weitere Möglichkeit, die sich allerdings als “nicht funktionstüchtig” erwiesen hat:
md5sum /dev/cdrom
Im Fehlerfall
… möchte ich das fehlerhafte Abbild gerne untersuchen können. Daher wird es gekennzeichnet und gespeichert:
mv example.iso fehlerhaftes-"$(date +"%d.%m.%Y")".iso
Löschen, Schreiben und Lesen
Zum Umgang mit der CD und dem Laufwerk nutzte ich wodim, welches Teil des cdrkit ist[3][4]. Einzig der Lesevorgang wird durch “dd” durchgeführt.
Löschen der CD-RW[8]:
wodim -v blank=all dev=/dev/cdrom
Schreiben der ISO-Datei[5]:
wodim image.iso dev=/dev/cdrom
Lesen der CD-RW:
dd if=/dev/cdrom of=example.iso
Speziell zum Lesen der CD gab es mehrere Möglichkeiten, von denen sich aber nur die mit “dd” als zuverlässig erwiesen hat. Andere Möglichkeiten waren:
readom[6] (hat einen völlig anderen Hash erzeugt, vermutlich weil es sich gar nicht um ein ISO9660-Abbild handelte)
readom dev=/dev/sr0 f=cdimage.iso
cat[7]
cat /dev/cdrom > example.iso
Zeit zum Abkühlen des Brenners und der CD
Zwischen den Vorgängen ist es noch denkbar, mittels “sleep” eine Wartezeit zum Abkühlen des Laufwerks und der CD einzufügen. Darauf habe ich in meinem Test verzichtet, dazu aber später im gesonderten Test mit den Testergebnissen mehr.
Das Ergebnis
Die Anzahl der Zyklen wird in die Datei count.txt geschrieben und kann dort abgelesen werden. Diese Lösung halte ich für sinnvoll, da bei einem Absturz oder ähnlichem, der Wert nicht verloren gehen kann, da er nach jeder Iteration einmal geschrieben wird.
Das Skript
Aktuelle Version:
Alte Versionen:
Verbesserungs- und Erweiterungsvorschläge stets willkommen.
Cool ein schönes Skript =)
Nettes Vorhaben.
Welche Rolle spielt der Brenner bei dem Experiment? Der ist ja auch dem Verschleiß ausgesetzt.
Eine gute und berechtigte Frage, der ich in Kürze bei den Testergebnissen auf den Grund gehen werde.
Hier eine andere Lösung für die md5sum Sache. Halte sie für eleganter, da sie “nur” eine Variable und nicht gleich ein Array braucht:
sourceFileMd5=$(md5sum “$sourceFilePath” | awk ‘{print $1}’)
Gruß, YoSiJo
Dank, da awk fast überall an Bord ist, übernehme ich das so.
Noch ein Hinweis aus der wodim Handbuchseite.
Mache Brenner (Philips) benötigen ein eject um wieder ein neues Image brennen zu können.
Sollte das bei dir zum Problem werden, hilft eject und eject -t zum öffnen und schließen des Schachts.
Aber vlt. weisst du das auch schon ;-)
Danke für die Info – wusste ich noch nicht. Hatte bis jetzt erst mit zwei Hitachi-LG-Brennern getestet.
Wozu der Counter reset? Du schreibst doch selbst der count.txt soll immer weiterzählen auch wenn das Skript abstürzt zwischendurch beendet wird.
Beim neustart machst du aber ein Reset, tue das weg und hüte die count.txt später das die nicht versehentlich kaputt geht.
Den MD5 Hash vom AusgangsImage musst du auch nicht jedesmal neu gen. den kannst du hardcoden IMO.
Den MD5-Hash der Disc kannst du auch mit md5sum /dev/cdrom tun. Dann musst du nur im Fehlerfall ein Abbild “fehlerhaft” erstellen. Das sollte Zeit sparen. (Dass solltest noch versuchen zum laufen zu bekommen; Denn du sagst mmd5sum dierkt auf das Gerät geht bei dir nicht. Frag mal im Forum warum.)
Ich würde auch überlegen nicht doch eine Pause einzufügen, das käme der Wirklichkeit etwas nächer IMO.
Soweit; Ich freue mich auf deine Ergebnisse. Wenn mir dein BR Laufwerk nicht so viel Wert wäre, würde ich das Experiment ja glatt wiederholen…
>Wozu der Counter reset?
Beim Counter geht es in erster Linie darum, dass die Daten geschrieben sind, wenn ein Absturz des PCs oder des Skripts erfolgt. Da das Skript manuell bedient wird, ist ein Reset hier ok, finde ich.
>MD5 Hash vom AusgangsImage musst du auch nicht jedesmal neu gen.
Da bei jedem der Hash anders ist, sollte der Wert möglichst universell sein.
>MD5-Hash der Disc kannst du auch mit md5sum /dev/cdrom
Was das angeht, werde ich der Sache mal auf den Grund gehen.
Bei einem Test an meinem Notebook hat es zumindest funktioniert:
>Ich würde auch überlegen nicht doch eine Pause einzufügen
Die Pause ist weiter unten vorbereitet, wer sie nutzen möchte kann dies tun.
>Soweit; Ich freue mich auf deine Ergebnisse.
Ich mich auch.
Nochein Tipp zum Skript:
#!/bin/bash
set -x
set -e
[…]
Das macht das Fehlersuchen usw. einfacher. Ich würde das auch im Betrieb stehen lassen. Dann siehst du sofort was los ist später im Lauf.
Hi,
zumindest ein Kommentar im Script wäre noch angebracht, wie die Anzahl der Blöcke im image zustande kommt — die kann ja durchaus abweichen je nach Datenträger. Ggf könnte man auch einfach sehen, ob das image da ist, und wenn nicht, dann eines in der passenden Größe zum aktuell eingelegten Medium erstellen.
Danke auf alle Fälle, kommt in den Werkzeugkoffer :)
Sehr interessant.
Da bin ich mal auf das Ergebnis gespannt.
Waaaah, du kannst doch hier nicht einfach aufhören. Cliffhanger im Blog sind gemein!
Hi Maltris bin mit Linux noch etwas unbedarft. Wo bekomm ich denn diese Test-SW her? Hab eben so eine RW-Scheibe von der ich wissen moechte ob sie noch funzt. Wie sieht das denn mit Deinem Ergebnis aus?
Greeze Jorge+
Hallo Jorge,
Das Script ist mehr zum Dauertest, als zum einmaligen Testen der Scheibe. Allerdings kannst du die Befehle rauskopieren und einzeln ausführen.
Der Link zum Download ist oben. Hier nochmal der derzeitige für dich:
https://maltris.org/wp-content/uploads/2016/02/cdrwtest-v0.2.sh_.tar.gz
Mein Ergebnis ist noch in Arbeit. :)