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:

cdrwtest-v0.2.sh

Alte Versionen:

cdrwtest.sh

Verbesserungs- und Erweiterungsvorschläge stets willkommen.

Weitere Links:

16 thoughts on “CD/DVD-RW Dauertest Bashskript

  1. 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

  2. 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 ;-)

  3. 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…

    1. >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:

      :~$ md5sum /dev/cdrom
      169f5809f41c8439af0e61ea849ca6fe  /dev/cdrom
      :~$ dd if=/dev/cdrom of=cdimage.iso 
      358684+0 records in
      358684+0 records out
      183646208 bytes (184 MB) copied, 1.23738 s, 148 MB/s
      :~$ md5sum cdimage.iso 
      169f5809f41c8439af0e61ea849ca6fe  cdimage.iso
      

      >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.

  4. 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.

  5. 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 :)

  6. 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+

Leave a Reply

Your email address will not be published.