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

Contributed by Mike Meyer.

19.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 安装。 除此之外, 在 ATAPI 接口的刻录机上, 也可以配合 ATAPI/CAM 模块 来使用 cdrecord 以及其它为 SCSI 刻录机撰写的工具。

  如果您想使用带图形界面的 CD 刻录软件, 可以考虑一下 X-CD-RoastK3b。 这些工具可以通过使用预编译安装包, 或通过 sysutils/xcdroastsysutils/k3b ports 来安装。 X-CD-RoastK3b 需要 ATAPI/CAM 模块 配合 ATAPI 硬件。

19.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。 这个选项使用一个参数, 用以指定将写入 CD 的目录的根。 默认情况下, mkisofs(8) 会以常说的 “软盘模拟” 方式来创建 ISO, 因此它希望引导映像文件的尺寸恰好是 1200, 1440 或 2880 KB。 某些引导加载器, 例如 FreeBSD 发行版磁盘, 并不使用模拟模式; 这种情况下, 需要使用 -no-emul-boot 选项。 因此, 如果 /tmp/myboot 是一个包含了启动映像文件 /tmp/myboot/boot/cdboot 的可引导的 FreeBSD 系统, 您就可以使用下面的命令生成 ISO 9660 文件系统映像 /tmp/bootable.iso

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

  完成这些工作之后, 如果您的内核中配置了 md, 就可以用下列命令来挂接文件系统了:

# 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) 联机手册得到更多的帮助。

19.6.3 burncd

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

# burncd -f cddevice data imagefile.iso fixate

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

19.6.4 cdrecord

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

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

# cdrecord dev=device imagefile.iso

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

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

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

19.6.5 复制音频 CD

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

SCSI 驱动器

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

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

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

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

ATAPI 驱动器

注意: 借助于 ATAPI/CAM 模块cdda2wav 同样也能在 ATAPI 设备上使用。 此工具比起下面推荐的方法通常是个更好的选择(抖动修正, 字节序问题, 等等)。

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

    请务必确认在 /dev 中出现了对应的文件。 如果您发现有某些项目缺失, 则应强制系统重新识别介质:

    # dd if=/dev/acd0 of=/dev/null count=1
    
  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
    

19.6.6 复制数据 CD

  您可以把数据 CD 复制成一个与之等价的映像文件, 可以使用 mkisofs(8) 创建这种文件, 或使用它来复制任何数据 CD。 这里给出的例子假定您的 CDROM 设备是 acd0, 您应将其替换为您实际使用的 CDROM 设备。

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

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

19.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 CD9660 驱动可以将 Unicode 字符自动转换为内核可以识别的形式。 如果您发现有些非英文字符显示为问号, 就绪要使用 -C 选项来指定字符集了。 欲了解进一步的详情, 请参见联机手册 mount_cd9660(8)

注意: 如果希望通过 -C 选项来进行字符集转换, 则内核会需要加载 cd9660_iconv.ko 模块。 这项工作可以通过在 loader.conf 中加入下列配置:

cd9660_iconv_load="YES"

并重新启动计算机来完成, 除此之外, 也可以通过 kldload(8) 来手动加载。

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

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

options SCSI_DELAY=15000

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

19.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)

19.6.9 使用 ATAPI/CAM 驱动

Contributed by Marc Fonvieille.

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

  要使用这个驱动, 您需要把下面这行添加到 /boot/loader.conf 文件中:

atapicam_load="YES"

  接下来, 重新启动计算机。

注意: 如果您希望将 atapicam(4) 以静态联编的形式加入内核, 则需要在内核配置文件中加入这行:

device atapicam

此外还需要在内核配置文件中加入:

device ata
device scbus
device cd
device pass

这些应该已经有了。 然后, 重新联编并安装新内核, 并重新启动计算机。

  在引导过程中, 您的刻录机将会出现在内核的提示信息中, 就像这样:

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) 手册 页。

本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.