第一章:外部文件系统

FreeBSD可以读写用于其他操作系统的文件系统。你可以把非FreeBSD机器上的磁盘拿过来附加到FreeBSD主机上,读取其中的文件。

本书所说的外部文件系统是指:任何使用UFS或ZFS以外的文件系统的永久物理存储。

FreeBSD支持多种外部文件系统,但它们在FreeBSD上的行为可能与本机操作系统上的行为不同。比如,Linux文件系统不支持FreeBSD风格的文件标志,FAT衍生的文件系统也不支持文件权限(permissions)或所有权(ownership)。

本章将讨论各种MS FAT文件系统、CD使用的ISO 9660标准、大型可移动存储使用的通用数据格式以及LinuxEXT和ReiserFS文件系统。

我们将从可移动介质的基础知识开始。

可移动介质

可移动介质包括CD、USB设备或正硬盘驱动器。甚至包括软盘。

使用可移动介质几乎与使用永久连接的存储完全相同,但稍微复杂一些。

可移动介质设备节点

要使用可移动介质,需要知道这个介质的设备节点。

设备节点取决于设备类型。USB设备(闪存盘或移动硬盘)会显示为/dev/da设备;光学介质(CD或蓝光盘)会显示为/dev/cd,即使它们是USB设备;软盘会显示为/dev/fd0。

最难的部分是弄清楚设备号。

如果你只有一个CD设备,它大概会是/dev/cd0,但硬盘却更难分辨。

识别可移动存储设备的设备节点的最简单的方法是在插入设备时检查/var/log/messages或查看控制台上的输出信息。有些人更喜欢用geom disk list命令读取这些信息。

内核将记录分配给新设备的名称。

识别设备节点后,检查设备上的分区。

一些较小的可移动存储设备,如软盘或小型的USB驱动器,将文件系统直接放在物理设备上。其他的使用分区表。

检查分区的最简单方法是查找分区设备的节点,但gpart show等工具也可以使用。

挂载点可以是系统上的任何现有目录。

FreeBSD包括一个用于可移动介质的/media目录,它还为你需要的任何随机短期挂载提供/mnt。但是,你可以在任何你喜欢的目录上挂载分区。

使用mount命令将设备或分区附加到目录树上:

使用正确的mount标识或挂载程序挂载设备上的文件系统。

通常,只有root可以挂载文件系统。如果要授予无特权用户挂载可移动介质的权限,可将sysctl vfs.usermount设置为1。

移除介质

移除已挂载文件系统下的硬件可能会导致数据丢失或程序崩溃,甚至可能使系统死机,具体取决于磁盘的文件系统和磁盘上发生的事情。

要安全地从系统中删除介质,请先卸载介质上的所有文件系统。

光盘托盘在卸载光盘之前不会打开,这是一个有用的提醒,但没有什么能阻止你拔出USB闪存驱动器。

使用软盘

软盘的工作原理与任何其他可移动介质一样,只是在使用前必须格式化。

这种低级格式使磁盘准备好接收文件系统。

软盘通常不使用分区表。

虽然软盘生产厂商几乎会在发货前对软盘进行格式化,但依然建议对其重新格式化。

首先使用fdformat命令执行低级格式化。此程序需要两个参数:软盘的大小和设备名称:

fdformat命令的运行速度比newfs慢,足够去喝杯咖啡了。

然后你可以在软盘上创建一个文件系统。

无法在USB软盘驱动器上运行fdformat命令,如果软盘需要重新格式化,而你只有USB软盘驱动器,就只能把它扔掉了。(这大概就意味着需要接FDD线的内置软驱)

MSDOS 文件系统

File Allocation Table——FAT,文件分配表,可能是文件系统的最低公分母。FAT可以追溯到微软DOS年代,但它一直在更新,以支持更现代的系统。

如今,FAT主要用于可移动介质,如USB闪存驱动器,或者软盘。

