Zurück

CD Brennen in der Shell

Vielleicht haben Sie schon mal davon gehört: CD's lassen sich auch in der Shell brennen. Dies ist sogar manchmal schneller, als erst ein grafisches Programm wie etwa K3b zum brennen zu starten. Nur wie geht denn das?

Auch beim Brennen von CD's gilt auf der Kommandozeile die Modularisierung. Daher gibt es gleich 2 Befehle, die für das Brennen zuständig sind: mkisofs und cdrecord. Da einige Linuxdistributoren die Lizenzumstellung von cdrecord von GPL zur CDDL als problematisch betrachteten, gibt es inzwischen einen Fork von mkisofs und cdrecord, namens genisoimage und wodim. Es kann also sein, das manche Linuxdistributionen inzwischen kein mkisofs und cdrecord mehr beinhalten sondern stattdessen genisoimage und wodim. Die hier beschriebene Bedienung der Programme ist jedoch ansonsten identisch. Falls sie genisoimage und wodim benutzen tauschen sie in den Beispielen einfach nur die Befehlsnamen aus, die Optionen bleiben die selben.

Der Befehl mkisofs erstellt zunächst ein CD-Dateisystem, also ein Iso-Image. Der Befehl cdrecord brennt anschließend dieses Image auf CD. Wie funktioniert mkisofs? Die einfachste Form des Aufrufs ist:

mkisofs [pfad]

Dies weist mkisofs an, die Dateien oder Ordner die mit Pfad spezifiziert wurden in ein CD-Dateisystem umzuwandeln und auf die Standardausgabe (das heißt im allgemeinen auf den Bildschirm) zu schicken.

Nun möchte man aber meistens ein Iso-Image als Datei erzeugen und nicht auf den Bildschirm ausgeben. Dafür kann man die Option -o verwenden:

mkisofs -o zieldatei.iso brenndateien

Als zu brennende Dateien, lassen sich auch mehrere Dateien oder auch Ordner, deren Inhalt dann gebrannt wird angeben. mkisofs hat sehr viele Optionen um bootfähige CD's zu erzeugen, oder um anzugeben welche Eigenschaften das Dateisystem haben soll.

2 besonders wichtige und oft benutzte Optionen von mkisofs sind -r und -J. Die Option -J erzeugt die Joliet Erweiterung für das Dateisystem, wodurch unter Windows-Betriebssystemen lange Dateinamen möglich sind. Per Default erlaubt das Iso 9660 CD Dateisystem nur Dateinamen in DOS-Notation mit maximal 8 Zeichen vor dem Punkt und 3 Zeichen nach dem Punkt (8+3 Regel). Außerdem werden alle Dateinamen groß geschrieben. Mehrere Punkte in Dateinamen sind genausowenig erlaubt wie führende Punkte oder die meisten Sonderzeichen. Sonderzeichen werden in Unterstriche umgewandelt, ebenso wie führende Punkte. Dadurch ist die Kompatibilität auch noch für DOS bewahrt. Durch Joliet bekommt die CD eine Erweiterung, die lange Dateinamen, mehr Sonderzeichen, wie etwa Umlaute und Kleinschreibung für Windowssysteme erhält.

Die Option -r erzeugt Rockridge-Erweiterungen. Diese sind speziell für Unix/Linuxsysteme gedacht und haben den gleichen Zweck wie die Joliet Erweiterung für Windows. Durch Rockridge bleiben lange Dateinamen als solche für Linux-/Unixsysteme erhalten und auch die klassichen Unix-Dateirechte, sowie weitere Unixspezifischen Eigenschaften wie etwa Gerätedateien und symbolische Links. Für die Dateirechte gibt es noch den Unterschied zwischen -r und -R: -r setzt die Rechte um auf Leserechte für alle und keine Schreibrechte, was bei einer CD meist sinnvoll ist, da CD's ohnehin nur Read-only gemountet werden. Außerdem wird der Besitzer und die Gruppe jeweils auf UID 0 und GID 0 gesetzt (Besitzer root und Gruppe root), da die Werte für den Besitzer, auf einem fremden Rechner keinen Sinn mehr machen. Speziell für Datensicherungen, bei denen die wirklichen Dateirechte erhalten bleiben sollen ist die Option -R sinnvoll. Diese Option erhält die Dateirechte und Besitzverhältnisse wie im Orginal.

Die Optionen -r und -J können natürlich auch kombiniert werden, falls eine CD sowohl auf Unix/Linux-Systemen, als auch auf Windows-Systemen verwendet werden soll. Unser Befehlsaufruf sähe jetzt also zum Beispiel so aus:

mkisofs -r -J -o meinecd.iso brennverzeichnis

Da die Optionen -r/-R und -J die Kompaitibilität zu anderen Betriebssystemen nicht beeinflußt empfiehlt es sich diese immer zu verwenden. Sowohl bei Joliet wie auch bei Rockridge handelt es sich um Erweiterungen die an die Dateisysteminformationen angehängt werden und nicht das eigentliche Iso 9660 Dateisystem verändern.

Die Option -l verändert hingegen das eigentliche Iso 9660 Dateisystem und bricht mit der DOS-Kompatibilität. Diese Option erlaubt Dateinamen mit bis zu 31 Zeichen und funktioniert problemlos auf allen Systemen außer DOS. Sofern sie keine CDs für DOS Systeme brennen empfiehlt es sich daher auch diese Option immer zu verwenden.

Die Option -D bricht mit der eigentlichen Iso 9660 Spezifikation funktioniert jedoch auf vielen Systemen (Windows, Linux, BSD, etc) problemlos. Der Iso 9660 Standard erlaubt keine zu tiefe Verschachtelung von Unterverzeichnissen. Hat eine CD eine Verschachtelungstiefe von mehr als acht Unterverzeichnissen, werden diese in einen neuen Ordner namens RR_MOVED umgezogen. Die Option -D schreibt die Verzeichnisstruktur so wie sie tatsächlich ist auf die CD.

Die Option -ldots erlaubt führende Punkte in Dateinamen. Dies bricht ebenfalls mit dem Iso 9660 Standard funktioniert jedoch auf den meisten Systemen.

Haben wir nun das Iso-Image erstellt, können wir es mit dem Befehl cdrecord brennen. Ebenso wie auch mkisofs kennt cdrecord eine riesige Menge an Optionen, die über die Manpage eingesehen werden können. Am wichtigsten für die Verwendung sind die Brenngeschwindigkeit, die mit speed definiert wird, der Brennmodus, das heißt ob im Track at once oder im Disk at once Modus gebrannt werden soll. Der Disk at once Modus wird mit -dao ausgewählt und der Track at once Modus mit -tao. Sowie das Brenngerät, das über dev definiert wird. Ein Aufruf kann also z. B. so aussehen:

cdrecord -tao speed=16 dev=/dev/hdc meinecd.iso

Dies würde das Iso-Image "meinecd.iso" mit 16-facher Brenngeschwindigkeit im Track at once Modus auf das Laufwerk /dev/hdc brennen. ATAPI (IDE) Brenner haben unter Linux Gerätebezeichnungen wie /dev/hda oder /dev/hdc. Der letzte Buchstabe kann ein Buchstabe von a bis d sein, je nachdem an welchen IDE Controller der Brenner als Slave oder Master angeschlossen ist. SCSI und SATA Brenner haben Gerätebezeichnungen wie /dev/sr0 oder /dev/sr1. Die Nummer wird für jedes vorhandene CD/DVD-Gerät einfach hochgezählt. Das erste SATA CD/DVD Laufwerk im System ist also immer /dev/sr0.

Daneben können auch die Optionen -v und -eject noch ganz nützlich sein. Die Option -v macht die Ausgabe von cdrecord etwas ausführlicher, wodurch sie den Fortschritt des Brennvorganges beobachten können. Die Option -eject sorgt dafür, daß die CD nach dem Brennvorgang ausgeworfen wird. Unser Befehl könnte jetzt also so aussehen:

cdrecord -v -eject -tao speed=16 dev=/dev/hdc meinecd.iso

Es ist auch möglich CD's "on the fly" zu brennen. Das heißt, das das erzeugen des CD-Dateisystems und das brennen in einem Rutsch erledigt werden. Hier kommt das Unixbaukastensystem mit seinen Pipes zum Einsatz. Wir erinnern uns, daß der Befehl mkisofs per Default auf die Standardausgabe schreibt. Mit einer Pipe läßt sich das so umleiten, daß dies zur Eingabe des Befehls cdrecord wird:

mkisofs -r -J brennordner | cdrecord -v -eject -tao driveropts=burnfree speed=16 dev=0,0,0

Wie man sieht wurde hier noch eine Option für cdrecord verwendet: driveropts=burnfree. Diese Option weist den CD-Brenner an den Schutz gegen Buffer-Underruns einzuschalten. Gerade wenn man "on the fly" brennt, kann es schneller zu den gefürchteten Buffer-Underruns kommen, wodurch der Rohling ruiniert wird. Selbstverständlich muß der Brenner diese Option unterstützen.

