下一页 上一页 目录

3. 刻录 CD-R

“如果你化为烟雾,我也不会停止在你燃烧时拉提琴。” (罗马皇帝尼禄在公元 64 年谈论刻录他自己的经典 CD 时所说。他完全误解了这句话,并烧毁了罗马。)

在 Linux 下刻录 CD-ROM 包括两个步骤

本章更详细地描述了数据和音频 CD 的步骤。

3.1 刻录 CD-ROM(纯数据)

请注意,收集要放入 CD 的数据通常比预期的要花费更长的时间。请考虑到一旦 CD 被刻录和最终化,就无法添加丢失的文件。CD-RW 也是如此,目前 CD-RW 只能作为一个整体进行重写。使用多会话功能对于单个文件来说不是一个选项,因为它会为新的完整目录表 (TOC) 消耗大量空间。UDF 尚未为 Linux 准备就绪。

另请记住,CD 的一定量可用空间用于存储 ISO-9660 文件系统的信息(通常为几 MB)。620 MB 的数据始终可以放入 650 MB 的 CD-R 中。

创建稍后 CD-ROM 的镜像

在使用任何存储介质(例如软盘、硬盘或 CD)之前,它必须获得一个文件系统(DOS 术语:格式化)。文件系统负责组织和整合应存储在介质上的文件。

用于在硬盘分区上创建文件系统的常用实用程序会在其上写入一个空文件系统,然后由用户根据需要挂载并填充文件。可写 CD 只能写入一次,因此如果我们向其写入一个空文件系统,它将被格式化并永远保持完全为空。可重写介质也是如此,因为您尚无法更改任意扇区;您必须擦除它们的全部内容。

因此,我们需要的是一个在将文件复制到 CD 的同时创建文件系统的工具。此工具称为 mkisofs。 示例用法如下所示

mkisofs  -r   -o cd_image   private_collection/
              `---------'   `-----------------'
                   |               |
          write output to   take directory as input

选项“-r”将 CD 上所有文件的权限设置为公共可读,并启用 RockRidge 扩展。除非您真的知道自己在做什么,否则您可能希望使用此选项(提示:不使用“-r”挂载点将获得 private_collection 的权限!)。

mkisofs 将尝试将所有文件名映射到 DOS 使用的 8.3 格式,以确保最高的兼容性。如果出现命名冲突(不同的文件具有相同的 8.3 名称),则文件名中会使用数字,并且有关所选文件名的信息会通过 STDERR(通常是屏幕)打印出来。不要惊慌:在 Linux 下,您永远不会看到这些奇怪的 8.3 文件名,因为 Linux 利用了 Rock Ridge 扩展,其中包含原始文件信息(权限、文件名等)。

如果您想生成更友好的 Windows CD-ROM,请记住使用选项 -J(MS Joliet 扩展)或使用 mkhybrid。对于 Macintosh 上使用的 HFS CD-ROM,您最好阅读 mkisofs 的“姐姐”mkhybrid 的手册页,以了解有关各种选项的详细信息。

现在您可能会想知道为什么 mkisofs 的输出没有直接发送到刻录设备。原因有三

有一种一次性写入 CD-R 的方法,将在下面介绍。

人们还可以考虑创建一个额外的分区,并将镜像写入该分区而不是写入文件。我反对这种策略,因为如果您由于拼写错误而写入错误的分区,您可能会丢失整个 Linux 系统。阅读:我就发生过这种情况... 此外,这是一种磁盘空间浪费,因为 CD 镜像是临时数据,可以在刻录 CD 后删除。但是,使用原始分区可以节省您删除 650 MB 大小的文件的时间。

测试 CD 镜像

Linux 具有将文件挂载为磁盘分区的功能。此功能对于检查 CD 镜像的目录布局和文件访问权限是否符合您的期望非常有用。虽然现在介质非常便宜,但刻录过程仍然耗时,您可能至少希望通过快速测试来节省您的时间。

要将上面创建的文件 cd_image 挂载到目录 /cdrom,请给出命令

mount -t iso9660 -o ro,loop=/dev/loop0 cd_image /cdrom

现在您可以检查 /cdrom 下的文件 - 它们看起来与真实 CD 上的文件完全一样。要卸载 CD 镜像,只需说 umount /cdrom。(警告:在 2.0.31 之前的 Linux 内核上,/cdrom 上的最后一个文件可能无法完全读取。请使用更新的内核,例如 2.0.36。cdrecord 的 -pad 选项仅适用于音频 CD,而 mkisofs 的 -pad 选项需要补丁,应用补丁与升级到无错误的 Linux 内核的工作量一样大。)

