2Apr il 2003, 17:00:47 The Complete FreeBSD (bur ncd.mm), page 243 13 Writing CD-Rs In this chapter: • Creating an ISO-9660 image • Bur ning the CD-R • Copying CD-ROMs In this chapter: • Creating an ISO-9660 image • Bur ning the CD-R • Copying CD-ROMs Under FreeBSD, data on conventional hard disks is stored in the UNIX File System or UFS format. CD-ROMs and CD-Rs use a different file system, the ISO 9660 format, which is compatible with other systems. This is not a problem when you mount a CD- ROM: FreeBSD includes a read-only ISO 9660 file system. When you want to write a CD-R, however, things are a little more complicated: the medium requires you to write the entire file system at once, and since the file system is stored in a different format, you can’tjust copythe UFS file system. Instead, you must first create an image of the file system that you want to put on the CD-R, and then you copyit. We’ll look at these steps in more detail below. Creating an ISO-9660 image The first step is to create the ISO 9660 file system image, frequently simply called an ISO image.There are a number of ports available in the Ports Collection; here we’ll look at mkisofs,which is part of the cdrtools port. Installation isn’tquite as straightforward as you might expect: you need a special flag to install mkisofs: # cd /usr/ports/sysutils/cdrtools # make install -DMKISOFS mkisofs has a bewildering number of parameters. Here are the important ones: • The -A option specifies the application ID,atextstring written to the header of the file system to describe the ‘‘application’’onthe image. It can be up to 128 characters long. burncd.mm,v v4.13 (2003/04/02 06:46:59) 243 Creating an ISO-9660 image 244 2April 2003, 17:00:47 The Complete FreeBSD ( /tools/tmac.Mn), page 244 • Use -b if you want to be able to boot from the CD, such as a FreeBSD bootable CD. In the case of FreeBSD, use the 2.88 MB image floppies/boot.flp which is built as part of the release process. Note that this file must be in one of the directories included in the image, and the name is relative tothe root directory of the CD. • The -f option tells mkisofs to followsymbolic links. If you don’tspecify this option and you have symbolic links in the directory from which you create the image, the resultant CD-ROM image will contain only a symbolic link instead of the file itself. If the file to which the symbolic link points is belowthe top-level(root) directory,this is the preferred way to do things, because it savesspace, but if it points outside the CD-ROM, the file will not appear on the CD-ROM at all. Use this option if you have symbolic links to files outside the directory that you’re using for the root of the CD- ROMfile system. • The -J option makes the CD compatible with Microsoft’s Joliet format. You don’t need it for FreeBSD, but it doesn’tcost much, so it’sagood idea to include it if there’sachance the CD will be used in a Microsoft environment. • Use the -o option to specify the name of the resultant ISO image. This image is the size of the resultant CD, so it could be up to 700 MB. • The -p option specifies the preparer ID,another ISO 9660 header field to specify who made the CD-ROM. • The -r option specifies the RockRidgeExtensions that are used to store UNIX file names. It makes a number of assumptions about permissions and owners; see the man page for details. It takes no parameters. • The -T option tells mkisofs to include a translation file TRANS.TBL in each directory for use by systems that don’tsupport the Rock Ridge extensions. For each file name in the directory, TRANS.TBL contains a Microsoft-compatible name (up to eight characters, a period (.)and up to three more characters). The names bear a slight resemblance to the original names. • If you don’tlikethe name TRANS.TBL,you can specify a different name with the -table-name option, which implies -T.For example, if you write -table-name .MAP you will generate names that won’tshowupwith a normal ls command. • The -V option specifies the volume ID for the file system. This will normally be more specific than the application ID; for example, each CD in a set of CDs might have the same application ID and a different volume ID. • The final parameters are the names of the directories that will be included in the image. You can specify multiple directories. In each case, the entire directory hierarchywill be included. burncd.mm,v v4.13 (2003/04/02 06:46:59) 245 Chapter 13: Writing CD-Rs 2April 2003, 17:00:47 The Complete FreeBSD ( /tools/tmac.Mn), page 245 This is a lot of stufftotype in every time. It’seasier to write a Makefile and use make: APPLID = "Dummy application" BOOT = #Tomake it bootable, put in something like this: #Note that the -b option is there as well #BOOT = "-b floppies/boot.flp" ISO = /var/tmp/isoimage PREPARER = "me" VOLID = "Volume 0000" DIR = . cdrom: mkisofs -A ${APPLID} ${BOOT} -J -o ${ISO} -f \ -p ${PREPARER} -r -T -V ${VOLID} ${DIR} Forexample, to makea bootable CD-R of the FreeBSD release, you would first perform the makeworld and makerelease.Assuming that the release directory is /home/release, you will find the directory trees for the first twoCD-ROMs in /home/re- lease/R/cdrom/disc1 and /home/release/R/cdrom/disc2.You could do this: # make cdrom DIR=/home/release/R/cdrom/disc1 mkisofs -A "Dummy application" -J -o /iso -table-name .MAP -p "Greg Lehey" -r -T -V "Volume 0000" . 6.40% done, estimate finish Sun Aug 27 13:34:54 2000 12.79% done, estimate finish Sun Aug 27 13:35:02 2000 19.19% done, estimate finish Sun Aug 27 13:35:05 2000 25.57% done, estimate finish Sun Aug 27 13:35:10 2000 31.97% done, estimate finish Sun Aug 27 13:35:10 2000 38.36% done, estimate finish Sun Aug 27 13:35:10 2000 44.75% done, estimate finish Sun Aug 27 13:35:10 2000 51.15% done, estimate finish Sun Aug 27 13:35:12 2000 57.54% done, estimate finish Sun Aug 27 13:35:12 2000 63.94% done, estimate finish Sun Aug 27 13:35:12 2000 70.34% done, estimate finish Sun Aug 27 13:35:11 2000 76.72% done, estimate finish Sun Aug 27 13:35:13 2000 83.12% done, estimate finish Sun Aug 27 13:35:12 2000 89.52% done, estimate finish Sun Aug 27 13:35:13 2000 95.90% done, estimate finish Sun Aug 27 13:35:13 2000 Total translation table size: 35119 Total rockridge attributes bytes: 59724 Total directory bytes: 104448 Path table size(bytes): 256 Max brk space used 86224 78211 extents written (152 Mb) The progress reports are rather boring nowadays, considering that the whole process only takes a couple of minutes, but the summary information at the bottom can be of interest. Testing the CD-R So nowyou have anISO image. Howdoyou knowit’scorrect? It’sjust a single file, and it could have just about anything on it. Youcan burn a CD, of course, but if it’sjunk, you have another coaster.Ifyou’re not sure, it’sbetter to look inside first. Youcan do that by using it as the basis for an md vnode device. The md drivercreates a number of different kinds of pseudo-device. See the man page md(4) for more details. We use the vnode device, a special file that refers to file system files. Support for md is included in the GENERIC kernel, but if you’ve built a kernel burncd.mm,v v4.13 (2003/04/02 06:46:59) Creating an ISO-9660 image 246 2April 2003, 17:00:47 The Complete FreeBSD ( /tools/tmac.Mn), page 246 without the md driver, you can load it as a kld.Ifyou’re not sure, try loading the kld anyway.Then you associate a vnode device with the ISO image iso-image using the program mdconfig: # kldload md load the kld module if necessary kldload: can’t load md: File exists already loaded or in the kernel # mdconfig -a -t vnode -f iso-image configurethe device md0 this is the name assigned # mount -t cd9660 /dev/md0 /mnt mount it After this, you will be able to access the image at /mnt as a normal file system. Don’t forget to unmount and unconfigure the file when you’re finished: # umount /mnt # mdconfig -d -u 0 Older releases of FreeBSD used the vn driver, which used different syntax. Burning the CD-R Once you have created and tested an ISO image, you can copyittoCD-R. For SCSI burners, you use cdrecord;ATA (IDE) CD-R burners you use burncd.Inthe 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 likethis in your dmesg output: acd0: CD-RW <RWD RW4224> at ata1-slave BIOSPIO burncd has both flags and commands. Forour purposes, the most important flags are: • The -f device option specifies the device to use for the burning process. • The -m option tells burncd to close the disk in multisession mode. • The -q option tells burncd to be quiet and not to print progress messages. In fact, it’snot 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 fewextra progress messages. burncd.mm,v v4.13 (2003/04/02 06:46:59) 247 Chapter 13: Writing CD-Rs 2April 2003, 17:00:47 The Complete FreeBSD ( /tools/tmac.Mn), page 247 The most important commands for writing ISO 9660 CD-ROMs are: • data or mode1 write data tracks, also known as mode1 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’trecognize a command, it assumes it’safile name. If it does, it assumes it isn’tafile name. This can be confusing: there are other commands not mentioned in the list above,for example raw.Ifyou have anISO file called raw,you’ll have torename 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’san8x 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 makesure 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’tkeep up, you’ll get an underrun,agap in the data, and your CD-R is worthless (a coaster). To makesure you don’tmakecoasters, you should do a test run. The system goes through all the motions, but it doesn’tactually 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. Totest 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 finished. 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’snot really serious, though: the CD has not really been written, so it’snot possible to read from it. Anumber of CD-R drivesreturn error conditions under these circumstances. If everything was OK in the test run, you can repeat the command without the -t flag: # burncd -f /dev/acd0c -v -s 8 data iso fixate The output is identical, but this time you should not get the error message. burncd.mm,v v4.13 (2003/04/02 06:46:59) Bur ning the CD-R 248 2April 2003, 17:00:47 The Complete FreeBSD ( /tools/tmac.Mn), page 248 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). Youcan get these parameters from the dmesg output in /var/run/dmesg.boot,but there’saneasier way: # cdrecord -scanbus Cdrecord 1.9 (i386-unknown-freebsd4.1) Copyright (C) 1995-2000 Jörg 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) ’TEAC ’ ’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’ttell you exactly which devices are CD-Rs, and it also doesn’tlook at anyexcept the first SCSI bus. Alternatively,you can use the standard system utility camcontrol: # camcontrol devlist <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’sthe Matsushita CW-7503 (‘‘MATSHITA’’)atthe 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’san8xspeed (i.e. it records at 8 times the speed at which a normal audio CD is played). Before you do this, though, you should makesure 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’tkeep up, you’ll get an underrun,agap in the data, and your CD-R is worthless (a coaster). burncd.mm,v v4.13 (2003/04/02 06:46:59) 249 Chapter 13: Writing CD-Rs 2April 2003, 17:00:47 The Complete FreeBSD ( /tools/tmac.Mn), page 249 To makesure you don’tmakecoasters, you should do a dummy run. The system goes through all the motions, but it doesn’tactually 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. Toburn 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 Jörg 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 givesyou an idea howwell the system is keeping up with the burner.Ifthe 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%. burncd.mm,v v4.13 (2003/04/02 06:46:59) Bur ning the CD-R 250 2April 2003, 17:00:47 The Complete FreeBSD ( /tools/tmac.Mn), page 250 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 leveldropping much lower. When you’re sure that you won’thav e anyproblems, 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 makeaverbatim copyofanother CD. There are copyright implications here, of course, but manyCD-ROMs are not restricted. In particular,you may makecopies of FreeBSD CD-ROMs for your personal use. CD-ROMs are already in ISO format, of course, so to get a file iso,asinthe examples above,you could just perform a literal copywith dd: # dd if=/dev/cd0c of=iso bs=128k The bs=128k tells dd to copyinblocks of 128 kB. It’snot strictly necessary,but if you omit it, it will perform a separate transfer for every sector,and on a slowmachine it can be much less efficient. There’saneveneasier way,though, if you have two CD-ROM drives: you can frequently copydirectly from one drive tothe other,without storing on disk at all. To dothis, of course, you need to be very sure that your CD-ROM drive isfast enough. In particular,if it spins down during the copy, you will almost certainly have underruns and a useless copy. Bevery sure to do a dummy run first. Let’sassume 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’tneed to mount /dev/cd1c,since it’sbeing accessed as rawdata, not a file system. When you’re sure this will work, remove the -t flag and repeat. ForSCSI, enter # cdrecord -dummy -v dev=0,0,0 -speed=8 /dev/cd1c When it completes satisfactorily,remove the -dummy and repeat. burncd.mm,v v4.13 (2003/04/02 06:46:59) . 2Apr il 2003, 17:00:47 The Complete FreeBSD (bur ncd.mm), page 243 13 Writing CD-Rs In this chapter: • Creating an ISO-9660 image • Bur ning the CD-R • Copying. conventional hard disks is stored in the UNIX File System or UFS format. CD-ROMs and CD-Rs use a different file system, the ISO 9660 format, which is compatible with