FreeBSD对于读取、写入和创建各种版本的FAT都有很好的支持,它们被统称为msdos文件系统。

读取MSDOS 文件系统

以下命令用于挂载FAT文件系统:

也可以使用mount_msdos命令。

此命令不区分FAT16和FAT32,FreeBSD会自动判别介质上的FAT版本。

也可以通过它们在/dev/msdosfs中显示的标签名称来挂载FAT设备。

创建MSDOS文件系统

使用newfs_msdos命令创建FAT文件系统。

对于大多数现代存储介质,你将把文件系统放到分区上。

软盘不使用分区表,一些使用FAT的旧娱乐设备也不支持分区表。这些情况下,将文件系统放在原始磁盘上。

以下示例在2GB的USB闪存驱动器da4上创建了一个MBR分区表和一个FAT分区。使用MBR而不是GPT,是为了兼容旧电视机之类的老旧设备:

现在这个U盘上有了一个分区表,并创建了一个FAT32的文件系统。

FreeBSD可以为FAT文件系统分配标签。使用–L和标签名称。FAT标签最多可包含11个字符。合法字符包括字母数字、空格和几十个基本符号字符。

此FAT32文件系统已经准备好使用。

如果需要创建旧版本的FAT,可以使用-F参数和FAT版本号。FreeBSD支持三个版本的FAT:FAT12、FAT16、FAT32。

某些网络的硬件太旧了,只能识别FAT12。

修复FAT文件系统

FreeBSD在FAT方面做得很好,但并不是每个人都这么小心。如果你有一个FAT损坏的设备,fsck_msdosfs(8)可能能够修复它。

如果fsck_msdosfs(8)发现错误,它会为您提供“fixing”选项以修复错误。您最终应该得到一个可用的文件系统,但不一定是您希望恢复的所有文件。

与任何文件系统一样,您恢复具有复杂损坏的FAT的能力仅受您对FAT的理解的限制

MSDOS 和/etc/fstab

把FAT文件系统列如/etc/fstab可以轻易挂载它们。比如:

注意,这里使用了noauto挂载选项,这样系统在启动时就不会自动挂载此设备。

电脑上插个U盘可能会造成系统在启动过程中挂起。

其他 MSDOS 提示

FreeBSD的mount_msdosfs(8)包括几个很少使用的功能,这些功能可能会在使用较旧的FAT文件系统时对您有所帮助,例如管理Windows 95的长文件名。当你有FAT问题时,一定要查看手册页。

虽然FAT文件系统不支持UTF-8字符集或其他语言环境,但您可以在DOS代码页和这些字符集之间使用FreeBSD映射。您必须加载内核模块msdosfs_iconv.ko,并配置您的区域设置。使用-L标志设置您的区域设置,使用-D指定DOS代码页,如mount_msdosfs(8)中所述。

如果你需要处理一大堆FAT磁盘,请查看mtools包。它包含几个灵活的工具,可以在不挂载FAT文件系统的情况下使用它们。

CDs: ISO 9660

ISO 9660是为支持CD而开发的。

FreeBSD支持读取和写入CD映像,以及将这些映像刻录到磁盘。

绝大多数CD都是用ISO 9660格式化的,FreeBSD称之为cd9660。

DVD和蓝光光盘使用UDF。

普通的CD是只读介质,多数的CD无法重写。

可重写的CD是存在的,但它们寿命很短,而且大多数已经被更强大的USB闪存驱动器取代了,故此书不讨论它们。

然而,在某些环境中,CD的只写(write-only)特性可能是个优势。刻录到CD上的文件不会收到病毒的威胁。

多会话磁盘允许你将数据附加到可读写光盘的末尾,而不是覆盖现有的文件系统。使用多段CD在很大程度上取决于硬件。

创建CD有两个步骤:制作ISO 9660文件系统的映像,然后将该映像刻录到光盘上。

多CD驱动器

