Опубликован: 06.08.2012 | Доступ: свободный | Студентов: 1189 / 25 | Оценка: 5.00 / 5.00 | Длительность: 53:41:00
Лекция 13:

Writing CD-Rs

< Лекция 12 || Лекция 13: 12 || Лекция 14 >

Burning the CD-R

Once you have created and tested an ISO image, you can copy it to CD-R. For SCSI burners, you use cdrecord; ATA (IDE) CD-R burners you use burncd. In the following sections we'll look at both programs.

Burning a CD-R on an ATA burner

To burn a CD-R in an ATA (or IDE) burner, use burncd, which is part of the base system. Typically you'll only have one CD-R burner on the system, so it will be called /dev/acd0. You'll have something like this in your dmesg output:

acd0: CD-RW  <RWD RW4224> at atal-slave BIOSPIO

burncd has both fags and commands. For our purposes, the most important fags are:

  • The -f device option specifies the device to use for the burning process.
  • The -m option tells burncd to close the disk in multi session mode.
  • The -q option tells burncd to be quiet and not to print progress messages. In fact, it's not very verbose anyway.
  • The -s speed option specifies the speed of the burner device. It defaults to 1, so you'll save a lot of time using this.
  • The -t option specifies a test write: burncd does not actually write on the medium.
  • The -v (verbose) option prints a few extra progress messages.

The most important commands for writing ISO 9660 CD-ROMs are:

  • data or model write data tracks, also known as model tracks, for the image files named on the command line.
  • fixate fixates the medium by generating the table of contents. This should be the last command to burncd.

If burncd doesn't recognize a command, it assumes it's a file name. If it does, it assumes it isn't a file name. This can be confusing: there are other commands not mentioned in the list above, for example raw. If you have an ISO file called raw, you‘ll have to rename it before you can burn it with burncd.

Before you start, you should decide on the recording speed. If your machine is fast enough, use the rated recording speed. In the case of the example machine, that's an 8x speed (i.e. it records at eight times the speed at which a normal audio CD is played). Before you do this, though, you should make sure that your system can keep a sufficient data rate so that there is always data available to transfer to the CD-R. If it can't keep up, you'll get an underrun, a gap in the data, and your CD-R is worthless (a coaster).

To make sure you don't make coasters, you should do a test run. The system goes through all the motions, but it doesn't actually write anything to the CD-R blank. Nevertheless, it tests all aspects of the burn, so you must have a valid CD-R blank in the drive, otherwise the attempt will fail. To test burn an image called iso, enter:

# burncd -f /dev/acd0c -t -v -s 8 data iso fixate
adding type 0x08 file iso size 184576 KB 92288 blocks
next writeable LBA 0
addr = 0 size = 189005824 blocks = 92288
writing from file iso size 184576 KB
written this track 6880 KB (3%) total 6880 KB

At this point, burncd overwrites the line with progress indications until it is find. Finally, you see:

written this track 184576 KB (100%) total 184576 KB
fixating CD, please wait..
burncd: ioctl(CDRIOCFIXATE): Input/output error

This last line appears a little alarming. It's not really serious, though: the CD has not really been written, so it's not possible to read from it. A number of CD-R drives return error conditions under these circumstances.

If everything was OK in the test run, you can repeat the command without the -t fag:

# burncd -f /dev/acd0c -v -s 8 data iso fixate

The output is identical, but this time you should not get the error message.

Burning a CD-R on a SCSI burner

If you have a SCSI burner, use cdrecord, which is part of the cdrtools port we installed on page 243. cdrecord has a rather strange habit of not using device names: instead, it accesses the device directly by its SCSI parameters (bus, unit and LUN). You can get these parameters from the dmesg output in /var/run/dmesg.boot, but there's an easier way:

# cdrecord -scanbus
Cdrecord 1.9 (i386-uriknown-freebsd4.1) Copyright (C) 1995-2000 Jorg Schilling
Using libscg version 'schily-0.1'
scsibus0:
  0,0,0  0)  'MATSHITA'  'CD-R   CW-7503  ' '1.06'  Removable CD-ROM
