16.6. 创建和使用光学介质(CD)

Contributed by Mike Meyer.

16.6.1. 介绍

CD 与普通的磁盘相比有很多不同的特性。最初它们是不能被用户写入的。 由于没有磁头和磁道移动时的延迟,所以它们可以连续的进行读取。 方便的在两个系统之间进行数据的传输,比起相同大小的存储介质来说。

CD 有磁道,这关系到数据读取时的连续性而不是物理磁盘的性能。 要在 FreeBSD 中制作一个 CD,您要准备好要写到 CD 上的数据文件, 然后根据每个 tracks 写入到 CD。

ISO 9660 文件系统被设计用来处理这些差异。它通常不会对文件系统作限制。 幸运的是,它提供了一个可扩展机制允许在制作 CD 时越越这些限制, 而同时在不支持这些扩展的系统上仍旧能够进行工作。

sysutils/ port 包括了 mkisofs(8), 这是一个可以用来生成包含 ISO 9660 文件系统的数据文件的程序。 他也提供了对于一些扩展的支持选项,下面将详细介绍。

使用哪个工具来刻录 CD 依赖于 CD 刻录机是 ATAPI 还是其它类型的。ATAPI CD 刻录器使用 burncd 程序,可以在基本系统中找到。SCSI 和 USB CD 刻录机使用 cdrecord 程序,可以 在 sysutils/cdrtools port中找到。

burncd 程序受到一系列支持设备的限制。如果想知道 设备是否被支持,可以查看 支持的 CD-R/RW 驱动器 列表。

Note: 如果您运行的是 FreeBSD 5.X、FreeBSD 4.8-RELEASE 或更高版本, 它将可能使用 cdrecord 和其它工作在一个 ATAPI 硬件 ATAPI/CAM module 为 SCSI 设备。

如果您想使用一个图形界面的 CD 刻录软件, 您可以参考一下 X-CD-RoastK3b。这些工具作为安装包可以从 sysutils/xcdroastsysutils/k3b ports 得到。 X-CD-RoastK3b 需要 ATAPI/CAM module 和 ATAPI 硬件。

16.6.2. mkisofs

mkisofs(8) 程序作为 sysutils/cdrtools port 的一部分, 将生成 ISO 9660 文件系统,其中包含 UNIX® 命名空间中的文件名。 最简单的用法是:

# mkisofs -o imagefile.iso /path/to/tree

这个命令将创建一个包含 ISO9660 文件系统的 imagefile.iso 文件,它是目录树 /path/to/tree 的一个拷贝。在处理过程中, 它将文件名称映射为标准的 ISO9660 文件系统的文件名,将排除那些不典型的 ISO 文件系统的 文件。

有很多选项能够用来克服那些限制。特别的,-R 选项能够启用 Rock Ridge 扩展一般的 UNIX 系统,-J 选项能启用用于 Microsoft 系统的 Joliet 扩展,-hfs 选项能用来创建用于 Mac OS® 系统的 HFS 文件系统。

对于那些即将要在 FreeBSD 系统中使用 CD 的人来说,-U 选项能用来消除所有文件名的限制。当使用 -R 选项时,它会产生一个 文件系统映像,它与您从那儿启动 FreeBSD 树是一样的,虽然它在许多方面也违反了 ISO 9660 的标准。

最后一个常用的选项是 -b。这可以用来指定启动映像的位置, 以产生一个 “El Torito” 的启动光盘。 这个选项有一个参数,这个 参数是指向已被写入到 CD 的目录树顶部的启动映像的路径。所以, /tmp/myboot/tmp/myboot/boot/cdboot 中保存了一个可启动的 FreeBSD 系统,您应当像下面这样在 /tmp/bootable.iso 中生成一个 ISO9660 文件系统的映像:

# mkisofs -U -R -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot

如果内核中已经配置了 vn (FreeBSD 4.X), 或 md (FreeBSD 5.X),就可以挂上文件系统:

# vnconfig -e vn0c /tmp/bootable.iso
# mount -t cd9660 /dev/vn0c /mnt

在 FreeBSD 4.X, 和 FreeBSD 5.X 中:

# mdconfig -a -t vnode -f /tmp/bootable.iso -u 0
# mount -t cd9660 /dev/md0 /mnt

可以发现 /mnt/tmp/myboot 是一样的。

还可以使用 mkisofs(8) 的其它选项来调整它的行为。特别是修改 ISO 9660 的划分格式,创建 Joliet 和 HFS 格式的磁盘。查看 mkisofs(8) 手册页得到更多的帮助。