注意

某些旧版本的 mount 无法处理环回设备。如果您有如此旧版本的 mount,请升级您的 Linux 系统。已经有多人建议将有关如何获取最新 mount 实用程序的信息放入此 HOWTO 中。我一直拒绝这样做。如果您的 Linux 发行版附带了旧版本的 mount,请将其报告为错误。如果您的 Linux 发行版不易升级,请将其报告为错误。

如果我包含所有必要的信息来解决设计不良的 Linux 发行版中的错误,那么本 HOWTO 将会变得更大且更难阅读。

将 CD 镜像写入 CD

本节仅介绍在 TAO 模式下写入数据 CD,因为它是数据最常用的模式。有关 TAO 和 DAO 差异的更多信息,请参阅有关音频 CD-R 的章节。如果您使用带有工具 cdrdao 的 DAO 模式,请记住在 TOC 文件的末尾添加一个虚拟音频轨道(请参阅 README)。

剩下的不多了。如果您尚未尝试,现在是执行以下命令的好时机

cdrecord -scanbus

这将告诉您 CD 刻录机连接到哪个 SCSI 设备。所有其他猜测 cdrecord 如此漂亮地打印出来的信息的方法已从 HOWTO 中删除。

在向您展示最后一个命令之前,请让我警告您,CD 刻录机希望获得恒定的数据流。因此,将 CD 镜像写入 CD 的过程不得中断,否则将导致 CD 损坏。删除非常大的文件很容易中断数据流。示例:如果您删除一个 650 Mbytes 大小的旧 CD 镜像,则内核必须更新硬盘上 650,000 个块的信息(假设您的文件系统的块大小为 1 Kbyte)。这需要一些时间,并且很可能使磁盘活动减慢足够长的时间,以至于数据流暂停几秒钟。但是,在现代机器上,阅读邮件、浏览网页甚至编译内核通常不会影响刻录过程。

请注意,当受到干扰时,没有刻录机可以重新定位其激光并继续在 CD 上的原始位置刻录。因此,任何强烈的振动或其他机械冲击都可能会损坏您正在刻录的 CD。

当您在精神上做好准备后,穿上黑色长袍,将 CD 刻录机的 SCSI ID 与其 SCSI 修订版相乘,点燃尽可能多的蜡烛,说出 ASR-FAQ(新闻组 alt.sysadmin.recovery)的两节经文,最后键入

shell> SCSI_BUS=0   # taken from listing 1 "scsibus0:"
shell> SCSI_ID=6    # taken from listing 1 "TOSHIBA XM-3401"
shell> SCSI_LUN=0
shell> cdrecord -v speed=2 dev=$SCSI_BUS,$SCSI_ID,$SCSI_LUN \
                   -data  cd_image

# same as above, but shorter:
shell> cdrecord -v speed=2 dev=0,6,0  -data  cd_image

为了更好的可读性,刻录机的坐标存储在三个具有自然名称的环境变量中:SCSI_BUS、SCSI_ID、SCSI_LUN。

如果您使用 cdrecord 覆盖 CD-RW,则必须添加选项“blank=...”以擦除旧内容。请阅读手册页以了解有关擦除 CD-RW 的各种方法的更多信息。

在除了我之外的所有人都拥有 400 Mhz 机器的时代,人们直接将 mkisofs 的输出馈送到 cdrecord 中

shell> IMG_SIZE=`mkisofs -R -q -print-size private_collection/  2>&1 \
| sed -e "s/.* = //"`
shell> echo $IMG_SIZE
shell> [ "0$IMG_SIZE" -ne 0 ] && mkisofs -r  private_collection/  \
|cdrecord  speed=2  dev=0,6,0
            tsize=${IMG_SIZE}s  -data  -
#       don't forget the s --^         ^-- read data from STDIN

第一个命令是一个空运行,用于确定镜像的大小(您需要 cdrecord 发行版中的 mkisofs 才能使其工作)。您需要指定将在最终运行时使用的所有参数(例如 -J 或 -hfs)。也许您的刻录机不需要知道要写入的镜像的大小,因此您可以省略此空运行。打印的大小必须作为 tsize 参数传递给 cdrecord(它存储在环境变量 IMG_SIZE 中)。第二个命令是 mkisofs 和 cdrecord 的序列,通过管道耦合。

3.2 刻录音频 CD