Was aber wenn man gar keine Dateien oder Ordner von der Festplatte brennen will, sondern eine vorhandene CD kopieren will? In diesem Fall nützt mir der Befehl mkisofs nichts. Dafür existiert das Programm readcd, welches zusammen mit cdrecord und mkisofs ebenfalls Bestandteil der cdrtools ist. Folgender Befehl erzeugt aus einer ins Laufwerk /dev/sr0 eingelegten CD ein Isoimage mit dem Namen image.iso:

readcd dev=/dev/sr0 f=image.iso

Mit dev= wird das Gerät angegeben von dem gelesen wird und mit f= wird die Ausgabedatei angegeben. Anschließend kann dieses Iso-Image wieder mit cdrecord gebrannt werden.

Was ist mit CD-RWs?

CD-RW Medien können wiederbeschrieben, also auch gelöscht werden. cdrecord kennt dafür die Option blank=. Mit blank=fast wird eine CD-RW vor dem schreiben gelöscht. Das Wiederbeschreiben einer CD-RW könnte zum Beispiel so aussehen:

cdrecord -v -eject blank=fast -tao dev=/dev/sr0 meinimage.iso

Durch blank=fast wird ein schnelles löschen der CD-RW durchgeführt, während ein blank=all alle Dateien der CD durch überschreiben löscht, was längere Zeit dauern kann.

Viele CDs werden unter Windows, sowie auch in grafischen Oberflächen unter Linux mit einem Namen angezeigt. Diese Namen sind eine Eigenschaft des CD-Dateisystems und können mit der mkisofs-Option -V erzeugt werden. Zum Beispiel erzeugt folgender Aufruf ein CD-Image mit dem Dateisystemnamen "Hallo Welt":

mkisofs -l -r -J -V "Hallo Welt" -o meiniso.iso brenndir/

Es ist mit mkisofs auch möglich bootfähige CDs zu erstellen. Dazu wird nur ein Bootimage oder ein CD-Bootloader benötigt. Zum Booten von CDs existiert der Eltorito Standard. Grundsätzlich gibt es verschiedene Arten wie von einer CD gebootet werden kann: Als Diskettenemulation, als Festplattenemulation oder ohne Emulation unmittelbar von der CD. Meistens wird ohne Emulation gebootet, aber auch die Diskettenemulation wird manchmal noch verwendet, während die Festplattenemulation kaum verwendet wird.

Für die Diskettenemulation wird das Image einer bootfähigen Diskette benötigt. Nehmen wir an es liegt ein solches Image unter dem Dateinamen disk.img vor. Dieses Image wird direkt in das Verzeichnis mit den weiteren zu brennenden Daten abgelegt (nenen wir es brenndir). Ein bootfähiges Iso-Image läßt sich dann so erstellen:

mkisofs -l -r -J -b disk.img -c boot.cat -o meinisoimage.iso brenndir/

Die Optionen -l -r, -J und -o wurden bereits erklärt. Neu sind die beiden Optionen -b und -c hinzu gekommen. Mit -b wird das Bootimage angegeben. Dies muß eine Datei unter den zu brennenden Daten sein. Das Image muß mit einem Dateipfad relativ zum Ordner mit dem zu brennenden Dateien angegeben werden. Wenn der Ordner mit dem zu brennenden Daten also brenndir heißt und das momentane Arbeitsverzeichniss direkt darüber liegt, geben sie nicht -b brenndir/disk.img an, sondern nur disk.img.

Die Option -c ist ebenfalls zum booten notwendig. Diese Datei wird von mkisofs automatisch erstellt und enthält Informationen zum booten für das Bios des Rechners (der sogenannte boot catalog).

Soll die CD ohne Diskettenemulation booten, muß mit -b statt eines Diskettenimages ein CD Bootblock angegeben werden. Dieser ist im allgemeinen 2 kb oder ein vielfaches davon groß und startet den eigentlichen Betriebssystemspezifischen Bootloader. Zusätzlich muß auch die Option -no-emul-boot angegeben werden. Ein Aufruf für so eine CD könnte etwa so aussehen:

mkisofs -l -r -J -b BOOT.BIN -no-emul-boot -boot-load-size 4 -c boot.cat -o meinecd.iso brenndir/

In diesem Fall handelt es sich bei BOOT.BIN um eine 2 kb große Datei für den CD-Boot. Zusätzlich wurde die Option -boot-load-size 4 verwendet welche dem Dateisystem noch zusätzlich bekannt gibt, das die Bootdatei 4 Blöcke (= 2 kb) groß ist. Diese Angabe ist nicht unbedingt nötig, für viele Systeme aber zum booten hilfreich.

