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 硬件。
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) 联机手册得到更多的帮助。
如果用的是 ATAPI 的 CD 刻录机,可以使用 burncd 命令来刻录您的 CD ISO 映像文件。 burncd 命令是基本 系统的一部分,中以使用 /usr/sbin/burncd 来安装。 用法如下:
# burncd -f cddevice data imagefile.iso fixate
在 cddevice 上刻录一份 imagefile.iso 的副本。 默认的设备是 /dev/acd0。 请参考 burncd(8) 以了解设置写入速度的参数,如何在刻录完成之后自动弹出CD,以及刻录音频数据。
如果没有一个 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)
的介绍了解有关音轨,控制速度和其他的东西。
您可以这样复制 CD,把 CD 上面的音频数据解压缩出一系列的文件, 再把这些文件写到一张空白 CD 上。 这个过程对于 ATAPI 和 SCSI 驱动器来说有些微的不同。
SCSI 驱动器
使用 cdda2wav 来解压缩音频。
% cdda2wav -vall -D2,0 -B -Owav
使用 cdrecord 来写 .wav 文件。
% cdrecord -v dev=2,0 -dao -useinfo *.wav
确保 2,0 被适当地设置了, 具体方法在 第 19.6.4 节 中有所描述。
ATAPI 驱动器
注意: 借助于 ATAPI/CAM 模块, cdda2wav 同样也能在 ATAPI 设备上使用。 此工具比起下面推荐的方法通常是个更好的选择(抖动修正, 字节序问题, 等等)。
ATAPI CD 驱动用 /dev/acddtnn表示每个轨道, 这里 d 是驱动器号, nn 是轨道号,由两位小数位组成,省略前缀零。 所以第一个盘片上的第一个轨道就是 /dev/acd0t01,第二个就是 /dev/acd0t02,第三个就是 /dev/acd0t03,等等。
请务必确认在 /dev 中出现了对应的文件。 如果您发现有某些项目缺失, 则应强制系统重新识别介质:
# dd if=/dev/acd0 of=/dev/null count=1
使用 dd(1) 解压缩每个轨道。当解压缩文件的时候您也必须使用 一个特殊的块大小。
# dd if=/dev/acd0t01 of=track1.cdr bs=2352 # dd if=/dev/acd0t02 of=track2.cdr bs=2352 ...
使用 burncd 把解压缩的文件刻录到光盘上。您必须指定 这些文件是音频文件,这样 burncd 会在刻录完成时 结束光盘。
# burncd -f /dev/acd0 audio track1.cdr track2.cdr ... fixate
您可以把数据 CD 复制成一个与之等价的映像文件, 可以使用 mkisofs(8) 创建这种文件, 或使用它来复制任何数据 CD。 这里给出的例子假定您的 CDROM 设备是 acd0, 您应将其替换为您实际使用的 CDROM 设备。
# dd if=/dev/acd0 of=file.iso bs=2048
现在您有一个映像文件了,您可以像上面描述的那样把它刻录成 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 信号。
您可以选择把一个文件目录刻录到 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)。
这个驱动允许 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>.