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 驱动器来说有些微的不同。
使用 cdda2wav
来解压缩音频。
%
cdda2wav -vall -D2,0 -B -Owav
使用 cdrecord
来写
.wav
文件。
%
cdrecord -v dev=2,0 -dao -useinfo *.wav
确保 2,0
被适当地设置了,
具体方法在 第 19.6.4 节 “cdrecord” 中有所描述。
借助于 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有问题,请先阅读
文档,如不能解决再联系
<[email protected]>.
关于本文档的问题请发信联系
<[email protected]>.