Setting up a CD/DVD burner under FreeBSD

Installing the ATAPI/CAM Driver

If like me, you purchased one of those <$100 LiteOn IDE DVD burners, then you will most likely want to setup ATAPI/CAM before you go any further. 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.

Add the following lines to your kernel:

 
device atapicam
device scbus
device cd
device pass

For completeness, device ata needs to be in your kernel, but chances are, it's already there or you wouldn't even be booting.

Then rebuild, install your new kernel, and reboot your machine. During the boot process, your burner should show up, like so:

acd0: CDRW  at ata1-master UDMA33
GEOM: create disk cd0 dp=0xc697f600
cd0 at ata1 bus 0 target 0 lun 0
cd0:  Removable CD-ROM SCSI-0 device
cd0: 33.000MB/s transfers
cd0: Attempt to query device size failed: NOT READY, Medium not present

The drive could now be accessed via the /dev/cd0 device name, for example to mount a CD-ROM on /cdrom, just type the following:

# mount -t cd9660 /dev/cd0 /cdrom

Devfs

Before we go much farther, it is worth mentioning how to setup /etc/devfs.conf correctly so that you don't have to be root to do all of this. I have added the following lines to /etc/devfs.conf:

# Commonly used by many ports
link    acd0    cdrom
link    acd0    dvd
perm    acd0    0660
perm    cd0     0660
perm    pass0   0660
perm    pass1   0660
perm    pass2   0660
perm    pass3   0660
perm    xpt0    0666

In addition, in /etc/group, I added myself to the operator group so that I have group permissions to execute the above devices. These updates won't be effective until you reboot. However, you can make these changes by hand and they will stick then if you made the above changes.

Installing the Software

You will want to install the following ports. I'll cover what each does later on.

/usr/ports/sysutils/cdrtools
/usr/ports/sysutils/dvd+rw-tools
/usr/ports/sysutils/vobcopy
/usr/ports/multimedia/mplayer

mkisofs

To create a plain vanilla ISO9660 from a directory on your disk, do the following: (Remember that you can only save files with 8.3 chars file length, eight chars for the file name and three for the filetype).

# mkisofs -o cd.iso cd_dir

For an ISO9660 DVD with Joliet we do this: (Supports up to 31 chars in filename, most likely will only work on Windows).

# mkisofs -o cd.iso -J cd_dir

For an ISO9660 DVD with Joliet and Rock Ridge extension: (As I've understood this -J (Joliet) makes the DVD able to use filenames with up to 31 chars length, -r (Rock Ridge) do it for the *NIX systems. -l do so the disc actually use 31 character filenames).

# mkisofs -o cd.iso -J -r -l cd_dir

Checking your Setup

You can run the following command to get the SCSI address of the burner.

[tethys]:[10:55am]:[/home/rnejdl] > camcontrol devlist
      at scbus1 target 0 lun 0 (cd0,pass0)
[tethys]:[10:58am]:[/home/rnejdl] > 

So 1,0,0 will be the SCSI address to use with cdrecord(1) and other SCSI application.

Growisofs

growisofs was originally designed as a frontend to mkisofs to facilitate appending of data to ISO9660 volumes residing on random-access media such as DVD+RW, DVD-RAM, plain files, hard disk partitions. In otherwords, the growisofs does everything that mkisofs does and more. If you have your ISO image, you can use growisofs to burn directly to DVD as follows:

# growisofs -dvd-compat -speed=4 -Z /dev/cd0=image.iso

Of course you don't have to create an ISO file/image to be able to burn. We could just have passed the directory and other options to growisofs (as you probably remember growisofs is a frontend to mkisofs) and added a few flags for burning:

# growisofs -Z /dev/cd0 -r -J -speed=4 /folder/to/
Executing 'builtin_dd if=image.iso of=/dev/pass0 obs=32k seek=0'
16154624/3688857600 ( 0.4%) @3.4x, remaining 22:44
26902528/3688857600 ( 0.7%) @2.3x, remaining 20:25
...

Now if all went well we've gotten a new DVD disc with content. Everything worked well for me the first time and I hope everything went as well for you.

burncd

Burncd is the utility you use in FreeBSD if you have an atapi cdrom (or dvd) drive. It's fairly simple to use and almost every CDRom drive built after 1999 is support by it. Here's an example where I am burning the DragonFlyBSD cdrom to disc:

[tethys]:[10:45am]:[/home/rnejdl] > burncd -f /dev/acd0 data dfbsd-LATEST-GCC3.iso fixate

With rewritable CD's, you will need to erase them first. There are two methods of erasing, blank and erase. Blank is by far the quicker method and can be executed as follows:

[tethys]:[7:25pm]:[/home/rnejdl] > burncd -f /dev/acd0 blank
blanking CD - 99 % done
next writeable LBA 0
writing from file 5.2-CURRENT-20040809-SESNAP.iso size 243328 KB
written this track 243328 KB (100%) total 243328 KB
[tethys]:[7:33pm]:[/home/rnejdl] >

Then, to burn to the rewritable CD:

[tethys]:[7:33pm]:[/home/rnejdl] > burncd -f /dev/acd0 data 5.2-CURRENT-20040809-SESNAP.iso fixate
next writeable LBA 121816
writing from file 5.2-CURRENT-20040809-SESNAP.iso size 243328 KB
written this track 243328 KB (100%) total 243328 KB
[tethys]:[7:43pm]:[/home/rnejdl]

cdrecord

CDRecord is the cd burning utility you use if you have a scsi drive or if you have atapicam setup correctly (as listed above). To start, you should make sure that cdrecord sees your cd burner:

[tethys]:[11:02am]:[/home/rnejdl] > cdrecord -scanbus
Cdrecord 2.00.3 (i386-unknown-freebsd5.2.1) Copyright (C) 1995-2002 Jörg Schilling
Using libscg version 'schily-0.7'
scsibus1:
        1,0,0   100) 'LITE-ON ' 'DVDRW LDW-451S  ' 'GSB6' Removable CD-ROM
        1,1,0   101) *
        1,2,0   102) *
        1,3,0   103) *
        1,4,0   104) *
        1,5,0   105) *
        1,6,0   106) *
        1,7,0   107) *