cdrecord: Warning: controller returns zero sized CD capabilities page,
cdrecord: Warning: controller returns wrong size for CD capabilities page,
cdrecord: Warning: controller returns wrong page 0 for CD capabilities page (2A).
  0,1,0  1)  ‘IEAC    '  'CD-ROM CD-532S  ' '1.0A'  Removable CD-ROM
  0,2,0  2)  *      
  0,3,0  3)  *      
  0,4,0  4)  'SONY    '  'SDT-10000       ' '0101'  Removable Tape
  0,5,0  5)  *      
  0,6,0  6)  *      
  0,7,0  7)  *      
  0,8,0  8)  'QUANTUM '  'QM318000TD-SW   ' 'N491'  Disk

This output doesn't tell you exactly which devices are CD-Rs, and it also doesn't look at any except the first SCSI bus. Alternatively, you can use the standard system utility camcontrol:

<MATSHITA CD-R   CW-7503 1.06>   at  scbus0  target  0  lun  0  (pass0,cd0)
<TEAC CD-ROM CD-532S 1.0A>       at  scbus0  target  1  lun  0  (pass1,cd1)
<SONY SDT-10000 0101>            at  scbus0  target  4  lun  0  (sa0,pass2)
<QUANTUM QM318000TD-SW N491>     at  scbus0  target  8  lun  0  (pass3,da0)
<EXABYTE EXB-8505SMBANSH2 0793>  at  scbus1  target  1  lun  0  (sa1,pass4)
<Quantum DLT4000 CC1E>           at  scbus1  target  3  lun  0  (sa2,pass5)
<AIWA GD-8000 0119>              at  scbus1  target  4  lun  0  (sa3,pass6)
<NRC MBR-7 110>                  at  scbus1  target  6  lun  0  (pass7,cd2)
<NRC MBR-7 110>                  at  scbus1  target  6  lun  1  (pass8,cd3)
<NRC MBR-7 110>                  at  scbus1  target  6  lun  2  (pass9,cd4)
<NRC MBR-7 110>                  at  scbus1  target  6  lun  3  (pass10,cd5)
<NRC MBR-7 110>                  at  scbus1  target  6  lun  4  (pass11,cd6)
<NRC MBR-7 110>                  at  scbus1  target  6  lun  5  (pass12,cd7)
<NRC MBR-7 110>                  at  scbus1  target  6  lun  6  (pass13,cd8)

Either way, you need to recognize the CD-R device, which in this case is relatively easy: it's the Matsushita CW-7503 ("MATSHITA ") at the very beginning of each list. cdrecord refers to this device as 0,0,0 (bus 0, target 0, LUN 0).

The next thing to look at is the recording speed. If your machine is fast enough, use the rated recording speed. In the case of the example machine, that's an 8x speed (i.e. it records at 8 times the speed at which a normal audio CD is played). Before you do this, though, you should make sure that your system can keep a sufficient data rate so that there is always data available when to go on the CD. If you can't keep up, you'll get an underrun, a gap in the data, and your CD-R is worthless (a coaster).

To make sure you don't make coasters, you should do a dummy run. The system goes through all the motions, but it doesn't actually write anything to the CD-R blank. Nevertheless, it tests all aspects of the burn, so you must have a valid CD-R blank in the drive, otherwise the attempt will fail. To burn an image called iso, enter:

