Linux上三个主要文件系统(EXT2、EXT3和ReiserFS)介绍--(中)

2.3               ReiserFS 3.6
在香港回归那年, Hans Reiser 把他的基于平衡树结构( ReiserFS 3.6 采用 B*tree B*Tree 查询速度比 B+Tree 要快很多, 最近发布的 ReiserFS 4 采用独特的舞蹈树结构)的 ReiserFS 文件系统公布在网上,此后, ReiserFS 文件系统一直在 Hans Reiser 领导的开发小组下开发和发展。 ReiserFS 是一个完全不同于 ext2/ext3 的文件系统,日志功能只针对于文件系统的元数据。由于其采用先进的日志机制,且空间复杂度和时间复杂度都优于诸如 ext2 等其他文件系统, 性能直逼高档 unix (如 AIX )上的高级文件系统, 所以 迅速走红(目前得到许多 linux 发行商的支持,而 SuSe linux 干脆直接把它作为缺省安装的文件系统)。 ReiserFS 那帮狂热的维护者每一次升级都会为我们带来惊喜,正是这种跨越式的发展使得 ReiserFS 几乎抛弃了那个臭名昭著的 向后兼容 的理念,每一次的升级都必须重新格式化分区,这成了受他人***的唯一理由(我冤枉啊 !_! )。
ReiserFS  是根据面向对象的思想设计的,由语义层( semantic layer) 和存储层( storage layer) 组成。语义层主要是对对象命名空间的管理及对象接口的定义,以确定对象的功能。存储层主要是对磁盘空间的管理。语义层与存储层是通过键( key )联系的。语义层通过对对象名进行解析生成键,存储层通过键找到对象在磁盘上存储空间,键值是全局唯一的。
目前正在使用的是 ReiserFS 3.6 版本,在 32 位机器上最大可支持 2^32-4 个对象,每个对象包含一个对象 ID 和一个键。 ReiserFS3.6 文件系统分区的物理布局是这样的:首先余留 64k (全清 0 ),然后依次是 super block (占用 1block )、位图块( 1block )、日志(如果日志和数据同在一个设备上,缺省大小为 8193blocks )、根和其他节点区(参考图〖五〗)。缺省块大小是 4k ,开始时树高为 2 3.6 版树高不能超过 5
 
保留 (64k)
超级块 (1block)
位图 (>0block)
日志 (<8193blocks)
非根节点区
图〖五〗: ReiserFS 文件系统分区物理布局
B+Tree 的内部节点(占一个磁盘块)定义如下:
一些小文件( <4KB )直接存放在内部节点中,而大文件存放在叶子节点。
B+Tree 的叶子节点(占若干磁盘块)的结构如下:
对于具体的定义清阅读源代码,这里不做深入分析。
如果日志放在其他设备上,那么数据设备上就没有日志区,而根块就紧接着位图块存放。假如一块等于 4k ,那么超级块放在第 16 块(块编号从 0 开始),位图从第 17 块开始存放,紧接着是根。
ReiserFS 超级块类似于 ext2 的超级块,里面含有整个文件系统的重要参数,如文件系统总块数、空闲块数、根所在的块号、日志起始块和大小、块大小、魔数(缺省日志设备 ReIsEr2Fs ,单独日志设备 ReIsEr3Fs )、文件系统状态、树高、位图所占块数等等。
ext3 一样, ReiserFS 也有三种日志模式,即 journal,ordered,writeback 。同时, ReiserFS 引入了两种日志优化方法: copy-on-capture steal-on-capture copy-on-capture: 当一个事务要修改的块在另一个未提交的事务中时,就把这个块复制一份,这样这两个事务就可以并发进行了。 steal-on-capture :当一个块被多个事务修改时,只有最晚提交的那个事务才把这个块实际写入文件系统,其他事务都不写这个块。
最近发布的 ReiserFS 4 更是给人带来了许多令人炫目的创新,比如采用舞蹈树算法进一步把性能推向极至,引入文件系统调用的原子性首次把文件系统操作带入类似于数据库的 ACID Atomiccity Consistency Isolation Durability )领域(将来可能想破坏文件系统也难 (-: ),在同一时刻既可以把一个对象当作一个文件访问又可以视为一个目录给苛刻的用户带来无限自由,小文件捆绑存储导致近乎 0% 的磁盘碎块,内置磁盘写加密和压缩功能的想法近乎疯狂,漫游( wandering )日志法的运用从此不再 写两次 ,支持无数个 CPU ,支持插件, 通过刷新分配 (allocate-on-flush) 实现磁盘布局动态优化, ……
实验:
1).       生成一个 100M 文件: dd if=/dev/zero of=/tmp/hda bs=1024 count=100000;
2).       与回环设备建立链接: losetup /dev/loop0 /tmp/hda;
3).       创建文件系统: mkreiserfs –l TestingReiserFs /dev/loop0;
4).       查看超级块内容: reiserfstune /dev/loop0;
5).       查看物理布局: od –t x2 /dev/loop0 | more;
6).       生成一个 10M 文件: dd if=/dev/zero of=/tmp/hdb bs=1024 count=10000;
7).       与回环设备建立联系: losetup /dev/loop1 /tmp/hdb;
8).       创建文件系统: mkreiserfs –l TestingReiserFs –j /dev/loop1 /dev/loop0;
9).       查看超级块内容: reiserfstune /dev/loop1 /dev/loop0;
10).    清除现场: losetup –d /dev/loop0;losetup –d /dev/loop1;rm –f /tmp/hd[a,b];
 
