日志文件系统 – Journaling file system

发布时间: 更新时间: 总字数:1293 阅读时间:3m 作者: IP上海 分享 网址

最近学习使用 ceph,为 Journaling file system 真是分了不少心,终于有机会总结一下。

简介

日志文件系统(英语:Journaling file system),一种文件系统,指在文件系统发生变化时,先把相关的信息写入一个被称为日志的区域,然后再把变化写入主文件系统的文件系统。在文件系统发生故障(如内核崩溃或突然停电)时,日志文件系统更容易保持一致性,并且可以较快恢复。

概述

对文件系统进行修改时,需要进行很多操作。这些操作可能中途被打断,也就是说,这些操作不是“不可中断”(atomic)的。如果操作被打断,就可能造成文件系统出现不一致的状态。

例如:删除文件时,先要从目录树中移除文件的标示,然后收回文件占用的空间。如果在这两步之间操作被打断,文件占用的空间就无法收回。文件系统认为它是被占用的,但实际上目录树中已经找不到使用它的文件了。

在非日志文件系统中,要检查并修复类似的错误就必须对整个文件系统的数据结构进行检查。一般在挂载文件系统前,操作系统会检查它上次是否被成功卸载,如果没有,就会对其进行检查。如果文件系统很大或者 I/O 带宽有限,这个操作可能会花费很长时间。

为了避免这样的问题,日志文件系统分配了一个称为日志(journal)的区域来提前记录要对文件系统做的更改。在崩溃后,只要读取日志重新执行未完成的操作,文件系统就可以恢复一致。这种恢复是原子的,因为只存在几种情况:

不需要重新执行:这个事务被标记为已经完成

成功重新执行:根据日志,这个事务被重新执行

无法重新执行:这个事务会被撤销,就如同这个事务从来没有发生过

日志本身不完整:事务还没有被完全写入日志,它会被简单忽略

日志的三个级别

在很多日志文件系统(如:xfs,ext3,ext4,ReiserFS)中,可以选择三个级别的日志:回写(writeback)、顺序(ordered)和数据(data)。

1. 回写

在回写模式中,只有元数据被记录到日志中,数据会被直接写入主文件系统。这种模式能提供较好的性能,不过有较大的风险。例如:在增大文件时,数据还未写入就发生崩溃,那么文件系统恢复后,文件后面就可能出现垃圾数据。

2. 顺序

在顺序模式中,只有元数据被记录到日志中,但在日志被标记为提交前,数据会被写入文件系统。在这种模式下,如果在增大文件时,数据还未写入就发生崩溃,那么在恢复时这个事务会被简单的撤销,文件保持原来的状态。

3. 数据

在数据模式中,元数据和文件内容都先被写入日志中,然后在提交到主文件系统。这提高了安全性,但损失性能,因为所有数据要写入两次。在这种模式下,如果在增大文件时,发生崩溃,那么可能有两种情况:

日志完整:这时事务会被重新执行,修改会被提交到主文件系统

日志不完整:这时主文件系统还未被修改,只需要简单放弃这个事务

常见的日志文件系统

JFS:IBM 的 Journaled File System, 最早的日志文件系统

ext3 文件系统:ext2 文件系统演化而成的日志文件系统

ReiserFS:用 B+树作为数据结构的日志文件系统,在处理小文件时有较好的性能。

Btrfs:用 B 树作为数据结构,被认为是下一代 Linux 文件系统

NTFS:微软的 NTFS 也是日志文件系统

HFS+:苹果公司发展的 OS X 操作系统下主要使用的文件系统。

Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数