claim.gif
Linux Magazin Linux User Easy Linux Ubuntu User International Linux Community
Erschienen in EasyLinux 03/2004   »   Ausgabe bestellen

CDs brennen in der Shell

Brandmeister


Wer nur um schnell eine CD zu brennen kein grafisches Programm starten will, liegt beim Shell-Brennprogramm cdrecord goldrichtig. Wir zeigen, wie Sie das Kommandozeilen-Tool zum CD-Brennen nutzen.

von Elisabeth Bauer und Andrea Müller

Wer bisher seine CDs mit grafischen Programmen wie K3b gebrannt hat, staunt vielleicht darüber, dass altgediente Linux-Hasen dazu lieber die Kommandozeile nutzen. Um eine CD in der Shell zu produzieren, genügen zwei Befehle: mkisofs und cdrecord, die übrigens auch die meisten grafischen Programme intern benutzen. In diesem Artikel erklären wir, wie Sie Daten-CDs erzeugen und kopieren. Und um alle Arbeiten in einem Aufwasch zu erledigen, stellen wir am Ende ein kleines Skript vor, das die nötigen Kommandos zusammenfasst: Mit dem simplen Befehl burn verzeichnisname verfrachten Sie Ihre Daten schnell und bequem von der Kommandozeile aus auf CD.

Daten aufbereiten

Anders als auf Disketten oder USB-Sticks können Sie auf eine CD in der Regel nicht einfach einzelne Dateien kopieren. Stattdessen brauchen Sie ein so genanntes ISO-Image -- das ist im Prinzip eine große Datei in einem speziellen CD-Dateiformat. Grafische Brennprogramme nehmen Ihnen diese Arbeit üblicherweise ab, so dass Sie meist nicht einmal etwas davon merken. In der Shell ist Selbstbasteln angesagt -- doch keine Sorge, ein Befehl genügt. Am einfachsten sammeln Sie alles, das Sie brennen wollen, in einem Verzeichnis zusammen. Aus diesem erzeugen Sie mit dem Befehl

mkisofs -J -r -o meine-cd.iso verzeichnis

das gewünschte Image. Für verzeichnis geben Sie den Pfad zum Verzeichnis an, das Sie brennen wollen, beispielsweise /home/tux/backup. Sie können mkisofs auch mehrere Verzeichnisse übergeben. Dabei muss man jedoch darauf achten, dass keine gleichnamigen Dateien in den Verzeichnissen liegen: mkisofs wirft die Inhalte aller angebenen Verzeichnisse in einen Topf. Vorsicht ist auch bei Leerzeichen in Verzeichnisnamen geboten: Damit mkisofs Ihre Angabe nicht für zwei unterschiedliche Verzeichnisse hält, setzen Sie den Namen in Anführungszeichen. Am sichersten fahren Sie unter Linux, wenn Sie Leerzeichen in Datei- und Verzeichnisnamen grundsätzlich vermeiden.

Der Parameter -J sorgt dafür, dass das Image die so genannte Joliet-Extensions verwendet, eine Erweiterung, die unter Windows lange Dateinamen erlaubt, -r erhält außerden die unter Linux üblichen Dateirechte. Mit -o meine-cd.iso schließlich schreiben Sie das Image in die Datei meine-cd.iso -- diesen Namen inklusive Endung können Sie natürlich frei wählen.

Auf Brennersuche

Bevor Sie loslegen, gilt es nun noch, herauszufinden, wo der Brenner angeschlossen ist. Dazu bringt cdrecord die Option -scanbus mit, die den SCSI-Bus auf angeschlossene Geräte überprüft. Sie haben weder SCSI noch einen SCSI-Bus? Macht nichts. Auch wenn Sie kein SCSI-Gerät besitzen, sondern einen ganz normalen IDE-Brenner, wie er in den meisten heute verkauften Computern eingebaut ist, spricht cdrecord ihren Brenner über die SCSI-Schnittstelle an. Da die Brennprogramme unter Linux standardmäßig nur mit SCSI-Geräten umgehen können, gaukelt Linux ihnen ein solches vor. Das Verfahren nennt sich IDE-SCSI-Emulation und hat, wenn es nicht aktiviert ist, schon unzähligen Linux-Anwendern schlaflose Nächte bereitet. Moderne Distributionen richten es glücklicherweise meist schon bei der Installation richtig ein.

