> For the complete documentation index, see [llms.txt](https://handbook.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://handbook.bsdcn.org/di-21-zhang-cun-chu/21.5.-chuang-jian-he-shi-yong-cd.md).

# 21.5.创建和使用 CD 光盘

光盘（CD）提供了一些功能，使其与传统磁盘有所不同。它们的设计使得可连续读取，而无需在轨道之间移动磁头产生延迟。虽然 CD 光盘也有轨道，但这些轨道指的是一段连续读取的数据，而不是光盘的物理属性。ISO 9660 文件系统就是为了处理这些差异而设计的。

FreeBSD Ports 提供了多个工具，用于刻录和复制音频和数据 CD。本章展示了多个命令行工具的使用方法。如果需要带有图形界面的光盘刻录软件，可考虑安装软件包或 Ports [sysutils/xcdroast](https://cgit.freebsd.org/ports/tree/sysutils/xcdroast/) 或 [sysutils/k3b](https://cgit.freebsd.org/ports/tree/sysutils/k3b/)。

## 21.5.1. 支持的设备

`GENERIC` 内核提供了对 SCSI、USB 和 ATAPI CD 读取器及刻录机的支持。如果使用定制内核，内核配置文件中需要根据设备类型添加相应的选项。

对于 SCSI 刻录机，确保在配置文件中有以下选项：

```sh
device scbus	# SCSI 总线（ATA/SCSI 必需）
device da	# 直接访问（磁盘）
device pass	# 透传设备（直接 ATA/SCSI 访问）
device cd	# 需要用于 CD 和 DVD 刻录机
```

对于 USB 刻录机，确保在配置文件中有以下选项：

```sh
device scbus	# SCSI 总线（ATA/SCSI 必需）
device da	# 直接访问（磁盘）
device pass	# 透传设备（直接 ATA/SCSI 访问）
device cd	# 需要用于 CD 和 DVD 刻录机
device uhci	# 提供 USB 1.x 支持
device ohci	# 提供 USB 1.x 支持
device ehci	# 提供 USB 2.0 支持
device xhci	# 提供 USB 3.0 支持
device usb	# USB 总线（必需）
device umass	# 磁盘/大容量存储 - 需要 scbus 和 da
```

对于 ATAPI 刻录机，确保在配置文件中有以下选项：

```sh
device ata	# 传统 ATA/SATA 控制器
device scbus	# SCSI 总线（ATA/SCSI 必需）
device pass	# 透传设备（直接 ATA/SCSI 访问）
device cd	# 需要用于 CD 和 DVD 刻录机
```

> **注意**
>
> 在 FreeBSD 10.x 之前的版本中，如果刻录机是 ATAPI 设备，还需要在内核配置文件中添加这一行：`device atapicam`。或者，可通过将以下行添加到 **/boot/loader.conf** 来在引导时加载此驱动程序：`atapicam_load="YES"`。这需要重启系统，因为该驱动程序只能在引导时加载。

要验证 FreeBSD 是否识别了设备，可运行 `dmesg` 并查找设备的条目。在 10.x 之前的系统中，输出的第一行设备名称将是 `acd0` 而不是 `cd0`。

```sh
% dmesg | grep cd
cd0 at ahcich1 bus 0 scbus1 target 0 lun 0
cd0: <HL-DT-ST DVDRAM GU70N LT20> Removable CD-ROM SCSI-0 device
cd0: Serial Number M3OD3S34152
cd0: 150.000MB/s transfers (SATA 1.x, UDMA6, ATAPI 12bytes, PIO 8192bytes)
cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed
```

## 21.5.2. 刻录光盘

在 FreeBSD 中，可使用 `cdrecord` 刻录光盘。这个命令通过安装软件包或 Port [sysutils/cdrtools](https://cgit.freebsd.org/ports/tree/sysutils/cdrtools/) 获得。

尽管 `cdrecord` 有很多选项，但基本用法非常简单。指定要刻录的 ISO 文件的名称，并且如果系统有多个刻录设备，还需要指定要使用的设备名称：

```sh
# cdrecord dev=device imagefile.iso
```

要确定刻录机的设备名称，可使用 `-scanbus`，这会返回类似下面的结果：

```sh
# cdrecord -scanbus
ProDVD-ProBD-Clone 3.00 (amd64-unknown-freebsd10.0) Copyright (C) 1995-2010 Jörg Schilling
Using libscg version 'schily-0.9'
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) *
```

找到 CD 刻录机的条目，并将三个由逗号分隔的数字作为 `dev` 的值。在此示例中，Yamaha 刻录机设备为 `1,5,0`，因此指定该设备时应该使用 `dev=1,5,0`。请参阅 `cdrecord` 的手册页，了解指定该值的其他方法，以及关于写入音频轨道和控制写入速度的更多信息。

另外，可运行以下命令获取刻录机的设备地址：

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

使用 `scbus`、`target` 和 `lun` 的数字值。在此示例中，应使用 `1,0,0` 作为设备名称。

## 21.5.3. 写入数据到 ISO 文件系统

为了制作数据光盘，必须在刻录到光盘之前准备好将成为光盘轨道的数据文件。在 FreeBSD 中，安装软件包或 Port [sysutils/cdrtools](https://cgit.freebsd.org/ports/tree/sysutils/cdrtools/) 后，可使用 `mkisofs` 生成 ISO 9660 文件系统，该文件系统是 UNIX® 文件系统中目录树的镜像。最简单的用法是指定要创建的 ISO 文件的名称以及要放入 ISO 9660 文件系统中的文件路径：

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

该命令将指定路径中的文件名映射到符合标准 ISO 9660 文件系统限制的名称，并排除不符合 ISO 文件系统标准的文件。

有许多选项可克服该标准所施加的限制。特别是，`-R` 启用 UNIX® 系统常用的 Rock Ridge 扩展，`-J` 启用 Microsoft® 系统使用的 Joliet 扩展。

对于仅在 FreeBSD 系统上使用的光盘，可使用 `-U` 禁用所有文件名限制。当与 `-R` 一起使用时，它会生成与指定的 FreeBSD 目录树完全相同的文件系统镜像，即使它违反了 ISO 9660 标准。

最后一个常用选项是 `-b`。此选项用于指定引导镜像的位置，用于制作“El Torito”引导光盘。该选项需要一个参数，即位于要写入光盘的树结构顶部的引导镜像路径。默认情况下，`mkisofs` 在“软盘仿真”模式下创建 ISO 镜像，因此期望引导镜像的大小恰好为 1200、1440 或 2880 KB。某些引导加载程序，如 FreeBSD 分发媒体所使用的引导加载程序，不使用仿真模式。在这种情况下，应使用 `-no-emul-boot`。因此，如果 **/tmp/myboot** 包含可引导的 FreeBSD 系统，并且引导镜像位于 **/tmp/myboot/boot/cdboot**，则此命令将生成 **/tmp/bootable.iso**：

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

生成的 ISO 镜像可通过以下方式作为内存盘挂载：

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

然后可验证 **/mnt** 和 **/tmp/myboot** 是否相同。

`mkisofs` 还有许多其他选项，可进一步调整其行为。请参阅 [mkisofs(8)](https://man.freebsd.org/cgi/man.cgi?query=mkisofs\&sektion=8\&format=html) 获取详细信息。

> **注意**
>
> 可将数据光盘复制为镜像文件，其功能等效于通过 `mkisofs` 创建的镜像文件。为此，可使用 `dd`，将设备名称作为输入文件，将要创建的 ISO 文件名作为输出文件：
>
> ```sh
> # dd if=/dev/cd0 of=file.iso bs=2048
> ```
>
> 生成的镜像文件可像在 [刻录光盘](#id-21.5.2.-ke-lu-guang-pan) 中说明的那样刻录到光盘上。

## 21.5.4. 使用数据光盘

ISO 被刻录到光盘后，就可通过指定文件系统类型、包含光盘的设备名称和现有挂载点来挂载：

```sh
# mount -t cd9660 /dev/cd0 /mnt
```

由于 `mount` 假定文件系统类型为 `ufs`，如果在挂载数据光盘时未包含 `-t cd9660`，则会出现 `Incorrect super block` 错误。

虽然可通过这种方式挂载任何数据光盘，但具有某些 ISO 9660 扩展的光盘可能会表现得不太正常。例如，Joliet 光盘将所有文件名存储为双字节 Unicode 字符。如果某些非英文字符显示为问号，则可使用 `-C` 指定本地字符集。有关更多信息，请参阅 [mount\_cd9660(8)](https://man.freebsd.org/cgi/man.cgi?query=mount_cd9660\&sektion=8\&format=html)。

> **注意**
>
> 为了使用 `-C` 转换字符，内核需要加载 `cd9660_iconv.ko` 模块。可通过将以下行添加到 `loader.conf` 实现：
>
> ```sh
> cd9660_iconv_load="YES"
> ```
>
> 然后重启计算机，或者使用 `kldload` 直接加载模块。

有时，在尝试挂载数据光盘时会显示 `Device not configured`。这通常意味着 CD 驱动器未检测到托盘中的光盘，或者驱动器在总线上不可见。光盘驱动器检测光盘可能需要几秒钟的时间，所以请耐心等待。

有时，SCSI CD 驱动器可能会因为没有足够的时间响应总线重置而被忽略。为了解决这个问题，可创建定制内核，增加默认的 SCSI 延迟。在定制内核配置文件中添加以下选项，并按照 [构建和安装定制内核](/di-10-zhang-pei-zhi-freebsd-nei-he/10.5.-bian-yi-yu-an-zhuang-ding-zhi-nei-he.md) 中的说明重新构建内核：

```sh
options SCSI_DELAY=15000
```

这告诉 SCSI 总线在引导时暂停 15 秒，以便给 CD 驱动器尽可能多的时间来响应总线重置。

> **注意**
>
> 可直接将文件刻录到光盘，而无需创建 ISO 9660 文件系统。这称为刻录原始数据光盘，有些人会为备份目的这样做。这种类型的光盘不能像普通数据光盘那样挂载。为了检索刻录到这样的光盘上的数据，必须从裸设备节点读取数据。例如，以下命令将提取位于第二个 CD 设备上的压缩 tar 文件到当前工作目录：
>
> ```sh
> # tar xzvf /dev/cd1
> ```
>
> 为了挂载数据光盘，数据必须使用 `mkisofs` 写入。

## 21.5.5. 复制音频光盘

要复制音频光盘，需要将音频数据从光盘提取到一系列文件中，然后将这些文件刻录到空白光盘上。

[复制音频光盘](#id-21.5.5.-fu-zhi-yin-pin-guang-pan) 说明了如何复制和刻录音频光盘。如果 FreeBSD 版本低于 10.0，并且设备是 ATAPI，那么必须先加载 `atapicam` 模块，加载方法可参考 [支持的设备](#id-21.5.1.-zhi-chi-de-she-bei)。

**过程：复制音频光盘**

1. 安装软件包或 Port [sysutils/cdrtools](https://cgit.freebsd.org/ports/tree/sysutils/cdrtools/) 后，提供了 `cdda2wav` 命令。此命令可提取所有音频轨道，每个轨道都写入当前工作目录中的单独 WAV 文件：

   ```sh
   % cdda2wav -vall -B -Owav
   ```

   如果系统中只有一个光盘设备，则不需要指定设备名称。请参阅 `cdda2wav` 的手册页，了解如何指定设备及其他可用选项。
2. 使用 `cdrecord` 将 `.wav` 文件刻录到光盘：

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

   请确保根据 [刻录光盘](#id-21.5.2.-ke-lu-guang-pan) 中的说明正确设置 *2,0*。