刻录音频 CD 与上面描述的数据 CD 的步骤非常相似。您可以在两种技术之间进行选择:DAO 或 TAO。TAO(轨道一次刻录)不太适合音乐,因为您会在各个轨道之间听到咔哒声。无论如何,它首先被描述,因为它更容易处理,并且并非所有驱动器都支持 DAO。

与刻录数据 CD-R 相比,主要区别在于镜像的格式。ISO-9660(或您喜欢的任何文件系统)不适用,因为没有音频 CD 播放器能够处理文件系统。相反,音频数据必须以“44100 个样本/秒(44.1 kHz)的 PCM 编码的 16 位立体声样本”的形式写入。

将您的声音文件转换为所需格式的实用程序之一是 sox。它的用法很简单

shell> sox  killing-my-software.wav  killing-my-software.cdr

此命令会将歌曲 killing-my-software 从 WAV 格式转换为 CDR 音频格式。有关 sox 识别的格式和文件名扩展名的更多详细信息,请参阅 sox 的手册页。由于手动转换的输出占用大量磁盘空间,因此它已成为 cdrecord 的内置功能,用于 WAV 和 AU 声音格式。因此,只要您的声音文件具有 .wav 或 .au 扩展名(以及采样率“立体声,16 位,44.1 kHz”),您就可以将它们用作音轨,而无需手动转换为 CDR 格式。但是,cdrecord 要求声音数据的大小是 2352 的整数倍,并且大于 705,600 字节,这对于某些 WAV 文件来说并不满足。对于此类文件,需要使用 sox 将音频数据填充到 2352 字节。

刻录音频 CD (TAO)

音频 CD 由音轨组成,使用 TAO 模式时,音轨被组织为单独的镜像。因此,如果您想在 CD 上有十个音轨,则必须制作十个镜像。

如果指定了 -audio 选项,Cdrecord 会将 CD 镜像作为音轨写入。其他选项与用于刻录数据 CD 的选项相同(除非您有非常特殊的要求)。以下三个示例都执行相同的操作,但从不同的声音文件格式读取音轨

shell> cdrecord -v speed=2 dev=0,6,0  -audio  track1.cdr track2.cdr...
shell> cdrecord -v speed=2 dev=0,6,0  -audio  track1.wav track2.wav...
shell> cdrecord -v speed=2 dev=0,6,0  -audio  track1.au  track2.au...

通过这样做,您将生成一张音频 CD,该 CD 在音轨之间有 2 秒的停顿。cdrecord 无法直接读取的一种值得注意的格式是 MPEG Layer 3。要将此格式的文件转换为 CDR 格式,您可以使用命令“mpg123 --cdr - track1.mp3 > track1.cdr”。选项 --cdr 确保轨道以所需格式编码(见上文)。旧版本的 mpg123 需要 -s 而不是 plain - 才能写入 stdout。另一个方向(从 WAV 转换为 MPEG)可以使用 LAME 处理 WAV 文件(使用 cdda2wav 从音频 CD 中提取轨道,并在 LAME 的帮助下将其编码为 MP3)。

要从一大堆 MP3 文件创建 CD-R,您可以使用以下命令序列

for I in *.mp3
do
    mpg123 --cdr - "$I" | cdrecord -audio -pad -nofix -
done
cdrecord -fix

根据您机器的速度,您可能希望将写入速度降低到“speed=1”(cdrecord 选项)。如果您使用“speed=4”,您的机器必须能够以四倍速播放 MP3 文件。mpg123 消耗大量 CPU 时间!如果您有疑问,请尝试使用 -dummy 进行空运行(保持激光关闭)。

DAO

如果您想消除音频轨道之间的停顿,则必须使用盘片一次刻录 (DAO) 录制,而不是上面描述的(单独)轨道一次刻录 (TAO) 录制。目前 cdrdao 对 DAO 的支持最为先进。有关详细信息,请参阅其主页。

如果您在 DAO 模式下母版制作 CD,则您使用单片镜像(声音文件)并通过配置文件控制轨道信息。

CD_DA
TRACK AUDIO
FILE "live.wav" 0 5:0:0
INDEX 3:0:0
TRACK AUDIO
FILE "live.wav" 5:0:0 5:0:0
TRACK AUDIO
FILE "live.wav" 10:0:0 5:0:0
INDEX 2:0:0

3.3 混合模式 CD-ROM

关于这个主题没什么好说的。只需使用选项 -data 和 -audio 指示(后续)镜像的类型即可。 例子

cdrecord  -v dev=0,6,0  -data  cd_image  -audio  track*.cdr


下一页 上一页 目录