Geben Sie den Befehl

cdrecord -scanbus

ein. Die Ausgabe sollte in etwa so aussehen wie in Abbildung 1. Wichtig sind die durch Kommas getrennten drei Ziffern am Zeilenanfang: Die Zahlen, hinter denen Ihr Brenner steht, übergeben Sie im nächsten Schritt cdrecord.

Abb. 1: Mit der Option -scanbus spürt cdrecord den angeschlossenen Brenner auf.

Wer zusätzlich wissen will, ob sein Brenner Spezialeigenschaften wie Burnproof unterstützt (Abbildung 2), erfährt das mit dem Befehl

cdrecord dev=0,0,0 driveropts=help -checkdrive

Abb. 2: Laufwerksdiagnose: Dieser DVD-Brenner unterstützt BurnProof (letzte Zeilen).

Im Dummy-Modus

Um bei den ersten Versuchen nicht unnötig Rohlinge zu verbraten, starten Sie cdrecord zunächst im Testbetrieb. Unter SuSE Linux dürfen Sie als normaler Benutzer brennen, unter Red Hat und Mandrake Linux darf hingegen nur root das Kommando cdrecord ausführen. Falls Sie also eine Fehlermeldung erhalten, melden Sie sich mit su und der Eingabe Ihres Administratorpassworts als Benutzer root in der Shell an.

cdrecord -v -dummy dev=0,0,0 meine-cd.iso

simuliert einen Brennvorgang (-dummy). Hinter dev= tragen Sie die Anschlussnummer des Brenners ein, die Sie bei der Brennersuche herausgefunden haben, als letztes Argument kommt das vorher erzeugte ISO-Image. Legen Sie einen Rohling ein und schicken Sie den Befehl ab, spuckt cdrecord eine Menge Informationen aus, um die Sie sich normalerweise nicht kümmern müssen (Abbildung 3). Während des Brennvorgangs zeigt es in der untersten Zeile fortlaufend an, wieviele MByte es bereits geschrieben hat. Dahinter steht der Füllstand des Datenpuffers (fifo 100%) [buf 98%] und die aktuelle Schreibgeschwindigkeit (8.1x). Nach dem Brennen wird die CD fixiert, und zu guter letzt erhalten Sie noch eine Statistik über den Brennvorgang -- Sie merken schon, cdrecord ist ein sehr geschwätziges Tool.

Abb. 3: Ein Brennvorgang im Testbetrieb.

Jetzt aber richtig!

War der Simluationslauf erfolgreich, holen Sie nun einfach über die Aufwärts-Pfeiltaste das gerade eingebene Kommando zurück, entfernen die Zeichen -dummy und schicken den Brennbefehl, cdrecord -v dev=0,0,0 meine-cd.iso diesmal im Ernst ab. Wer sich den Druck auf den Auswurf-Knopf sparen will, hängt hinter -v noch ein -eject, dann wirft cdrecord die CD nach dem Brennen automatisch aus.

On-the-fly brennen

Für Experimentierfreudige stellen wir nun ein paar weitere Brennverfahren vor, die jedoch -- seien Sie hiermit gewarnt -- längst nicht auf allen Rechner und Brennern funktionieren. Wenn Prozessor und Festplatte schnell genug sind und der Rechner über ausreichend Arbeitsspeicher verfügt, kann cdrecord CDs auch "on-the-fly" brennen, d. h. ohne die Daten vorher als Image auf der Festplatte zu speichern. Dazu brauchen Sie zwar immer noch mkisofs, aber Sie leiten dessen Ausgabe mit einer Pipe direkt an den Brennbefehl weiter:

mkisofs -R verzeichnis | cdrecord -v fs=128m speed=2 dev=0,0,0 -

