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/cdrtools port includes mkisofs(8), a program that you can use to produce a data file containing an ISO 9660 file system. It has options that support various extensions, and is described below.
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.
It is also possible to use cdrecord
and other tools
for SCSI drives on ATAPI hardware with the ATAPI/CAM module.
If you want CD burning software with a graphical user interface, you may wish to take a look at either X-CD-Roast or K3b. These tools are available as packages or from the sysutils/xcdroast and sysutils/k3b ports. X-CD-Roast and K3b require the ATAPI/CAM module with ATAPI hardware.
The mkisofs(8) program, which is part of the sysutils/cdrtools port, 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. By default, mkisofs(8) creates an
ISO image in the so-called „floppy disk emulation” mode,
and thus expects the boot image to be exactly 1200, 1440 or
2880 KB in size. Some boot loaders, like the one used by the
FreeBSD distribution disks, do not use emulation mode; in this case,
the -no-emul-boot
option should be used. So, if
/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 -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot
Having done that, if you have md
configured in your kernel, you can mount the file system with:
#
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 mkisofs(8) 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
. 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-Clone 2.01 (i386-unknown-freebsd7.0) Copyright (C) 1995-2004 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.
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 Sekcja 17.6.4, „cdrecord”.
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
. If the entries are missing,
force the system to retaste the media:
#
dd if=/dev/acd0 of=/dev/null count=1
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
mkisofs(8), 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.
#
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. (The FreeBSD 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 mkisofs(8) as described above.
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
line to the /boot/loader.conf
file:
atapicam_load="YES"
then, reboot your machine.
If you prefer to statically compile the atapicam(4) support in your kernel, you will have to add this line to your kernel configuration file:
device atapicam
You also need the following lines in your kernel configuration file:
device ata device scbus device cd device pass
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.
All FreeBSD documents are available for download at http://ftp.FreeBSD.org/pub/FreeBSD/doc/
Questions that are not answered by the
documentation may be
sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.