19.8.通过 GEOM 实现 UFS 日志

在 FreeBSD 上,对 UFS 文件系统的日志支持是可用的。这个实现是通过 GEOM 子系统提供的,并通过 gjournal 进行配置。与其他文件系统的日志实现不同,gjournal 方法是基于块的,而不是作为文件系统的一部分来实现。它是一个 GEOM 扩展。

在元数据和文件写入提交到磁盘之前,日志存储了文件系统事务的日志,例如构成一个完整磁盘写入操作的变化。这个事务日志以后可以重放,重做文件系统事务,防止文件系统的不一致。

这种方法提供了另一种机制来防止数据丢失和文件系统的不一致。与跟踪和执行元数据更新的软更新和创建文件系统图像的快照不同,日志是专门为这项任务存储在磁盘空间的。为了提高性能,日志可以存储在另一个磁盘上。在这种配置中,日志提供者或存储设备应该列在要启用日志的设备之后。

GENERIC 内核提供了对 gjournal 的支持。要在启动时自动加载 geom_journal.ko 内核模块,请在 /boot/loader.conf 中加入以下一行:

  1. geom_journal_load="YES"

如果使用自定义的内核,确保在内核配置文件中有以下一行:

  1. options GEOM_JOURNAL

加载该模块之后,就可以通过以下步骤在新的文件系统上创建一个日志。在这个例子中,da4 是一个新的 SCSI 磁盘:

  1. # gjournal load
  2. # gjournal label /dev/da4

这将加载该模块并在 /dev/da4 上创建一个 /dev/da4.journal 设备节点。

现在可以在该日志设备上创建一个 UFS 文件系统,然后挂载到一个现有的挂载点。

  1. # newfs -O 2 -J /dev/da4.journal
  2. # mount /dev/da4.journal /mnt

注意:

如果有多个片断,则为每个片断创建一个日志。例如,如果 ad4s1ad4s2 都是片段,那么 gjournal 就会创建 ad4s1.journalad4s2.journal

也可以通过使用 tunefs 在当前的文件系统上启用日志功能。不过,在尝试改变现有文件系统之前,一定要先做备份。在大多数情况下,如果 gjournal 无法创建日志,它就会失败,但这并不能防止因误用 tunefs 而导致的数据丢失。关于这些命令的更多信息,请参考 gjournal(8)tunefs(8)

可以对 FreeBSD 系统的启动盘进行日记。请参考文章 Implementing UFS Journaling on a Desktop PC 以了解详细说明。