13-日志文件系统
14.6 日志文件系统
ext2文件系统是传统UNIX文件系统的优秀典范,自然也受制于其短板:系统崩溃之后,为确保文件系统的完整性,重启时必须对文件系统的一致性进行检查(fcsk)。由于系统每次崩溃时,对文件的更新可能只完成了一部分,而文件系统元数据(目录项、i节点信息以及文件数据块指针)也将处于不一致状态,一旦这一问题得不到修复,那么文件系统会遭到进一步破坏,因此上述举措实属必要。如有可能,就必须进行修复,否则,将会丢弃那些无法获取的信息(可能会包含文件数据)。
问题在于,一致性检查需要遍历整个文件系统。如果文件系统较小,只需几秒或几分钟便可完成。而在大型文件系统上,上述操作可能会历时数小时,这对于需要保持高可用性的系统来说(比如,网络服务器),情况就非常严重。
采用日志文件系统,则无需在系统崩溃后对文件进行漫长的一致性检查。在实际更新元数据之前,日志文件系统会将这些更新操作记录于专用的磁盘日志文件中。对元数据更新的记录是按其相关性分组(以事务的方式记录)进行的。在事务处理过程中,一旦系统崩溃,系统重启时便可利用日志重做(redo)任何不完整的更新,同时为文件系统恢复一致性状态。(借用数据库的说法,日志文件系统能够确保总是将文件元数据事务作为一个完整单元来提交。)系统崩溃之后,即便是超大型的日志文件系统,通常也会在几秒之内复原,因而对于有高可用性需求的系统极具吸引力。
日志文件系统最为昭著的臭名在于增加了文件更新的时间,当然,良好的设计可以降低这方面的开销。
某些日志文件系统只会确保文件元数据的一致性。由于不记录文件数据,因此一旦系统崩溃,可能会造成数据丢失。ext3、ext4和Reiserfs文件系统提供了记录数据更新的选项,但若记录的东西过多,则会降低文件I/O的性能。
以下列出了Linux所支持的日志文件系统。
- Reiserfs是首个被集成进内核(版本号为2.4.1)的日志文件系统。Reiserfs提供了一种名为tail packing (或tail merging)的特性:可将小文件(以及较大文件的最后一片)与文件元数据装入相同的磁盘块。而许多系统都拥有(或由应用程序创建了)众多小文件,因此这会节省大量的磁盘空间。
- ext3文件系统,源于一个旨在以最小改动为ext2追加日志功能的项目。从ext2升级到ext3非常简单(无需备份和恢复操作),还支持反向降级。内核版本2.4.15集成了ext3。
- JFS由IBM开发,内核版本2.4.20对其进行了集成。
- XFS (http://oss.sgi.com/projects/xfs/)最初是由SGI(Silicon Graphics)于20世纪90年代初期开发,所针对的是自己的私有UNIX实现:Irix。2001年,XFS被移植到了Linux平台,并成为自由软件项目。2.4.24内核对其进行了集成。
配置内核时,可在“File systems”菜单下激活对不同文件系统支持的内核设置选项。
写作本书之际,还有两种提供了日志功能,且支持多种其他高级特性的文件系统尚在开发之中。
- ext4文件系统(http://ext4.wiki.kernel.org/)是ext3文件系统的“接班人”。Linux2.6.19将其首个实现并入,内核的后续版本中又陆续添加了各种特性。ext4的规划(或已实现的)特性包括extents(预留连续存储块)、旨在降低文件碎片化的其他分配特性、在线文件系统的磁盘碎片整理、更为快捷的文件系统检查以及对纳秒级时间戳的支持。
- Btrfs(B-树FS,一般读作“butter FS”,http://btrfs.wiki.kernel.org/)是一种自下而上进行设计的新型文件系统,意在提供一系列现代化特性,其中包括extents、可写快照(等价于对元数据和数据的日志功能)、对数据和元数据的校验和、在线文件系统检查、在线文件系统的磁盘碎片整理、高效利用空间的小文件打包存放和可检索目录。内核版本2.6.29中集成了该文件系统。