在具有多个CD驱动器的系统中,找出哪个硬件与哪个设备节点对应,可能会让人感到沮丧。

如果你有多个/dev/cd设备,识别哪个节点指向哪个驱动器的最简单方法是使用cdcontrol命令。关闭所有CD托盘的门,对每个设备节点运行cdcontrol eject命令,使用-f标志指定设备节点,如下所示:

弹出的那个就是/dev/cd1。

cdcontrol命令也有个close方法,但是并非所有光驱都支持自动关闭。

以下示例假设使用的CD驱动器是/dev/cd0。

读取CDs

使用以下命令挂载CD:

ISO 9660没有分区,但在极少数情况下,你可能会发现光盘上刻录了分区表。如果在挂载磁盘时遇到问题,请检查分区表。

CD设备也可以放进/etc/fstab中:

将CD映像刻录到光盘上

使用cdrecord命令可以将ISO映像刻录到光盘上:

如果你有多个光盘刻录机,需要用-dev标志指定设备名称:

刻录时长取决于刻录机的速度。

创建ISO 9660 映像

刻录已有映像很简单,但是FreeBSD也可以让你创建包含你自己的文件的光盘映像。

使用cdrtools中的mkisofs套件命令将目录树传递到文件系统映像中。

以下示例将~/cdfiles中的文件做成映像。

先看看这个目录中都有那些文件:

现在,将这个目录传递到ISO 9660文件系统中:

-o选项定义输出的映像文件的文件名。

映像文件现在已准备好刻录到CD。但是,在刻录之前,请按照第5章中的讨论装载磁盘映像,仔细检查内容。你会发现内容略有不同。

文件的所有权变了。如果目录中有符号链接,它们会丢失。一个文件的名称被截断了。

ISO 9660标准对文件名施加了8+3个字符的限制。且最大深度为8个目录层,最多65535个目录,以及各种其他恼人的限制。此外,ISO 9660并没有反映POSIX的所有文件系统语义,也没有反映所有的微软文件系统标准。然而,各种扩展支持这些功能。

ISO 9660 扩展和功能

使用任何ISO 9660扩展都需要在创建ISO映像时指定扩展。您无法将扩展改装到现有的ISO上,因为扩展支持的信息在ISO中不存在。最常见的两组延伸是Joliet和Rock Ridge。

微软创建了Joliet扩展来支持Windows文件名和属性。具有Joliet扩展名的ISO上的文件名最长可达103个字符,目录可以运行超过8层。使用-J标志激活Joliet扩展。

Rock Ridge扩展是为类Unix系统设计的。它们还允许更长的文件名和更大的目录深度,但也对文件所有权、符号链接等Unix属性进行编码。使用-R标志启用Rock Ridge扩展。

El Torito扩展将ISO标记为可引导设备。您仍然需要在ISO中放置引导加载程序和操作系统。使用-b和引导加载程序的路径启用El Torito。有关更多信息,请参阅本章后面的“可启动CD”。

这些扩展的存在不会干扰在其他操作系统上读取CD。Windows系统可以打开使用Rock Ridge扩展创建的CD,但忽略Unix风格的权限和符号链接。Unix主机可以打开Joliet CD,但不会使用Windows特定的信息。FreeBSD的CD驱动程序默认处理所有这些扩展。

如果CD仅在FreeBSD主机上使用,您可以使用-U完全绕过所有ISO文件名限制。该映像可能会违反ISO 9660,但会保留所有文件名信息。

我通常使用Joliet和Rock Ridge扩展创建ISO。Unix主机将获得完整的文件名和其他POSIX元数据,而微软系统至少会获得完整的名称。

将映像刻录到磁盘,您就可以开始了。

可启动CDs

除了目录树之外,可引导CD还需要一个引导加载程序、一个操作系统内核和某种用户空间。

使用–b指定引导加载程序。FreeBSD包含一个引导加载程序,用于从CD的/boot/cdboot运行FreeBSD。

