TITLE:		CD-RW UDF (Packet-CD) filesystem
LFS VERSION:	3.3 and beyond
AUTHOR:		Richard Downing <richard.downing@bcs.org.uk>

SYNOPSIS:
	How to set up LFS to be able to Mount CD-RW drives READ-WRITE.

HINT:

**** WARNING ****
This hint is obsolete and stored here only for archival purposes.
Following this hint may damage your hardware in some cases.
This hint is superseded by the instructions in the BLFS book.

Background.
-----------
Recent 2.4.x kernels, as used in LFS from Version 3.3, support the UDF
filesystem for read only access.  The UDF filesystem is a standard used for
CD-RW drives (and CD-R and DVD-RAM etc.)  To find out more about the UDF
filesystem you should check out the Standards Body's websites at
http://www.osta.org and http://www.ecma.org - I shan't elaborate further here.

The problem is that WRITE access isn't supported, so if you have a CD-RW drive
you can't use Linux to write to it with a UDF filesystem, all you can do is
write Disk-at-a-time or Track-at-a-time with CDrecord and friends (see the BLFS
book for how-to on that).

If, on the other hand, you were using, God forbid, Microsoft Windows (TM), then
you could 'buy' Adaptec CDDirect, or HP DLA to give you Drive-Letter-Access
to the drive, just as if it were a (rather slow) fixed disk.  These utilities 
are often bundled with the drives, which doesn't help if you want to use Linux!

But, fear not, for the courageous help is at hand in the form of a Kernel Patch
to provide Packet-CD access.  This, combined with some simple tools, allows you
to provide a full read-write capability as a mounted UDF filestore.  Hopefully, 
this facility will be incorporated in 2.6 kernels when they arrive.

This hint is how I did it, and only applies to CD-RW drives, I understand that 
the same approach can be used by those lucky enough to be able to afford DVD-RAM
drives!  The following websites were my primary sources of information, so start
there:

for the kernel patches:   http://w1.894.telia.com/~u89404340/patches/packet/
for the usenet archive:   http://lists.suse.com/archive/packet-writing/
for the UDF tools:        http://sourceforge.net/projects/linux-udf

Obtain the right patch and apply it to your Kernel.
---------------------------------------------------

>From the kernel patch site above download the patch for the version of the
kernel you are using. If you are using  2.4.20, get the packet-2.4.20.patch.  If 
you are using linux 2.4.19, then get patch-2.4.19-2.patch.Check that the patch 
you get is the latest dated for your kernel, they seem tobe updated quite often 
(see the Usenet Archives for why, when etc..)

If you are using a '-pre' or '-ac' kernel you may have to try the nearest patch 
and then apply any missed chunks manually.  This has been known to work, but you 
are on your own.  You will know if this applies to you.

Become superuser and move to your linux source directory, then 
apply the patch with:

    patch -Np1 -i packet-2.4.20.patch

Now run 'make xconfig', or whatever version of kernel config you use (the LFS 
book uses  'make menuconfig', which is fine)

Go to the section on 'Block Devices' and select:
    Packet writing on CD/DVD media

If you are into modules you can do it that way as I now do.

Now go to the section on 'File systems' and select the following:
    UDF files systems support (read only)
    UDF write support (DANGEROUS)

Despite the note on this latter option saying it only applies to fixed disks and
DVD-RAM, the patch will make it work with CD-RW too!

Select 'Save and Exit', then build your new kernel exactly as in the LFS book
with:

    make bzImage

then copy the resulting kernel to /boot as, say, vmlinuz-2.4.19-UDF.

If you are using modules, you now need to

   make modules
   make modules_install
   
The packet writing module is called pktcdvd.o.

I use GRUB as a bootloader, so you will need to read the book and hints on lilo
if you use that, but set up your boot loader to be able to boot either your old
kernel or this new one. (Always keep the old kernel bootable, just in case...)

Now reboot with the new kernel, it should be almost identical to your old one.

Note: I think that if you built the packet driver as a module, you need to add:
    alias block-major-97 pktcdvd
to your /etc/modules.conf file.

Make the Packet Driver device file.
-----------------------------------

As superuser, make the file(s) in /dev with:

  mknod /dev/pktcdvd0 b 97 0
  mknod /dev/pktcdvd1 b 97 1
  etc...

If you want ordinary users to be able to use CD-RW too, then:
  chmod 666 /dev/pktcdvd*
  
Obtain and Unpack the UDFtools package.
---------------------------------------

Download the latest package from: http://sourceforge.net/projects/linux-udf,
the version I used was 1.0.0b2.

Unpack this is the usual way and build it with:

./configure --prefix=/usr &&
make &&
make install

You now have three new programs in /usr/bin, complete with man pages which I 
suggest you read about now.:

   cdrwtool - a tool to do various jobs on your CD-RW drive and disks.
   mkudffs  - to create an UDF filesystem (on your hard disk if you want)
   pktsetup - a tool to setup and tear down packet drive associations.
   
Using the tools.
----------------

Lets suppose you have a CD-RW disk straight out of the box, and want to prepare
it for use.  Like me, your CD-RW drive is on /dev/scd0.

    cdrwtool -d /dev/scd0 -q

will format the new disk.  (By the way, unlike CDRecord, UDFtools don't need
ide-atapi devices to be made fake scsi devices)

    pktsetup /dev/pktcdvd0 /dev/scd0

associates a packet-driver with your CD-RW drive (this doesn't survive a 
reboot).
    mount /dev/pktcdvd0 /mnt/cdrom -t udf -o rw,noatime

will mount your new disk as a read-write filesystem, all ready to use, just like
any other hard disk.  ('noatime' just speeds things up by not updating the 
access times, CD-RW can be a little slow)

Then you can 'umount /dev/pktcdvd0' in the usual way, when you're done.

Tighter Integration.
----------------------

I have gone a little further and added the following bootscripts to my 
system, so that the packet writing elements are set up every time I boot :

cat /etc/rc.d/init.d/packetwrite << "EOF"
#!/bin/bash
# Begin $rc_base/init.d/packetwrite

# Based on sysklogd script from LFS-3.1 and earlier.
# Rewritten by the blessed Gerard Beekmans
# gerard@linuxfromscratch.org
#
# Trivial usage for packet writing added by
# Richard Downing - richard.downing@bcs.org.uk

source /etc/sysconfig/rc
source $rc_functions

case "$1" in
	start)
		echo "Prepare CDRW drive for Packet Writing..."
		pktsetup /dev/pktcdvd0 /dev/scd0
		evaluate_retval
		;;

	stop)
		echo "Tearing down CDRW for Packet Writing..."
		pktsetup -d /dev/pktcdvd0
		evaluate_retval
		;;

	*)
		echo "Usage: $0 {start|stop}"
		exit 1
		;;
esac

# End $rc_base/init.d/packetwrite
EOF

chmod +x /etc/rc.d/init.d/packetwrite
cd /etc/rc.d/rc3.d
ln -s ../init.d/packetwrite S85packetwrite
cd ../rc0.d
ln -s ../init.d/packetwrite K10packetwrite

I then create a mount point:

mkdir /mnt/cdrw

and add the following line to /etc/fstab:

/dev/pktcdvd0 /mnt/cdrw udf rw,noauto,noatime,user 0 0

which allows any user to mount the CDRW with:

mount /mnt/cdrw

NOTE the noauto switch is needed as the packerwriter may not be initialised
when mountfs runs during boot.

End of Hint.
---------------

That's all I did, and it works for me.  I'd appreciate any feedback you have 
about this hint.  Good luck.
Richard.Downing@bcs.org.uk