Das Risiko dieser Art zu brennen besteht darin, dass cdrecord ständig ausreichend Daten erhalten muss. cdrecord benutzt einen Puffer, einen Bereich im Arbeitsspeicher, in dem es die Daten, die von der Festplatte kommen, zwischenlagert. Läuft dieser Puffer leer, etwa weil die Festplatte nicht schnell genug Daten nachliefert, schlägt der Brennvorgang fehl, und um den Rohling ist es geschehen. Mit der Option fs vergrößern Sie den Puffer: Im Beispiel haben wir großzügig 128 MByte spendiert. Das absolute Minimum und gleichzeitig der Standardwert, den cdrecord benutzt, wenn Sie die Option fs nicht angeben, liegt bei vier MByte. Vorsichtshalber schalten wir im Beispiel außerdem auf vierfache Geschwindigkeit herunter (speed=4), standardmäßig verwendet cdrecord sonst die maximale Geschwindigkeit des Brenners.

CDs kopieren

Besitzen Sie zusätzlich zum Brenner noch ein normales CD-Laufwerk, kopieren Sie dort eingelegte Daten-CDs auch direkt. Das geht mit dem Befehl

cdrecord -v dev=0,0,0 driveropts=burnfree fs=128m -dao /dev/cdrom

Auch hier empfiehlt es sich, einen möglichst großen Puffer (hier fs=128m) zu benutzen. Die Daten liest cdrecord direkt von Ihrem CD-Laufwerk, unter Linux die Gerätedatei /dev/cdrom. Ist in Ihrem Rechner ein DVD-Laufwerk eingebaut, tragen Sie an dieser Stelle /dev/dvd ein. Im Beispiel haben wir zusätzlich die Option burnfree mit angegeben, die auf Brennern, die die BurnProof-Technologie unterstützen, das Leerwerden des Schreibpuffers verhindert. -dao schaltet den Disk-at-Once-Modus ein, der jedoch manche Brenner nicht unterstützen. Besitzen Sie kein zweites Laufwerk, lesen Sie unter SuSE Linux mit dem Befehl

dd if=/dev/cdrecorder of=meine-cd.iso

den CD-Inhalt direkt aus der Gerätedatei und speichern Sie als Image ab. Red-Hat-Anwender ersetzen /dev/cdrecorder durch /dev/cdwriter, unter Mandrake Linux verwenden Sie eine Angabe wie /dev/cdrom oder /dev/cdrom0. Das Image brennen Sie anschließend wie oben beschrieben mit einem normalen cdrecord-Aufruf. (eba)

Listing 1: Brennskript
#!/bin/bash
image="$HOME/burn.iso"
# maxsize=$((700 * 512))
maxsize=$((700 * 1024))
device=0,0,0