3           特征
3.1               特性比较表
特性
Ext2
Ext3
ReiserFS(不受oracle支持)
分区大小
60KB~4TB
1MB~32TB
33MB~16TB
文件大小
0~4GB
0~2TB
0~8TB
块大小
1KB~4KB
1KB~4KB
512b~8KB
文件名长度
255
255
255
支持超大型目录
×
×
(百万以上)
日志功能
×
ACL支持
稳定性
优秀
一般
一般
undelete功能
×
windows兼容性
×
×
修复速度
非常快
磁盘配额
×
支持不可变文件
×
注:Kernel 2.6开始增加了ACL支持,当用mount设备时如果加参数-o acl则开启相应文件系统的ACL支持,例如mount –t reiserfs –o acl /dev/sda2 /mnt。在Linux系统上能使用ACLs是许多linux管理员期盼已久的。
3.2         综合评价
Ext2linux上使用已经有很长的历史了,市面上已经出现了针对 Windows Mac OS X ext2 驱动器,允许您直接从这些操作系统中读取和写入 ext2 文件系统,这使它成为了共享设备(如移动硬盘)极好的格式。另外Ext2积累了可观的人气,与ext3ReiserFS相比尽管存在更多的不足,但毕竟成了许多it人士的习惯,而且正在许多机器上跑着,尽管跑得有点艰难,想让其在短时间内从我们眼中消失是不可能的,这一点还真有点类似windows桌面!有人说ext3ext2的唯一区别就是前者在后者的基础上增加了日志功能,这话有点偏激。Ext3的日志模式有三种,在mount时指定,journal模式日志功能同时作用于数据和元数据,写操作有点令人难以忍受(如果再在其上跑大型数据库,我敢肯定那一定是一个蹩脚的系统管理员干的^O^),ordered模式只对文件系统元数据的变化记录日志(数据先写入磁盘,然后元数据写入日志),它只对文件系统的完整性负责,而不顾用户数据,在这种模式下跑数据库效果不错,由数据库负责数据的完整性,双方各司其责,配合完美,writeback模式不能保证数据先于元数据写入磁盘,因此可能存在元数据已经更新但数据没有更新的情况,传言这是三种模式中最快的。
先进的日志机制、几乎0%的磁盘碎片、支持海量存储和无限CPU、轻松管理上亿的文件、光速小文件访问速度,快速的自修复功能,启动X Windowext2/330%以上,……,这就是目前ReiserFS 3.6给人留下的深刻影响。刚刚发布的ReiserFS 4更是绝,Benchmark结果几乎样样领先,ReiserFS 4加入kernel只是时间问题。据ReiserFS 4追随者感叹,你一旦使用它,想破坏文件系统也难。