FreeBSD 使用手册
上一页 | 第18章 　存储 | 下一页

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

Contributed by Mike Meyer.

## 18.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-Roast 或 K3b。 这些工具可以通过使用预编译安装包， 或通过 `sysutils/xcdroast` 和 `sysutils/k3b` ports 来安装。 X-CD-Roast 和 K3b 需要 ATAPI/CAM 模块 配合 ATAPI 硬件。

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

## 18.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，以及刻录音频数据。

## 18.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) 的介绍了解有关音轨，控制速度和其他的东西。

## 18.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` 被适当地设置了， 具体方法在 第 18.6.4 节 中有所描述。

ATAPI 驱动器

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

1. ATAPI CD 驱动用 `/dev/acd`d`t`nn``表示每个轨道， 这里 `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

## 18.6.6 复制数据 CD

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

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

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

## 18.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 信号。

## 18.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)。

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

上一页 | 起始页 | 下一页
USB 存储设备 | 上一级 | 创建和使用光学介质(DVD)

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

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