# cdrecord -dummy -v dev=0,0,0 -speed=8 iso
Cdrecord 1.9 (i386-unknown-freebsd5.0) Copyright (C) 1995-2000 Jorg Schilling
TOC Type: 1 = CD-ROM
scsidev: '0,0,0'
scsibus: 0 target: 0 lun: 0
Using libscg version 'schily-0.1'
atapi: 0
Device type    : Removable CD-ROM
Version        : 2
Response Format: 2
Capabilities   : SYNC LINKED
Vendor_info    : 'MATSHITA'
Identifikation : 'CD-R  CW-7503 '
Revision       : '1.06'
Device seems to be: Generic mmc CD-R.
Using generic SCSI-3/mmc CD-R driver (mmc_cdr).
Driver flags   : SWABAUDIO
FIFO size      : 4194304 = 4096 KB
Track 01: data 152 MB
Total size:    175 MB (17:22.84) = 78213 sectors
Lout start:    175 MB (17:24/63) = 78213 sectors
Current Secsize: 2048 ATIP info from disk:
  Indicated writing power: 5
  Is not unrestricted
  Is not erasable
  ATIP start of lead in:  -11080 (97:34/20)
  ATIP start of lead out: 335100 (74:30/00)
Disk type:    Long strategy type (Cyanine, AZO or similar) Manuf. index: 11
Manufacturer: Mitsubishi Chemical Corporation
Blocks total: 335100 Blocks current: 335100 Blocks remaining: 256887
RBlocks total: 342460 RBlocks current: 342460 RBlocks remaining: 264247
Starting to write CD/DVD at speed 8 in dummy mode for single session.
Last chance to quit, starting dummy write in 1 seconds.
Waiting for reader process to fill input buffer ... input buffer ready.
Starting new track at sector: 0
Track 01: 0 of 152 MB written (fifo 100%).

At this point, cdrecord overwrites the last line with progress indications until it is finished. If you're watching, keep an eye on the fifo information at the end of the line. This gives you an idea how well the system is keeping up with the burner. If the utilization drops to 0, you will get an underrun, and the blank would have become a coaster if this were for real.

Finally, you see:

Track 01: 152 of 152 MB written (fifo 100%).
Track 01: Total bytes read/written: 160176128/160176128 (78211 sectors).
Writing  time: 136.918s
Fixating...
WARNING: Some drives don't like fixation in dummy mode. Fixating time: 35.963s
cdrecord: fifo had 2523 puts and 2523 gets.
cdrecord: fifo was 0 times empty and 2451 times full, min fill was 96%.

The summary information at the end shows that at some point the fifo dropped below 100% full, but this is far from being a problem. If, on the other hand, there was a lot of disk activity at the same time, you might find the fifo level dropping much lower.

When you're sure that you won't have any problems, you can do the real thing: just repeat the command without the -dummy option. The output looks almost identical.

Copying CD-ROMs

Frequently you'll want to make a verbatim copy of another CD. There are copyright implications here, of course, but many CD-ROMs are not restricted. In particular, you may make copies of FreeBSD CD-ROMs for your personal use.

CD-ROMs are already in ISO format, of course, so to get a file /iso, as in the examples above, you could just perform a literal copy with dd:

# dd if=/dev/cd0c of=iso bs=128k

The bs=128k tells dd to copy in blocks of 128 kB. It's not strictly necessary, but if you omit it, it will perform a separate transfer for every sector, and on a slow machine it can be much less efficient.

There's an even easier way, though, if you have two CD-ROM drives: you can frequently copy directly from one drive to the other, without storing on disk at all. To do this, of course, you need to be very sure that your CD-ROM drive is fast enough. In particular, if it spins down during the copy, you will almost certainly have underruns and a useless copy. Be very sure to do a dummy run first. Let's assume that your second CD-ROM drive is /dev/cd1c (a SCSI drive). For IDE drives, write:

# burncd -f /dev/acd0c -t -v -s 8 data /dev/cd1c fixate

In this example, the -f option indicates that /dev/acd0c is the (IDE) CD-R burner. /dev/cd1c is the (SCSI) CD-ROM drive with the original CD-ROM. You don't need to mount /dev/cd1c, since it's being accessed as raw data, not a file system.

When you're sure this will work, remove the -t tag and repeat. For SCSI, enter

# cdrecord -dummy -v dev=0,0,0 -speed=8 /dev/cd1c

When it completes satisfactorily, remove the -dummy and repeat.

< Лекция 12 || Лекция 13: 12 || Лекция 14 >