[tethys]:[11:20am]:[/home/rnejdl] >

In this case, my nifty Lite-On DVD burner is on 1,0,0. Remember this, or if you are lazy like me, set it as an environmental variable. My CD burner can handle 24 speed writes, so I'm setting that as well:

setenv CDR_SPEED 24
setenv CDR_DEVICE 1,0,0

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

Vobcopy

Vobcopy is a simple program (at least simple in usage) that copies the contents of a DVD to your harddrive. This is useful is you want to copy a DVD or create a DIVX of one. Very simply, you mount the DVD rom and then run the program:

[tethys]:[10:45am]:[/home/rnejdl] > mount /cdrom
[tethys]:[10:45am]:[/home/rnejdl] > vobcopy /cdrom
... Lots of stuff here ...

Vobcopy will create a directory that's the name of the DVD you copied into your current working directory.

Mplayer

Although mplayer is most commonly used just for playing media files, it also has the nice ability to take as input a set of vob files (which you obtained above) and to process them into an avi that you could burn into a VCD. Here's what the command line options would look like to do convert the raw .vob files into divx's. This command line is a bit complex so I am writing this doc to remember this stuff for me.

        cat *.vob | mencoder -o mymovie.avi \ 
        -oac mp3lame -lameopts br=192:vbr=2 \
        -ovc lavc -lavcopts vcodec=mpeg4:vhq:keyint=250 -vop pp lb -

If you want to learn more about the specific mencoder flags, you should consult the mencoder man file. For example, if you want to encode in divx 3 instead, you can use vcodec=msmpeg4. Use this if you want to be able to play the video back on older players. Finally try playing back the movie using mplayer, after it's done encoding. You may also, want to try using other video players, such as xine. In order, to test whether or not playback works properly in other players.

What if "I dont have 5.0 gigs of free harddrive space!" you ask. Dont worry all is not lost, you can completely forget about vobcopy and use mplayer to rip and encode directly from the dvd. To do this though, you need to make sure mplayer is compiled with "WITH_DVD=YES", otherwise mplayer wont know how to talk to the dvd player. This farther knocks down the time it takes to rip and encode since no temporary files are created on the harddrive. The only down side of this is you are still limited by the speed of your dvd drive, and you wont have the original mpeg2 files laying around for high quality playback. However, for most people with limited drive space keeping the original mpeg2 files around is impractical anyways.

        mencoder -dvd 1 -oac mp3lame -lameopts br=192:vbr=2 \
        -ovc lavc -lavcopts vcodec=msmpeg4:vhq:keyint=250 \
        -o output.avi -vop pp lb

Audio CD's

I actually have not had to burn an audio CD yet from FreeBSD. To get the contents of an audio CD into an MP3 file, I use with /usr/ports/audio/grip or KAudioCreator. These programs offer nice GUI's, CDDB polling, and automatic playlist automation.

Last Note

My CD burning and ripping were rather slow and painful at times. I found that in FreeBSD, to be safe, they do not enable DMA transfers to ATAPI drives by default. Trust me, you probably want to do this if you have any sort of modern drive. Simply add these lines to /boot/loader.conf:

hw.ata.ata_dma="1"
hw.ata.atapi_dma="1"