16.6.3. burncd

如果用的是 ATAPE 的 CD 刻录机,可以使用 burncd  命令来记录您的 CD ISO 映像文件。 burncd 命令是基本  系统的一部分,中以使用 /usr/sbin/burncd 来安装。  用法如下:

# burncd -f cddevice data imagefile.iso fixate

cddevice 上刻录一份 imagefile.iso 的副本。 默认的设备是 /dev/acd0 (在 FreeBSD 4.X 下则是 /dev/acd0c)。 请参考 burncd(8) 以了解设置写入速度的参数,如何在刻录完成之后自动弹出CD,以及刻录音频数据。

16.6.4. cdrecord

如果没有一个 ATAPI CD 刻录机,必须使用 cdrecord 来刻录您的 CD 。 cdrecord 不是基本系统的一部分;必须 从 sysutils/cdrtools 或适当的 package 安装它。基本系统的变化可能会引起这个程序的错误。可能是由 “coaster” 引起的。当升级系统时,同时需要升级 port ,或者 如果已升级到 tracking -STABLE ,那么使用 新版本时也要升级 port。

cdrecord 有许多选项,基本用法与 burncd 相似。刻录一个 ISO 9660 映像文件只需这样做:

# cdrecord dev=device imagefile.iso

使用 cdrecord 的比较巧妙的方法是找到使用的 dev 。要找到正确的设置,可以使用 cdrecord-scanbus 标记,这会产生这样的结果:

# 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) *

这个列表列出了设备的的适当的 dev 值。找到您的 CD burner ,使用三个用逗号分隔的数值来表示 dev.在 这个例子中,CRW 是 dev=1,5,0,所以正确的输入应是 dev=1,5,0 。有一个很容易的方法可以指定这个值;看看 cdrecord(1) 的介绍了解有关音轨,控制速度和其他的东西。

16.6.5. 复制音频 CD

您可以这样复制 CD,把 CD 上面的音频数据解压缩出一系列的文件, 再把这些文件写到一张空白 CD 上。 这个过程对于 ATAPI 和 SCSI 驱动器来说有些微的不同。

SCSI 驱动器

  1. 使用 cdda2wav 来解压缩音频。

    % cdda2wav -v255 -D2,0 -B -Owav
    
  2. 使用 cdrecord 来写 .wav 文件。

    % cdrecord -v dev=2,0 -dao -useinfo  *.wav
    

    确保 2,0 被适当地设置了, 具体方法在 Section 16.6.4 中有所描述。

ATAPI 驱动器

  1. ATAPI CD 驱动用 /dev/acddtnn表示每个轨道, 这里 d 是驱动器号, nn 是轨道号,由两位小数位组成,省略前缀零。 所以第一个盘片上的第一个轨道就是 /dev/acd0t01,第二个就是 /dev/acd0t02,第三个就是 /dev/acd0t03,等等。

    确保在 /dev 中存在合适的文件。

    # cd /dev
    # sh MAKEDEV acd0t99
    

    Note: 在 FreeBSD 5.0 中,devfs(5) 会为您自动创建 并管理 /dev 中的节点, 所以不再需要使用 MAKEDEV

  2. 使用 dd(1) 解压缩每个轨道。当解压缩文件的时候您也必须使用 一个特殊的块大小。

    # dd if=/dev/acd0t01 of=track1.cdr bs=2352
    # dd if=/dev/acd0t02 of=track2.cdr bs=2352
    ...
    
  3. 使用 burncd 把解压缩的文件刻录到光盘上。您必须指定 这些文件是音频文件,这样 burncd 会在刻录完成时 结束光盘。

    # burncd -f /dev/acd0 audio track1.cdr track2.cdr ... fixate
    

16.6.6. 复制数据 CD

您可以把数据 CD 复制成一个与之等价的镜像文件, 镜像文件可以使用 mkisofs(8) 创建,您可以使用这个工具复制 任何数据 CD。这里给出的例子假定您的 CDROM 设备 acd0。代替您 正确的 CDROM 设备。在 FreeBSD 4.X 下面,字符 c 必须被附加到 设备名的结尾处来指明是整个分区, 或者对于 CDROM,指明是整个光盘。

# dd if=/dev/acd0 of=file.iso bs=2048

现在您有一个镜像文件了,您可以像上面描述的那样把它刻录成 CD。

16.6.7. 使用数据 CD

