20.5.创建和使用 CD ================== 紧凑型光盘(Compact Disc,CD)提供了一些有别于传统磁盘的特点。它们被设计成可以连续读取,而无需等待在轨道之间移动磁头的延迟。虽然 CD 确实有轨道,但这是指要连续读取的数据部分,而不是磁盘的物理属性。ISO 9660 文件系统就是为了处理这些差异而设计的。 FreeBSD ports 中提供了几个用于刻录和复制音频和数据 CD 的工具。这一章演示了几个命令行工具的使用。对于带有图形化的 CD 刻录软件,可以考虑通过软件包或 ports 安装 `sysutils/xcdroast `__ 或 `sysutils/k3b `__\ 。 20.5.1.支持的设备 ----------------- **GENERIC** 内核提供了对 SCSI,USB 和 ATAPICD 读卡器和刻录机的支持。如果使用定制内核,需要在内核配置文件中出现的选项因设备的类型而异。 对于 SCSI 刻录机,确保这些选项是存在的: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session device scbus # SCSI bus (required for ATA/SCSI) device da # Direct Access (disks) device pass # Passthrough device (direct ATA/SCSI access) device cd # needed for CD and DVD burners 对于 USB 刻录机,确保这些选项是存在的: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session device scbus # SCSI bus (required for ATA/SCSI) device da # Direct Access (disks) device pass # Passthrough device (direct ATA/SCSI access) device cd # needed for CD and DVD burners device uhci # provides USB 1.x support device ohci # provides USB 1.x support device ehci # provides USB 2.0 support device xhci # provides USB 3.0 support device usb # USB Bus (required) device umass # Disks/Mass storage - Requires scbus and da 对于 ATAPI 刻录机,要确保这些选项是存在的: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session device ata # Legacy ATA/SATA controllers device scbus # SCSI bus (required for ATA/SCSI) device pass # Passthrough device (direct ATA/SCSI access) device cd # needed for CD and DVD burners .. **注意** 在 10.x 之前的 FreeBSD 版本中,如果刻录机是 ATAPI 设备,在内核配置文件中还需要这一行: .. code:: shell-session device atapicam 另外,通过在 **/boot/loader.conf** 中添加以下一行,可以在启动时加载该驱动: .. code:: shell-session atapicam_load="YES" 需要重新启动系统,因为这个驱动程序只能在启动时被加载。 为了验证 FreeBSD 是否识别该设备,执行 ``dmesg`` 并查找该设备的条目。在 10.x 之前的系统中,输出的第一行中的设备名称将是 **acd0** 而非 **cd0**\ 。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % dmesg | grep cd cd0 at ahcich1 bus 0 scbus1 target 0 lun 0 cd0: 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 20.5.2.刻录 CD -------------- 在 FreeBSD 中,可以用 ``cdrecord`` 来刻录 CD。这个命令通过软件包或 port `sysutils/cdrtools `__ 来安装。 虽然 ``cdrecord`` 有许多选项,但基本用法很简单。指定要刻录的 ISO 文件的名称,如果系统有多个刻录机设备,则指定要使用的设备的名称: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # cdrecord dev=device imagefile.iso 为了确定刻录机的设备名称,使用 ``-scanbus``\ ,可能的输出如下: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # 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`` 的手册页,了解指定该值的其他方法,以及关于写入音轨和控制写入速度的信息。 另外,还可以执行下面的命令来获得刻录机的设备地址: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # camcontrol devlist at scbus1 target 0 lun 0 (cd0,pass0) 使用 ``scbus``\ 、 ``target`` 和 ``lun`` 的数字值。在这个例子中,\ ``1,0,0`` 是要使用的设备名。 20.5.3.将数据写入 ISO 文件系统 ------------------------------ 为了制作数据 CD,在刻录到 CD 上之前必须准备好构成 CD 轨道的数据文件。在 FreeBSD 中,\ `sysutils/cdrtools `__ 安装了 ``mkisofs``\ ,可以用它来制作一个 ISO 9660 文件系统,它是 UNIX® 文件系统中目录的镜像。最简单的用法是指定要创建的 ISO 文件的名称和要放入 ISO 9660 文件系统的文件的路径: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # mkisofs -o imagefile.iso /path/to/tree 该命令将指定路径中的文件名映射为符合标准 ISO 9660 文件系统要求的名称,并将排除那些不符合 ISO 文件系统标准的文件。 有许多选项可以克服该标准所施加的限制。特别是,\ ``-R`` 将启用 UNIX® 系统常用的 Rock Ridge 扩展,\ ``-J`` 将启用 Microsoft® 系统使用的 Joliet 扩展。 对于只在 FreeBSD 系统上使用的 CD ,可以用 ``-U`` 来禁用所有的文件名限制。当与 ``-R`` 一起使用时,它产生的文件系统镜像与指定的 FreeBSD 目录相同,即使它违反了 ISO 9660 标准。 最后一个常用选项是 ``-b``\ 。它被用来指定用于生产“El Torito”可引导 CD 的引导镜像的位置。这个选项需要一个参数,即被写入 CD 根目录的引导镜像的路径。默认情况下,\ ``mkisofs`` 在“软盘仿真”模式下创建 ISO 镜像,因此它希望引导镜像的大小正好是 1200、1440 或 2880 KB。一些像 FreeBSD 发行镜像使用的那种引导加载器,不使用仿真模式。在这种情况下,应该使用 ``-no-emul-boot``\ 。因此,如果 ``/tmp/myboot`` 包含一个可引导的 FreeBSD 系统,其启动镜像在 **/tmp/myboot/boot/cdboot** 中,这个命令将生成 **/tmp/bootable.iso**\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot 由此产生的 ISO 镜像可以作为闪存设备被挂载: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # mdconfig -a -t vnode -f /tmp/bootable.iso -u 0 # mount -t cd9660 /dev/md0 /mnt 然后我们可以验证 **/mnt** 和 **/tmp/myboot** 是相同的。 ``mkisofs`` 还有许多其他选项可以用来微调其行为。详情请参考 `mkisofs(8) `__\ 。 **注意** 可以将数据 CD 复制到一个镜像文件中,该文件在功能上与用 ``mkisofs`` 创建的镜像文件相当。要做到这一点,使用 **dd** ,将设备名称作为输入文件,将要创建的 ISO 的名称作为输出文件: .. code:: shell-session # dd if=/dev/cd0 of=file.iso bs=2048 产生的镜像文件可以按照\ `刻录 CD `__ 中的说明刻录到 CD 上。 20.5.4.使用数据 CD ------------------ ISO 被刻录到 CD 上以后,就可以通过指定文件系统类型、包含 CD 的设备名称和一个现有的挂载点来挂载它: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # mount -t cd9660 /dev/cd0 /mnt 由于挂载时假定文件系统是 ``ufs`` 类型的,如果在挂载数据 CD 时不附带 ``-t cd9660``\ ,将产生错误 ``Incorrect super block``\ 。 虽然任何数据 CD 都可以这样挂载,但具有某些 ISO 9660 扩展名的磁盘可能表现得很奇怪。例如,Joliet 磁盘以两字节的 Unicode 字符存储所有文件名。如果一些非英语字符显示为问号,请用 ``-C`` 指定本地字符集。更多信息,请参考\ `mount_cd9660(8) `__\ 。 **注意** 为了使用 ``-C`` 进行这种字符转换,内核需要加载 **cd9660_iconv.ko** 模块。这可以通过在 **loader.conf** 中加入这一行来完成: .. code:: shell-session cd9660_iconv_load="YES" 然后重启机器,或者直接用 ``kldload`` 加载模块。 当试图挂载数据 CD 时,偶尔会显示 ``Device not configured``\ 。这通常意味着 CD 驱动器没有检测到托盘中的磁盘,或者驱动器在总线上不可见。光驱检测光盘可能需要几秒钟的时间,所以要有耐心。 有时,SCSI CD 驱动器可能会被遗漏,因为它没有足够的时间来应答总线复位。为了解决这个问题,可以创建一个定制内核,增加默认的 SCSI 延迟。在定制的内核配置文件中增加以下选项,并按照\ `“编译与安装定制内核” `__\ 的说明重建内核: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session options SCSI_DELAY=15000 这让 SCSI 总线在启动过程中暂停 15 秒,以便给 CD 驱动器一切可能的机会来应答总线复位。 **注意** 可以直接将文件刻录到 CD,而不创建 ISO 9660 文件系统。这就是所谓的刻录原始数据 CD,有些人为了备份会这样做。 这种类型的磁盘不能像普通的数据 CD 一样被挂载。为了检索刻录到这种 CD 上的数据,必须从原始设备节点上读取数据。例如,这个命令将把位于第二个 CD 设备上的压缩 tar 文件提取到当前工作目录中: .. code:: shell-session # tar xzvf /dev/cd1 为了挂载数据 CD,必须使用 ``mkisofs`` 写入数据。 20.5.5.复制音频 CD ------------------ 要复制一张音频 CD,把 CD 上的音频数据提取成一系列的文件,然后把这些文件写入一张空白 CD。 本节说明了如何复制和刻录一张音频 CD。如果 FreeBSD 的版本低于 10.0,并且设备是 ATAPI 总线,必须首先加载 ``atapicam`` 模块。 复制一张音频 CD 的过程 1. 软件包或 port `sysutils/cdrtools `__ 安装了 ``cdda2wav``\ 。这个命令可以用来提取所有的音轨,每个音轨都写在当前工作目录下的一个单独的 WAV 文件中: .. code:: shell-session % cdda2wav -vall -B -Owav 如果系统上只有一个 CD 设备,则不需要指定设备名。参考 ``cdda2wav`` 手册中关于如何指定一个设备的说明,并了解更多关于这个命令的其他选项。 1. 用 ``cdrecord`` 来写入 **.wav** 文件。 .. code:: shell-session % cdrecord -v dev=2,0 -dao -useinfo *.wav 确保如\ `刻录 CD `__ 所述正确地设置了 ``2,0``\ 。