21.8.通过 GEOM 实现 UFS 日志 ============================ 在 FreeBSD 上,对 UFS 文件系统的日志支持是可用的。该实现是通过 GEOM 子系统提供的,并通过 ``gjournal`` 进行配置。与其他文件系统的日志实现不同,\ ``gjournal`` 方法是基于块的,而不是作为文件系统的一部分来实现。它是一个 GEOM 扩展。 在元数据和文件写入提交到磁盘之前,日志存储了文件系统事务的日志,例如构成一个完整磁盘写入操作的变化。这个事务日志以后可以重放,重做文件系统事务,防止文件系统不一致。 这种方法提供了另一种机制来防止数据丢失和文件系统的不一致。与跟踪和执行元数据更新的软更新和创建文件系统镜像的快照不同,日志是专门为这项任务存储在磁盘空间的。为了提高性能,日志可以存储在另一个磁盘上。在这种配置中,日志 provider 或存储设备应该列在要启用日志的设备之后。 **GENERIC** 内核提供了对 ``gjournal`` 的支持。要在启动时自动加载 **geom_journal.ko** 内核模块,请在 **/boot/loader.conf** 中加入以下一行: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session geom_journal_load="YES" 如果使用定制内核,确保在内核配置文件中有以下一行: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session options GEOM_JOURNAL 加载该模块之后,就可以通过以下步骤在新的文件系统上创建一个日志。在这个例子中,\ **da4** 是一个新的 SCSI 磁盘: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # gjournal load # gjournal label /dev/da4 这将加载该模块并在 **/dev/da4** 上创建一个设备节点 **/dev/da4.journal**\ 。 现在可以在该日志设备上创建 UFS 文件系统,然后挂载到一个现有的挂载点: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # newfs -O 2 -J /dev/da4.journal # mount /dev/da4.journal /mnt .. **注意** 如果有多个 slice,则为每个 slice 都创建一个日志。例如,如果 **ad4s1** 和 **ad4s2** 都是 slice,那么 ``gjournal`` 就会创建 **ad4s1.journal** 和 **ad4s2.journal**\ 。 也可以通过使用 ``tunefs`` 在当前的文件系统上启用日志功能。不过,在尝试改变现有文件系统之前,一定要先做备份。在大多数情况下,如果 ``gjournal`` 无法创建日志,它就会失败,但这并不能防止因误用 ``tunefs`` 而导致的数据丢失。关于这些命令的更多信息,请参考 `gjournal(8) `__ 和 `tunefs(8) `__\ 。 可以对 FreeBSD 系统的启动盘进行日记。请参考文章\ `在台式电脑上实现 UFS 日志系统 `__\ 以了解详细说明。