Contributed by Mike Meyer.
CDs have a number of features that differentiate them from conventional disks.
Initially, they were not writable by the user. They are designed so that they can be read
continuously without delays to move the head between tracks. They are also much easier to
transport between systems than similarly sized media were at the time.
CDs do have tracks, but this refers to a section of data to be read continuously and
not a physical property of the disk. To produce a CD on FreeBSD, you prepare the data
files that are going to make up the tracks on the CD, then write the tracks to the
CD.
The ISO 9660 file system was designed to deal with these differences. It unfortunately
codifies file system limits that were common then. Fortunately, it provides an extension
mechanism that allows properly written CDs to exceed those limits while still working
with systems that do not support those extensions.
The sysutils/mkisofs program is used to produce a data file
containing an ISO 9660 file system. It has options that support various extensions, and
is described below. You can install it with the sysutils/mkisofs port.
Which tool to use to burn the CD depends on whether your CD burner is ATAPI or
something else. ATAPI CD burners use the burncd program that is part of the base system.
SCSI and USB CD burners should use cdrecord from the sysutils/cdrtools port.
burncd has a limited number of supported drives. To find out
if a drive is supported, see the CD-R/RW supported drives list.
Note: If you run FreeBSD 5.X, FreeBSD 4.8-RELEASE version or higher,
it will be possible to use cdrecord and other tools for SCSI drives on an
ATAPI hardware with the ATAPI/CAM module.
sysutils/mkisofs produces an ISO 9660 file system that is an
image of a directory tree in the UNIX® file system
name space. The simplest usage is:
# mkisofs -o imagefile.iso /path/to/tree
This command will create an imagefile.iso containing an
ISO 9660 file system that is a copy of the tree at /path/to/tree. In the process, it will map the file names to
names that fit the limitations of the standard ISO 9660 file system, and will exclude
files that have names uncharacteristic of ISO file systems.
A number of options are available to overcome those restrictions. In particular, -R enables the Rock Ridge extensions common to UNIX systems, -J enables Joliet
extensions used by Microsoft systems, and -hfs can be used to
create HFS file systems used by Mac OS®.
For CDs that are going to be used only on FreeBSD systems, -U can be used to disable all filename restrictions. When used with
-R, it produces a file system image that is identical to the
FreeBSD tree you started from, though it may violate the ISO 9660 standard in a number of
ways.
The last option of general use is -b. This is used to
specify the location of the boot image for use in producing an ``El Torito'' bootable CD.
This option takes an argument which is the path to a boot image from the top of the tree
being written to the CD. So, given that /tmp/myboot holds a
bootable FreeBSD system with the boot image in /tmp/myboot/boot/cdboot, you could produce the image of an ISO 9660
file system in /tmp/bootable.iso like so:
# mkisofs -U -R -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot
Having done that, if you have vn (FreeBSD 4.X), or
md (FreeBSD 5.X) configured in your kernel, you can
mount the file system with:
# vnconfig -e vn0c /tmp/bootable.iso
# mount -t cd9660 /dev/vn0c /mnt
for FreeBSD 4.X, and for FreeBSD 5.X:
# mdconfig -a -t vnode -f /tmp/bootable.iso -u 0
# mount -t cd9660 /dev/md0 /mnt
At which point you can verify that /mnt and /tmp/myboot are identical.
There are many other options you can use with sysutils/mkisofs to fine-tune its behavior. In particular:
modifications to an ISO 9660 layout and the creation of Joliet and HFS discs. See the mkisofs(8) manual
page for details.
If you have an ATAPI CD burner, you can use the burncd
command to burn an ISO image onto a CD. burncd is part of the
base system, installed as /usr/sbin/burncd. Usage is very
simple, as it has few options:
# burncd -f cddevice data imagefile.iso fixate
Will burn a copy of imagefile.iso on cddevice. The default device is /dev/acd0 (or /dev/acd0c under
FreeBSD 4.X). See burncd(8) for options
to set the write speed, eject the CD after burning, and write audio data.
If you do not have an ATAPI CD burner, you will have to use cdrecord to burn your CDs. cdrecord is not
part of the base system; you must install it from either the port at sysutils/cdrtools or the appropriate package. Changes to the
base system can cause binary versions of this program to fail, possibly resulting in a
``coaster''. You should therefore either upgrade the port when you upgrade your system,
or if you are tracking -STABLE, upgrade the port
when a new version becomes available.
While cdrecord has many options, basic usage is even simpler
than burncd. Burning an ISO 9660 image is done with:
# cdrecord dev=device imagefile.iso
The tricky part of using cdrecord is finding the dev to use. To find the proper setting, use the -scanbus flag of cdrecord, which might
produce results like this:
# cdrecord -scanbus
Cdrecord 1.9 (i386-unknown-freebsd4.2) Copyright (C) 1995-2000 Jörg Schilling
Using libscg version 'schily-0.1'
scsibus0:
0,0,0 0) 'SEAGATE ' 'ST39236LW ' '0004' Disk
0,1,0 1) 'SEAGATE ' 'ST39173W ' '5958' Disk
0,2,0 2) *
0,3,0 3) 'iomega ' 'jaz 1GB ' 'J.86' Removable Disk
0,4,0 4) 'NEC ' 'CD-ROM DRIVE:466' '1.26' Removable CD-ROM
0,5,0 5) *
0,6,0 6) *
0,7,0 7) *
scsibus1:
1,0,0 100) *
1,1,0 101) *
1,2,0 102) *
1,3,0 103) *
1,4,0 104) *
1,5,0 105) 'YAMAHA ' 'CRW4260 ' '1.0q' Removable CD-ROM
1,6,0 106) 'ARTEC ' 'AM12S ' '1.06' Scanner
1,7,0 107) *
This lists the appropriate dev value for the devices on the
list. Locate your CD burner, and use the three numbers separated by commas as the value
for dev. In this case, the CRW device is 1,5,0, so the
appropriate input would be dev=1,5,0. There are easier ways to
specify this value; see cdrecord(1) for
details. That is also the place to look for information on writing audio tracks,
controlling the speed, and other things.
You can duplicate an audio CD by extracting the audio data from the CD to a series of
files, and then writing these files to a blank CD. The process is slightly different for
ATAPI and SCSI drives.
SCSI Drives
-
Use cdda2wav to extract the audio.
% cdda2wav -v255 -D2,0 -B -Owav
-
Use cdrecord to write the .wav
files.
% cdrecord -v dev=2,0 -dao -useinfo *.wav
Make sure that 2.0 is set appropriately, as described
in Section 12.5.4.
ATAPI Drives
-
The ATAPI CD driver makes each track available as /dev/acddtnn, where d is the drive number, and nn is
the track number written with two decimal digits, prefixed with zero as needed. So the
first track on the first disk is /dev/acd0t01, the second is
/dev/acd0t02, the third is /dev/acd0t03, and so on.
Make sure the appropriate files exist in /dev.
# cd /dev
# sh MAKEDEV acd0t99
Note: In FreeBSD 5.0,
devfs(5) will
automatically create and manage entries in /dev for you, so it
is not necessary to use MAKEDEV.
-
Extract each track using dd(1). You must also
use a specific block size when extracting the files.
# dd if=/dev/acd0t01 of=track1.cdr bs=2352
# dd if=/dev/acd0t02 of=track2.cdr bs=2352
...
-
Burn the extracted files to disk using burncd. You must
specify that these are audio files, and that burncd should
fixate the disk when finished.
# burncd -f /dev/acd0 audio track1.cdr track2.cdr ... fixate
You can copy a data CD to a image file that is functionally equivalent to the image
file created with sysutils/mkisofs, and you can use it to duplicate any data CD.
The example given here assumes that your CDROM device is acd0. Substitute your correct CDROM device. Under
FreeBSD 4.X, a c must be appended to the end of the
device name to indicate the entire partition or, in the case of CDROMs, the entire
disc.
# dd if=/dev/acd0 of=file.iso bs=2048
Now that you have an image, you can burn it to CD as described above.
Now that you have created a standard data CDROM, you probably want to mount it and
read the data on it. By default, mount(8) assumes that
a file system is of type ufs. If you try something like:
# mount /dev/cd0 /mnt
you will get a complaint about ``Incorrect super block'',
and no mount. The CDROM is not a UFS file system, so attempts
to mount it as such will fail. You just need to tell mount(8) that the file
system is of type ISO9660, and everything will work. You do
this by specifying the -t cd9660 option mount(8). For example,
if you want to mount the CDROM device, /dev/cd0, under /mnt, you would execute:
# mount -t cd9660 /dev/cd0 /mnt
Note that your device name (/dev/cd0 in this example)
could be different, depending on the interface your CDROM uses. Also, the -t cd9660 option just executes mount_cd9660(8). The
above example could be shortened to:
# mount_cd9660 /dev/cd0 /mnt
You can generally use data CDROMs from any vendor in this way. Disks with certain ISO
9660 extensions might behave oddly, however. For example, Joliet disks store all
filenames in two-byte Unicode characters. The FreeBSD kernel does not speak Unicode
(yet!), so non-English characters show up as question marks. (If you are running FreeBSD
4.3 or later, the CD9660 driver includes hooks to load an appropriate Unicode conversion
table on the fly. Modules for some of the common encodings are available via the sysutils/cd9660_unicode port.)
Occasionally, you might get ``Device not configured'' when
trying to mount a CDROM. This usually means that the CDROM drive thinks that there is no
disk in the tray, or that the drive is not visible on the bus. It can take a couple of
seconds for a CDROM drive to realize that it has been fed, so be patient.
Sometimes, a SCSI CDROM may be missed because it did not have enough time to answer
the bus reset. If you have a SCSI CDROM please add the following option to your kernel
configuration and rebuild your kernel.
options SCSI_DELAY=15000
This tells your SCSI bus to pause 15 seconds during boot, to give your CDROM drive
every possible chance to answer the bus reset.
You can choose to burn a file directly to CD, without creating an ISO 9660 file
system. Some people do this for backup purposes. This runs more quickly than burning a
standard CD:
# burncd -f /dev/acd1 -s 12 data archive.tar.gz fixate
In order to retrieve the data burned to such a CD, you must read data from the raw
device node:
# tar xzvf /dev/acd1
You cannot mount this disk as you would a normal CDROM. Such a CDROM cannot be read
under any operating system except FreeBSD. If you want to be able to mount the CD, or
share data with another operating system, you must use sysutils/mkisofs as described above.
Contributed by Marc Fonvieille.
This driver allows ATAPI devices (CD-ROM, CD-RW, DVD drives etc...) to be accessed
through the SCSI subsystem, and so allows the use of applications like sysutils/cdrdao or cdrecord(1).
To use this driver, you will need to add the following lines to your kernel
configuration file:
device atapicam
device scbus
device cd
device pass
You also need the following line in your kernel configuration file:
device ata
which should already be present.
Then rebuild, install your new kernel, and reboot your machine. During the boot
process, your burner should show up, like so:
acd0: CD-RW <MATSHITA CD-RW/DVD-ROM UJDA740> at ata1-master PIO4
cd0 at ata1 bus 0 target 0 lun 0
cd0: <MATSHITA CDRW/DVD UJDA740 1.00> Removable CD-ROM SCSI-0 device
cd0: 16.000MB/s transfers
cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed
The drive could now be accessed via the /dev/cd0 device
name, for example to mount a CD-ROM on /mnt, just type the
following:
# mount -t cd9660 /dev/cd0 /mnt
As root, you can run the following command to get the SCSI
address of the burner:
# camcontrol devlist
<MATSHITA CDRW/DVD UJDA740 1.00> at scbus1 target 0 lun 0 (pass0,cd0)
So 1,0,0 will be the SCSI address to use with cdrecord(1) and other
SCSI application.
For more information about ATAPI/CAM and SCSI system, refer to the atapicam(4) and cam(4) manual
pages.