现在您已经创建了一张标准的数据 CDROM,您或许想要 挂载来读取上面的设备。 默认情况下,mount(8) 假定文件系统是 ufs 类型的。如果您尝试下面的命令:

# mount /dev/cd0 /mnt

您会得到一条 ``Incorrect super block'' 的错误信息,没有挂载成功。CDROM 不是 UFS 文件系统,所以试图这样挂载它是 是不行的。您需要告诉 mount(8) 文件系统是 ISO9660 类型的,这样 就可以了。只需要指定 mount(8)-t cd9660 选项。例如, 如果您想要挂载 CDROM 设备, /dev/cd0/mnt 目录,您需要执行:

# mount -t cd9660 /dev/cd0 /mnt

注意您的设备名 (在这个例子中是 /dev/cd0)可能 有所不同,取决于您的 CDROM 使用的接口。另外, -t cd9660 选项等同于执行 mount_cd9660(8)。上面的例子可以缩短 为:

# mount_cd9660 /dev/cd0 /mnt

用这种方法您基本可以使用任何买到的数据 CDROM。 然而某些有 ISO 9660 扩展的光盘可能会行为古怪。 例如,joliet 光盘用两个字节的 unicode 字符存储所有的文件名。 FreeBSD 内核还不能识别 unicode (重要!),所以非英语字符被做了有问题的标记。 (如果您正在运行 FreeBSD 4.3 或者以后的版本, CD9660 驱动包含了加载合适的 unicode 换算表的方法。 一些常用编码的模块可以通过 sysutils/cd9660_unicode port 来安装。)

有时候,当您试图挂载 CDROM 的时候,会得到一条 ``Device not configured'' 的错误信息。这通常 表明 CDROM 驱动认为托盘里没有光盘, 或者驱动器在总线上不可见。 需要几秒钟时间等待 CDROM 驱动器辨别已经接到反馈的信息, 请耐心等待。

有时候,SCSI CDROM 可能会找不到,因为没有足够的 时间来应答总线的 reset 信号。如果您有一个 SCSI CDROM 请将下面的选项添加到您的内核 配置文件并重建您的内核

options SCSI_DELAY=15000

这个告诉您的 SCSI 总线启动时暂停 15 秒钟, 给您的 CDROM 驱动器足够的机会来应答 总线 reset 信号。

16.6.8. 刻录原始数据 CD

您可以选择把一个文件目录刻录到 CD 上而不用 创建 ISO 9660 文件系统。有些人这么做是为了备份的 目的。这个运行的比刻录一个标准 CD 速度要快的多:

# burncd -f /dev/acd1 -s 12 data archive.tar.gz fixate

要重新找回这样刻录到 CD 上的数据, 您必须从原始设备节点读取数据:

# tar xzvf /dev/acd1

您不能像挂载一个通常的 CDROM 一样挂载这张光盘。 这样的 CDROM 也不能在除了 FreeBSD 之外的任何操作系统上读出。 如果您想要可以挂载 CD,或者 和另一种操作系统共享数据,您必须像上面描述的那样使用 mkisofs(8)

16.6.9. 使用 ATAPI/CAM 驱动

Contributed by Marc Fonvieille.

这个驱动允许 ATAPI 设备(CD-ROM, CD-RW, DVD 驱动器等...)通过 SCSI 子系统访问, 这样允许使用像 sysutils/cdrdao 或者 cdrecord(1) 这样的程序。

要使用这个驱动,您需要把下面几行 添加到您的内核配置文件中:

device atapicam
device scbus
device cd
device pass

您也需要在您的内核配置文件有 下面几行:

device ata

这个应该已经有了。

然后重建,安装您的新内核,重新启动机器。 在启动过程中,您的刻录机会被识别, 就像这样:

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

驱动器现在可以通过 /dev/cd0 设备名访问了,例如要 挂载 CD-ROM 到 /mnt,只需要键入下面的 命令:

# mount -t cd9660 /dev/cd0 /mnt

作为 root,您可以运行下面的 命令来得到刻录机的 SCSI 地址:

# camcontrol devlist
<MATSHITA CDRW/DVD UJDA740 1.00>   at scbus1 target 0 lun 0 (pass0,cd0)

这样 1,0,0 就是 SCSI 地址了,可以被 cdrecord(1) 和其他的 SCSI 程序使用。

有关 ATAPI/CAM 和 SCSI 系统的更多信息, 可以参阅 atapicam(4)cam(4) 手册 页。