第21章 其他文件系统
附录 D. OpenPGP 密钥
18.5.创建和使用 CD 媒体
紧凑型光盘(CD)媒体提供了一些区别于传统磁盘的特点。它们被设计成可以连续读取,而不需要延迟在轨道之间移动磁头。虽然 CD 介质确实有轨道,但这是指要连续读取的数据部分,而不是磁盘的物理属性。ISO 9660 文件系统就是为了处理这些差异而设计的。
FreeBSD Ports Collection 提供了几个用于刻录和复制音频和数据光盘的实用程序。这一章演示了几个命令行实用程序的使用。对于带有图形化工具的 CD 刻录软件,可以考虑安装 sysutils/xcdroastsysutils/k3b 包或 port。

18.5.1 支持的设备

GENERIC 内核提供了对 SCSI ,USB 和 ATAPICD 读卡器和刻录机的支持。如果使用自定义内核,需要在内核配置文件中出现的选项因设备的类型而异。
对于 SCSI 刻录机,确保这些选项是存在的:
1
device scbus # SCSI bus (required for ATA/SCSI)
2
device da # Direct Access (disks)
3
device pass # Passthrough device (direct ATA/SCSI access)
4
device cd # needed for CD and DVD burners
Copied!
对于USB刻录机,确保这些选项是存在的:
1
device scbus # SCSI bus (required for ATA/SCSI)
2
device da # Direct Access (disks)
3
device pass # Passthrough device (direct ATA/SCSI access)
4
device cd # needed for CD and DVD burners
5
device uhci # provides USB 1.x support
6
device ohci # provides USB 1.x support
7
device ehci # provides USB 2.0 support
8
device xhci # provides USB 3.0 support
9
device usb # USB Bus (required)
10
device umass # Disks/Mass storage - Requires scbus and da
Copied!
对于ATAPI刻录机,要确保这些选项是存在的:
1
device ata # Legacy ATA/SATA controllers
2
device scbus # SCSI bus (required for ATA/SCSI)
3
device pass # Passthrough device (direct ATA/SCSI access)
4
device cd # needed for CD and DVD burners
Copied!
注意:
在 10.x 之前的 FreeBSD 版本中,如果刻录机是 ATAPI 设备,在内核配置文件中也需要这一行:
1
device atapicam
Copied!
另外,通过在 /boot/loader.conf 中添加以下一行,可以在启动时加载该驱动:
1
atapicam_load="YES"
Copied!
这将需要重新启动系统,因为这个驱动程序只能在启动时加载。为了验证 FreeBSD 是否识别该设备,运行 dmesg 并寻找该设备的条目。在10.x之前的系统中,输出的第一行中的设备名称将是 acd0 而不是 cd0
1
% dmesg | grep cd
2
cd0 at ahcich1 bus 0 scbus1 target 0 lun 0
3
cd0: <HL-DT-ST DVDRAM GU70N LT20> Removable CD-ROM SCSI-0 device
4
cd0: Serial Number M3OD3S34152
5
cd0: 150.000MB/s transfers (SATA 1.x, UDMA6, ATAPI 12bytes, PIO 8192bytes)
6
cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed
Copied!

18.5.2 刻录光盘

在 FreeBSD 中,cdrecord 可以用来刻录 CD。这个命令被安装在sysutils/cdrtools软件包或 port 中。
虽然 cdrecord 有许多选项,但基本用法很简单。指定要刻录的 ISO 文件的名称,如果系统有多个刻录机设备,则指定要使用的设备的名称:
1
# cdrecord dev=device imagefile.iso
Copied!
为了确定刻录机的设备名称,使用 -scanbus ,可能产生这样的结果:
1
# cdrecord -scanbus
2
ProDVD-ProBD-Clone 3.00 (amd64-unknown-freebsd10.0) Copyright (C) 1995-2010 Jörg Schilling
3
Using libscg version 'schily-0.9'
4
scsibus0:
5
0,0,0 0) 'SEAGATE ' 'ST39236LW ' '0004' Disk
6
0,1,0 1) 'SEAGATE ' 'ST39173W ' '5958' Disk
7
0,2,0 2) *
8
0,3,0 3) 'iomega ' 'jaz 1GB ' 'J.86' Removable Disk
9
0,4,0 4) 'NEC ' 'CD-ROM DRIVE:466' '1.26' Removable CD-ROM
10
0,5,0 5) *
11
0,6,0 6) *
12
0,7,0 7) *
13
scsibus1:
14
1,0,0 100) *
15
1,1,0 101) *
16
1,2,0 102) *
17
1,3,0 103) *
18
1,4,0 104) *
19
1,5,0 105) 'YAMAHA ' 'CRW4260 ' '1.0q' Removable CD-ROM
20
1,6,0 106) 'ARTEC ' 'AM12S ' '1.06' Scanner
21
1,7,0 107) *
Copied!
找到 CD 刻录机的条目,用逗号分隔的三个数字作为 dev 的值。在本例中,Yamaha 刻录机的设备是1,5,0,所以指定该设备的适当输入是 dev=1,5,0 。参考 cdrecord 的手册页,了解指定该值的其他方法,以及关于写入音轨和控制写入速度的信息。
另外,还运行下面的命令来获得刻录机的设备地址:
1
# camcontrol devlist
2
<MATSHITA CDRW/DVD UJDA740 1.00> at scbus1 target 0 lun 0 (cd0,pass0)
Copied!
使用 scbustargetlun 的数字值。在这个例子中,1,0,0 是要使用的设备名称。

18.5.3 将数据写入 ISO 文件系统