Möchte man eine bootfähige CD remastern und weiß nicht wo der Bootblock der CD ist, kann man diesen mit dem Werkzeug isoinfo ermitteln. isoinfo ist ebenfalls Bestandteil der cdrtools. Es gibt Informationen über Iso-Image und CDs aus. Folgender Aufruf gibt Informationen über eine in das Laufwerk /dev/hda eingelegte CD aus:

isoinfo -d -i /dev/hda

Die Option -i definiert jeweils das Gerät oder die Isodatei über die isoinfo Informationen ausgeben soll. Die option -d gibt allgemeine Informationen über die CD wie etwa über die Verwendung von Joliet oder Rockridge Erweiterungen, sowie über eventuelle Bootimages aus.

Interessant an der Ausgabe über die Eltorito Eigenschaften zum extrahieren eines Bootimages sind die Felder die mit Boot media, Nsect und Bootoff beginnen.

Im Feld Boot media steht der Boottyp der CD, also ob es sich um eine Diskettenemulation oder keine Emulation handelt. In Bootoff stehen die Datenblöcke auf der CD in der der Bootblock zu finden ist einmal als Hexadezimale Zahl und danach in der Dezimalen Entsprechung. Falls es sich um keine Emulation handelt, kann an dem Wert hinter Nsect abgelesen werden wieviele Blöcke der Bootcode einnimmt (im allgemeinen 4).

Mit diesen Informationen kann der Bootblock einfach aus der CD extrahiert werden. Dazu wird dd benutzt. Das Standardunixkommando dd dient zum (rohen) blockweisen Kopieren von Daten. Mit dd lassen sich auch ganze Dateisysteme duplizieren. Sollte die CD keine Emulation benutzen und der Bootblock 2 kb (4 Blöcke) groß sein und die Ausgabe von Bootoff war: "Bootoff CEE3 52963" dann sieht der entsprechende dd Befehl so aus:

dd if=/dev/sr0 of=BOOT.BIN bs=2048 count=1 skip=52963

Mit if wird die Eingabedatei festgelegt. In diesem Fall das Laufwerk /dev/sr0. mit of= wird die Ausgabedatei fetsgelegt, das heißt in diesem Fall landet das Boot-Image in der Datei BOOT.BIN. Mit bs= wird die Blockgröße die mit jedem Durchlauf kopiert wird festgelegt. Mit count= wird die Anzahl an Durchläufen festgelegt. Aus der Multiplikation von count und bs ergibt sich daher die Menge der kopierten Daten. Mit skip= wird festgelegt wieviel Blöcke vom Anfang übersprungen werden. Da sich der Bootblock laut Ausgabe von isoinfo im Block Nummer 52963 befindet, wird genau diese Angabe hier verwendet. Das Iso 9660 Dateisystem verwendet 2048 Byte große Blöcke.

Mit dieser Methode kann zum Beispiel eine Windows Installations-CD auf die Festplatte kopiert, verändert und anschließend wieder Bootfähig gebrannt werden, so das der Windows-Bootloader wieder von CD starten kann.

Was ist mit DVDs?

Die meisten auf Linuxsystemen eingesetzten Versionen von cdrecord sind nicht in der Lage DVDs zu brennen. Für das brennen von DVDs existiert daher auch das Programm growisofs aus den dvd+rw-tools. Das erzeugen eines Iso-Images ist für DVDs identisch zu CDs. Auch DVD-Images können mit mkisofs erzeugt werden. Zum Brennen eines solchen Images läßt sich dann folgender Befehl einsetzen:

growisofs -dvd-compat -Z /dev/sr0=meinimage.iso

Die Option -dvd-compat legt die DVD so an, das eine größtmögliche Kompatibilität zu DVD-Rom Laufwerken besteht. Die Option -Z initiiert eine neue Sitzung. Nach -Z muß das Laufwerk angegeben werden. Soll ein Iso-Image gebrannt werden wird dies mit einem Gleichheitszeichen an die Gerätebezeichnung angehängt. Soll "on the fly" gebrannt werden, wird statt dem Image die entsprechenden mkisofs Optionen angegeben. growisofs greift dann automatisch auf mkisofs zurück. Das kann dann so aussehen:

growisofs -dvd-compat -Z /dev/hda -l -r -J brenndir/

Die hinter dem Gerät angegebenen Optionen sind die Optionen für mkisofs, wobei -o natürlich nicht angegeben werden darf.

Zurück

Zurück nach oben
Shell mit Kommandoprompt