if [ $# -ne 1 ]
then
        echo "Bitte gib genau ein Verzeichnis an"
        exit 1
fi

source="$1"
# cdsize=$(mkisofs -J -r -q -print-size "$source")
cdsize=$(du -sk "$source" | cut -f 1)
if [ $cdsize -gt $maxsize ]
then
        echo "Das passt nicht auf die CD."
        exit 1
fi

mkisofs -r -J -o "$image" "$source"
cdrecord -v dev=$device "$image"
echo "Die CD ist fertig."
Kasten 1: Heimbrennerei im Eigenbau

Sowohl mkisofs zur Erstellung eines Images als auch das Brennprogramm cdrecord erschlagen den Benutzer förmlich mit ihrer Optionsvielfalt. Da man meistens denselben Befehl zum Brennen braucht, kann man sich die lästige Tipperei durch ein Skript vereinfachen. Es erzeugt automatisch ein Image des zu brennenden Verzeichnisses und schreibt es auf CD. Grundlagen, die zur Erstellung eines jeden Skripts gelten, lesen Sie unter [1] nach. Das Brennskript namens burn erstellen Sie mit dem Texteditor Ihrer Wahl, z. B. Kwrite. Wenn Sie sich die Tipperei sparen wollen, finden Sie es auch auf der Easylinux-Download-Seite im Internet.

Um mit dem Skript zu arbeiten, speichern Sie es unter dem Namen burn ab und machen es mit dem Befehl chmod +x burn ausführbar. Mit /pfad/zu/burn /pfad/zu/verzeichnis rufen Sie es auf. Wenn Sie sich beispielsweise im Verzeichnis befinden, in dem das Skript liegt und den Ordner backup in Ihrem Home-Verzeichnis brennen wollen, tippen Sie ./burn ~/backup. Die Tilde (~) ist eine Abkürzung der Shell für Ihr Home-Verzeichnis.

Das Brennskript en detail

Die erste Zeile des Skripts legt den Interpreter fest, hier die Linux-Standard-Shell bash, in der zweiten Zeile beginnen die Befehle. image="$HOME/burn.iso" legt den Speicherort und Dateinamen des ISO-Images fest. Die nächste Zeile (maxsize=$((700 * 1024))) berechnet die Größe des Rohlings in KByte. Fassen Ihre Rohlinge statt 700 nur 650 MByte, ersetzen Sie die 700 durch 650. Wenn Ihr Brenner nicht unter dem SCSI-Anschluss 0,0,0 zu finden ist, sondern etwa unter 1,0,0, ändern Sie die Zeile device=0,0,0 entsprechend.

Anschließend prüft das Skript, ob Sie beim Aufruf die richtige Zahl an Parametern angegeben haben -- genau einen Verzeichnisnamen -- und bricht ab, wenn deren Zahl ungleich eins ist. Der Aufbau folgt diesem Muster:

wenn Bedingung zutrifft
dann
        mach dieses
Ende

Die Schlüsselwörter für eine solche Wenn-Dann-Abfrage sind if am Anfang, then für die Aktion, die abgearbeitet wird, wenn die Bedingung zutrifft. Ein fi schließt die Abfrage. if [ $# -ne 1 ]; ist die Bedingung: $#, eine Standardvariable der Shell enthält alle Parameter, die Sie beim Aufruf des Skripts angegeben haben, -ne 1 ("not equal"=nicht gleich) vergleicht, ob diese ungleich eins sind. Haben Sie beispielsweise mehrere Verzeichnisnamen oder gar keines eingegeben, gibt der Befehl echo den Text in Anführungszeichen aus und beendet das Skript (exit 1).

Passt hingegen soweit alles, schreibt das Skript den von Ihnen angebenen Verzeichnisnamen ("$1") in die Variable source.

Jetzt berechnet es mit cdsize=$(du -sk "$source" | cut -f 1) die Größe des Verzeichnisses. Wieder in einer if-Abfrage vergleicht es dessen Größe mit der vorher berechneten Größe des Rohlings: if [ $cdsize -gt $maxsize ] heißt soviel wie "Wenn das Verzeichnis ($cdsize) größer (-gt "greater than") als die Rohlingskapazität ($maxsize) ist, dann (then) gib eine Fehlermeldung aus und beende dich".

Nachdem diese Formalien alle geklärt sind, erzeugt es mit mkisofs -r -J -o "$image" "$source" ein ISO-Image vom angegebenen Verzeichnis ($source). Der Befehl cdrecord -v dev=$device "$image" schließlich brennt die gewünschte CD. $device wird darin durch die oben definierte SCSI-Nummer, "$image" durch den Dateinamen des ISO-Images ersetzt. Unterstützt Ihr Brenner Spezialeigenschaften wie BurnProof, oder soll cdrecord die fertiggebrannte CD automatisch auswerfen, können Sie diese Skriptzeile mit den im Artikel vorgestellten Optionen erweitern. Mit der Erfolgsmeldung "Die CD ist fertig." verabschiedet das Skript sich.

Infos
[1] Andrea Müller: "Shell-Tipps", EasyLinux 01/2004, S. 69ff

Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links" nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedruckten Fassung entsprechen.

Druckerfreundliche Version | Feedback zu dieser Seite | Datenschutz | © 2017 COMPUTEC MEDIA GmbH | Last modified: 2007-01-25 17:05

Nutzungsbasierte Onlinewerbung

[Linux-Magazin] [LinuxUser] [Linux-Community] [Admin-Magazin] [Ubuntu User] [Smart Developer] [Linux Events] [Linux Magazine] [Ubuntu User] [Admin Magazine] [Smart Developer] [Linux Magazine Poland] [Linux Community Poland] [Linux Magazine Brasil] [Linux Magazine Spain] [Linux Technical Review]