为了制作数据光盘,在刻录到光盘上之前必须准备好构成光盘轨道的数据文件。在 FreeBSD 中,sysutils/cdrtools 安装了 mkisofs ,它可以用来制作一个 ISO 9660 文件系统,它是 UNIX® 文件系统中目录树的一个映像。最简单的用法是指定要创建的 ISO 文件的名称和要放入 ISO 9660 文件系统的文件的路径:
1
# mkisofs -o imagefile.iso /path/to/tree
Copied!
该命令将指定路径中的文件名映射为符合标准 ISO 9660 文件系统限制的名称,并将排除不符合 ISO 有一些选项可以用来克服标准所施加的限制。
有许多选项可以克服该标准所施加的限制。特别是,-R 启用 UNIX® 系统常用的 Rock Ridge 扩展,-J 启用 Microsoft® 系统使用的 Joliet 扩展。
对于只在FreeBSD系统上使用的光盘,可以用 -U 来禁用所有的文件名限制。当与 -R 一起使用时,它产生的文件系统映像与指定的 FreeBSD tree 相同,即使它违反了 ISO 9660 标准。
最后一个一般使用的选项是 -b。它被用来指定用于生产“El Torito”可引导光盘的引导镜像的位置。这个选项需要一个参数,它是被写入光盘的树顶的引导映像的路径。默认情况下,mkisofs 在“软盘仿真”模式下创建 ISO 映像,因此希望引导映像的大小正好是 1200、1440 或 2880 KB。一些 BootLoader,像 FreeBSD 发行媒体使用的那种,不使用仿真模式。在这种情况下,应该使用 -no-emul-boot。因此,如果 /tmp/myboot 持有一个可启动的 FreeBSD 系统,其启动镜像在 /tmp/myboot/boot/cdboot 中,这个命令将产生 /tmp/bootable.iso
1
# mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot
Copied!
由此产生的 ISO 镜像可以作为内存盘挂载:
1
# mdconfig -a -t vnode -f /tmp/bootable.iso -u 0
2
# mount -t cd9660 /dev/md0 /mnt
Copied!
然后我们可以验证 /mnt/tmp/myboot 是相同的。
mkisofs还有许多其他选项可以用来微调其行为。详情请参考 mkisofs(8)
注意:
可以将数据光盘复制到一个镜像文件中,该文件在功能上与用 mkisofs 创建的镜像文件相当。要做到这一点,使用 dd ,将设备名称作为输入文件,将要创建的 ISO 的名称作为输出文件:
1
# dd if=/dev/cd0 of=file.iso bs=2048
Copied!
产生的映像文件可以按照刻录光盘中的描述刻录到光盘上。

18.5.4. 使用数据光盘

ISO 被刻录到光盘上以后,就可以通过指定文件系统类型、包含光盘的设备名称和一个现有的挂载点来挂载它:
1
# mount -t cd9660 /dev/cd0 /mnt
Copied!
由于挂载时假定文件系统是 ufs 类型的,如果在挂载数据光盘时不包括 -t cd9660 ,将产生 Incorrect super block错误。
虽然任何数据光盘都可以这样挂载,但具有某些 ISO 9660 扩展名的磁盘可能表现得很奇怪。例如,Joliet 磁盘以两字节的 Unicode 字符存储所有文件名。如果一些非英语字符显示为问号,请用 -C 指定本地字符集。更多信息,请参考mount_cd9660(8)
注意:
为了使用 -C 进行这种字符转换,内核需要加载 cd9660_iconv.ko 模块。这可以通过在 loader.conf 中加入这一行来完成:
1
cd9660_iconv_load="YES"
Copied!
然后重启机器,或者直接用 kldload 加载模块。
偶尔,当试图装载数据光盘时,会显示 Device not configured。这通常意味着光盘驱动器没有检测到托盘中的磁盘,或者驱动器在总线上不可见。光驱检测介质可能需要几秒钟的时间,所以要有耐心。
有时,SCSI CD 驱动器可能会被遗漏,因为它没有足够的时间来回答总线复位。为了解决这个问题,可以创建一个自定义内核,增加默认的 SCSI 延迟。在定制的内核配置文件中增加以下选项,并按照“构建和安装定制的内核”的说明重建内核:
1
options SCSI_DELAY=15000
Copied!
这让 SCSI 总线在启动过程中暂停 15 秒,以便给 CD 驱动器一切可能的机会来回答总线的复位。
注意:
可以直接将文件刻录到光盘上,而不创建ISO 9660文件系统。这就是所谓的刻录原始数据光盘,有些人为了备份会这样做。
这种类型的磁盘不能像普通的数据光盘一样被挂载。为了检索刻录到这种光盘上的数据,必须从原始设备节点上读取数据。例如,这个命令将把位于第二个CD设备上的压缩tar文件提取到当前工作目录中:
1
# tar xzvf /dev/cd1
Copied!
为了挂载数据光盘,必须使用 mkisofs 写入数据。

18.5.5. 复制音频CD

要复制一张音频 CD ,把 CD 上的音频数据提取成一系列的文件,然后把这些文件写入一张空白 CD 。
本节描述了如何复制和刻录一张音频 CD。如果 FreeBSD 的版本小于 10.0,并且设备是 ATAPI 总线,必须首先加载 atapicam 模块。
程序:复制一张音频CD
  1. 1.
    sysutils/cdrtools软件包或 port 安装了 cdda2wav 。这个命令可以用来提取所有的音轨,每个音轨都写在当前工作目录下的一个单独的 WAV 文件中:
1
% cdda2wav -vall -B -Owav
Copied!
如果系统上只有一个 CD 设备,则不需要指定设备名。参考 cdda2wav 手册中关于如何指定一个设备的说明,并了解更多关于这个命令的其他选项。
  1. 1.
    cdrecord来写入.wav文件。
1
% cdrecord -v dev=2,0 -dao -useinfo *.wav
Copied!
确保设置了2,0