与许多其他引导加载程序不同,cdboot不模拟软盘,因此您还必须添加–no-emul-boot标志。

在创建ISO之前,将内核和用户区复制到源代码目录树中。FreeBSD引导加载程序希望在/boot/kernel目录中找到内核和任何内核模块。如果你破解了加载器的内部,你可以改变这一点。用户空间可能很小,但要实际使用可引导CD,您需要基本程序,如/bin和/sbin中的程序。 这里我在cdfiles目录中有一个完整的目录树,包括一个引导加载程序的副本。我使用mkisofs(1)创建了可引导的ISO。

创建自定义FreeBSD引导CD(包括自定义安装介质)的最简单方法是make release过程。

遗憾的是,CD正逐渐被淘汰。DVD和蓝光是更现代的光学媒体。

DVD and Blu-ray: UDF

您可以在最大4.3 GB的任何光学介质上使用CD风格的ISO 9660文件系统。这意味着您可以在单层DVD上使用CD文件系统。

较大的光学介质,如多层DVD或蓝光,使用通用数据格式(UDF)文件系统或混合ISO 9660/UDF文件系统。与ISO 9660一样,UDF是一个只读文件系统。您可以创建UDF映像并将其刻录到磁盘,但不能编辑现有映像。

FreeBSD支持对UDF磁盘进行读写操作。(UDF是一个只读文件系统,但FreeBSD可以像ISO一样将文件系统写入磁盘。)您可以使用DVD和蓝光光盘来存储和传输数据。可写光学介质不是耐用的长期存储介质,但在某些环境中,它是最好的选择。

UDF支持与阅读商业DVD和蓝光光盘不同。商业光盘,如用于电影的光盘,都是加密的。在任何开源操作系统上观看DVD或蓝光光盘都没有免费的解决方案。互联网搜索将揭示许多破解大部分加密的方法,但这超出了本书的范围。

我们不会花时间探索DVD视频格式的细节,这是一种适用于蓝光或DVD播放器的特定文件排列。这很快就会变得复杂,你可以在DVD视频上找到广泛的跨平台文献。使用dvdauthor包等第三方工具创建此类文件系统。

最后,与CD一样,我们不会讨论多段磁盘。多会话磁盘是将数据附加到读写光盘末尾的地方,而不是覆盖现有的文件系统。多段磁盘的硬件支持是混合的,DVD-RW和DVD+RW对其使用有不同的限制。如果你真的想深入了解多段磁盘,请查看FreeBSD手册了解所有繁琐的细节。相反,我们将介绍所有UDF用户必须知道的内容。

UDF Hardware

DVD光盘是标准化的,有几个标准可供选择。

DVD光盘最常见的标准是DVD-R和DVD+R。每种都有读写格式,DVD-RW和DVD+RW。

DVD驱动器可以使用其中一种,但可能不会同时支持这两种。

目前制造的大多数DVD驱动器都被归类为DVD+/-,并支持这两种介质类型。

在尝试读写DVD之前,请确保硬件和空白介质互相兼容。在仅支持DVD+RW的驱动器上不能刻录DVD-RW光盘。

您还可以找到一些DVD-RAM磁盘,它们是读写DVD磁盘。DVD-RAM驱动器和播放器的产量很小,现在很难找到。DVD-RAM光盘可以低速重写100000次。(更快的写入速度减少了重写次数。)DVD-RAM的稳定时间预计比其他任何一种类型的磁盘都要长得多。DVD-RAM具有高重写容忍度,最好像普通硬盘一样进行管理。使用gpart(8)对其进行分区,使用newfs(8)创建一个文件系统,并存储您的数据。

蓝光光盘也是标准化的。与DVD不同,只有一个标准。你真幸运。

挂载UDF 光盘

使用mount_udf命令挂载UDF盘。需要提供两个参数:设备节点和挂载点:

mount命令没有特定UDF挂载选项,虽然理论上可以使用mount中的一些通用选项挂载UDF,但作者并不知道它们在什么情况下起效。

UDF是一个只读文件系统。

创建UDF 映像

使用mkisofs命令创建UDF磁盘映像。除了iso 9660映像所需的-R和-J外,您还需要-udf和-iso-level 3级标志:

下面,我们将/home/mwl/udf中所有FreeBSD版本捆绑(bundle)到udf镜像中:

您将收到一堆垃圾邮件状态消息,确切地说明文件系统创建过程的进展情况,然后是一个很好的总结。

如果您对UDF映像的质量或内容有任何疑问,请使用第5章中讨论的mdconfig(8)挂载磁盘映像并确保其正确。一旦你满意了,就把图像刻录到磁盘上。

刻录UDF 映像

虽然mkisofs可以将UDF文件系统刻录到光盘,但通常建议使用dvd+rw-tools包中的growisofs。该软件适用于两种DVD格式,但需要单独安装:

growisofs一个恼人之处是不能用sudo运行它,只能由root用户运行它。

growisofs命令检查SUDO_COMMAND环境变量的存在,因此你可以使用包装器脚本剥离该变量,使用 sudo su -l,或者unsetenv SUDO_COMMAND。

当你处理干净了根shell,可使用-dvd-compat和-Z标志将UDF映像文件刻录到/dev/burner:

是的,设备号和映像文件之间有个等号。

下面我们将FreeBSD-release.udf映像文件刻录到蓝光设备/dev/cd0上:

倒杯咖啡,等它完成。

转储文件到UDF

映像文件作为中间介质可以忽略。直接使用growisofs将目录层次结构转储到光盘上,无需创建中间的UDF映像文件,形如:

如果我在/home/mwl/udf中有一堆文件要刻录到/dev/cd0的蓝光刻录机上,我可以这样做:

刻录消息与刻录映像文件时显示的消息非常相似,整个过程大约需要一样长的时间。现在是清理几年前你洒可乐的那个可怕的底部抽屉的好时机。最终,您将拥有一个包含文件的光盘。

Linux 文件系统

FreeBSD支持Linux的ext2fs、ext3fs、ext4fs和ReiserFS。、

根据经验,FreeBSD Linux文件系统支持的最佳用途是将Linux系统迁移到FreeBSD系统。

通过网络复制文件的速度远远不如将硬盘直接查到目标主机上复制。

FreeBSD可以在jail里运行大多数Linux系统。

在运行双引导电脑上,可以在运行FreeBSD是访问Linux分区里的文件。

ext 文件系统

FreeBSD将所有ext文件系统分类为ext2fs类型。ext3fs和ext4fs是ext2fs的扩展和变体。

在使用任何ext文件系统之前,必须加载内核模块/boot/kernel/ext2fs.ko。

没有特定于ext的mount命令,只能在mount命令的-t选项指定:

FreeBSD对ext2fs有完全的读写支持。

虽然FreeBSD可以读写ext3fs,但缺少一些功能。FreeBSD不能记录ext3fs。不支持大于128字节的索引节点。Linux扩展属性也不起作用,尽管其中许多属性并不直接映射到FreeBSD上的任何东西,所以这并不企图哎。

FreeBSD以只读方式挂载所有ext4fs文件系统。FreeBSD不能写入ext4fs文件系统。

如果你需要使用ext文件系统做大量工作,请使用e2fsprogs包,这些工具允许你创建和检查(fsck)ext文件系统。

ReiserFS

ReiserFS的许多特性并不容易映射到FreeBSD支持的任何东西上。虽然FreeBSD可以只读挂载ReiserFS卷,但这种支持最好保留用于从Linux、数字取证或其他非生产用途迁移。

同样,只能用mount -t reiserfs挂载ReiserFS:

无法在FreeBSD上创建、修复或编辑ReiserFS卷。而且确实没有理由将它们添加到/etc/fstab中。