Linux/Unix文件系统主流架构包括以下几种:
(1) FFS-style文件系统:代表文件系统有最初的Berkeley FFS和Ext2,具有的优点是简单、高性能、易于修复和恢复数据,但是每次系统崩溃需要全盘fsck,无数据一致性保障,无正规的防御磁盘崩溃的措施。
(2) 日志(Journaling)文件系统:最为流行的现代文件系统架构,典型代表文件系统有Ext3、Reiserfs以及其他多种文件系统。日志文件系统加入对近期提交到文件系统的事务的log,log顺序地写到磁盘上的一个保留的位置。文件系统的主体不会更改,直到事务完整地写到log中为止。日志使得文件系统可以快速从崩溃状态恢复,因为可以“回放”log,完成任意未半完成状态(文件系统的更改信息已经写到了log中,但是还没有写到文件系统中)的操作。日志文件系统存在的问题包括两次写问题(每个操作必须写磁盘两次,一次是写到log中,另一次是写到文件系统中最终的位置)以及受限的日志空间带来的多种性能问题。此外,日志文件系统也没有改善磁盘崩溃的情况。
(3) 日志结构(Log-structured)文件系统:典型代表文件系统LFS。Log-structured文件系统在文件系统研究社区反响强烈,但是从未用于主流商业产品用途。Log-structured的主要设计思想是:首先,以log的方式将更新写出,这将一组随机写IO转换成一个大的连续的写入流,写操作更为高效;其次,整个文件就是一个巨大的连续事务log,对文件的更新直接追加到log中(解决了Journaling文件系统的两次写问题),数据的更新不会在本地覆盖写——从这个意义上看log-structured文件系统也是一种Copy-on-write(COW)文件系统。Log-structured文件系统的主要问题是系统需要大的空闲的segments磁盘空间,这些空闲的segments由“cleaner”线程创建。非完全空闲的segments中的已分配的blocks必须移出到其他的segments中。尽管对cleaner的优化进行了多年的研究,cleaner线程的开销仍然非常高。此外,计算空闲空间的总数也很困难,因为COW文件系统直到数据块的新的拷贝写入成功的时候才会释放该数据块的旧的拷贝块,而一次操作需要完成的数据块拷贝的数量是不可预测的。最后,强制重分配数据块需要在每次写操作的时候做一个“good”的分配决策,而本地更新文件系统仅需要做一次的“good”分配决策。
(4) 软更新(Soft updates)文件系统:Soft updates是对Berkeley FFS的优化,在文件系统崩溃的时候,保留磁盘上的文件系统格式数据(也就是元数据),使得无需执行fsck程序就可挂载文件系统。Soft updates仔细调整对文件系统的更新顺序,因而任意时刻文件系统发生崩溃,除去部分“leaked”(标记为已分配,实际上是空闲的)的inodes和blocks外,文件系统数据是一致的。后台fsck程序运行在文件系统的快照上,找出这些未引用的blocks并将其再次标记为空闲。Soft update是的负面影响主要是极度复杂,难于理解和实现,并且每个文件系统操作需要其自己独特设计的update代码。当前已知的仅有一个实现的soft updates实例。
(5) 写时拷贝(copy-on-write (COW))文件系统:最新趋势的文件系统架构。COW文件系统的典型代表是WAFL (Write Anywhere File Layout, Network
Appliance的内部文件系统)、ZFS以及Btrfs。这些文件系统以树的方式组织文件blocks。当一个block更新的时候,就分配一个新的block,链接block的指针指向更新后的block——当然也会引起这些指针所在的block的更新产生。当一组一致的更新写到磁盘之后,root block自动更新为指向新的blocks 树,该新的blocks树包含最新的分配信息。这种结构方式极其易于实现文件系统快照技术,而且集中了文件系统一致性代码。COW文件系统的不足之处与Log-structured文件系统相似——每次写操作要强制重分配,同时不确定完成一次更新需要多少的磁盘空间。同时,好的同步性能需要加入某种journal,使得COW文件系统的实现更复杂。
阅读(343) | 评论(0) | 转发(0) |