Linux上三个主要文件系统(EXT2、EXT3和ReiserFS)介绍
【摘 要】 如何把数据存放在存储设备上?又如何访问这些数据?这是文件系统必须回答的两个问题。现代文件系统种类繁多,良莠不齐。这些文件系统各有什么特征?有什么优缺点?适用的环境是什么?本文将详细介绍基于Linux系统的三个主要文件系统:ext2、ext3和ReiserFS。
Introducing The Three Main FileSystems (ext2, ext3 and ReiserFS) on Linux
【ABSTRACT】How to store data on storage devices? How to access these data which settle on storage devices? These two questions are just what the file system should answer. There are many sort of file systems on the fly, among which, some are better than others. What characteristics do they have respectively? And what advantages and disadvantages do they inherit? And which environment are they suitable for?The paper will discuss three popular file systems which are used widely on Linux operating system, they are ext2, ext3 and ReiserFS.
1 简介
文件系统是解决如何在存储设备上存储数据的一套方法,包括存储布局、文件命名、空间管理、安全控制等。Linux操作系统支持很多现代的流行文件系统,其中ext2、ext3和ReiserFS最普遍。ext2文件系统是伴随着linux一起发展起来的,在ex2的基础上增加日志就是ext3,这两个文件系统可以很容易的转换而不必重新格式化存储介质,它们是linux特有的。ReiserFS可以说是后起之秀了,最初它不是用于linux,所以对linux来说它是一个泊来品。ReiserFS采用了一个非常先进的新颖算法,最新的4版本真正做到了文件系统操作的原子性(类似数据库事务操作的原子性),据官方报道,ReiserFS“原子性”算法优于现代数据库的“原子性”算法,做到了空间和时间复杂度的双优!一个文件系统能做到这个份上,我算是彻底服了:-)。
现代Linux系统继续采用了早期(1992年前)发展的虚拟文件系统(Virtual File System,简写为VFS)理念,VFS是一个介于用户和实际文件系统之间,为用户提供了一个统一的编程接口,尽管处于其之下的各种文件系统类型千差万别,但对最终用户来说却是一样的。例如当用户张三输入命令cd /data后,他并没有意识到自己刚从ext3文件系统进入ReiserFS文件系统,他仍然使用命令ls –l列出当前目录下的所有文件,而且显示格式也是一样,但是幕后英雄VFS可忙坏了,它不得不启动一个算法找到ReiserFS文件系统提供的接口函数并调用它们,要知道ReiserFS提供的一套函数可不同于ext3的那一套。得益于VFS,其他文件系统可以采用“热插拔”的非常简便的方式加入或退出Linux操作系统,例如当第一次mount一个文件系统A时,相应地就把该文件系统对应的模块装载到内核(假设没有被直接编译进内核),当最后把文件系统A对应的设备umount时,对应的模块被卸载出去。
2 原理
LINUX的文件系统可以追溯到八十年代末的Minix文件系统,而Minix文件系统具有几个明显的缺点:文件系统不能超过64M,目录只能存放固定数目的文件,文件名长度不能超过14个字符,文件尺寸小于64M。之后由于继续沿袭传统技术,尽管linux的标准文件系统依次经历了VFS(1992年前)、ext(1992年)、ext2(1993年)和最新的ext3这一系列文件系统的传种接代,但“基因”没变,只不过新一代都是改进前一代的不足,或者加入一些新东东而已。但由于Linux几乎在一开始就引入VFS的概念(我个人认为非常英明^O^),Linux对其他第三方文件系统都是包容的,目前几乎所有先进的文件系统都支持,其中著名的ReiserFS已经成了Novell的SuSe Linux发行版的缺省文件系统,但也由于IT界最臭名昭著的四字经“向后兼容”的要求,今日各种linux发行版中存在过多地包容早已经落伍的文件系统的现象,比如Minix、FAT等,但对于一个富有理论和经验的系统管理员来说,所有的这些“累赘”都可以在弹指间一一化解。
下面我们先看看一块物理硬盘是如何分区的。三个主要的参数是柱面数、磁头数和每磁道扇区数,起始编号分别为0、0和1,0柱面0磁头1扇区是主引导分区,上面存放引导代码和四个主分区表(如果一个物理硬盘多于4个,那么就放在扩展分区),0柱面0磁头上的其他扇区保留,真正的分区是从0柱面1磁头1扇区开始的。在linux中,用/dev/had、/dev/hdb、/dev/sda、/dev/sdc等表示一个物理磁盘。实验:
1). 查看硬盘物理参数:hdparm /dev/sda; hdparm –i /dev/had(IDE硬盘);
2). 读入分区表信息:dd if=/dev/sda of=/tmp/mbr bs=1 count=64 skip=446;
3). 查看主分区表信息:od –t x1 mar;
4). 备份主引导区信息:dd of=/dev/sda if=/dev/sda bs=512 count=1 seek=1;
2.1 VFS
自从邓小平南巡讲话那年之前VFS投胎于linux以来(Mr. Linus不愧为一个有远见的接生婆,@_@),VFS就一直与Linux形影不离,并且成了Kernel的一部分,在Kernel版本号如芝麻开花般节节攀升的同时自己也枝繁叶茂起来。
VFS就像一个一个默默无闻的公仆,它介于各种文件系统和用户进程之间(参见图〖一〗),一方面屏蔽下层的各种异构文件系统的个性,另一方面为上层用户提供一个统一的接口(如open、read等),同时VFS还提供一些文件系统没有的操作,比如,没有哪个文件系统提供了函数lseek,此函数由VFS实现。
Kernel中存在一个全局指针变量file_systems,该变量指向一个元素类型为file_system_type的链表,当mount一个文件系统时装载对应的模块,而装载模块时触发的行为register_filesystem()会生成一个file_system_type结构并把它挂接到file_systems链表上,也就是说所有的已经mount的文件系统都挂在这个链表上,file_system_tpe结构中有一个指向超级块结构的指针,存储介质上的超级块在设备mount时被读入内存,直到umount时从内存中删除。
图〖一〗VFS在内核中的地位
2.2 EXT2和EXT3
EXT2是linux上标准的文件系统,EXT3是在EXT2基础上增加日志形成的,其思想还是可以追溯到早期UNIX家族发展的基于超级块和inode的经典概念。/dev/sda#n表示/dev/sda硬盘上的第#n个分区,如果一个分区备格式化为ext2或ext3文件系统,那么整个分区的布局如图〖二〗所示:
图〖二〗:EXT2文件系统分区结构
分区上的扇区是从0开始编号的,每个扇区512bytes,一个块(block)大小一般是1k、2k、3k和4k,具体大小可在创建文件系统时指定,如果不指定块大小那么会根据分区的大小自动相应选择一个。分区开始的1024bytes存放引导程序boot,接下来的1024bytes存放超级块super block,组描述字group descriptors起始于一个新块,并单独占用一个块空间,之后的所有块被组织成块组,块组才是真正存放文件的场所。超级块含有整个文件系统的一些全局参数,如:卷名、全局唯一标识符、状态、块大小、总块数、每组inode数,总i节点数、每组块数等等,super block在文件mount时被读入内存,直到umount时被释放,由于超级块对于文件系统来说至关重要,所以超级块一般在第1、3、5、7和9组的首块中存有副本。
实验:
1). 创建一个ext2文件系统:mke2fs –c –c –L “Test Filesystem” /dev/sda2;
2). 查看ext2分区开始部分的信息:od –t x1 /dev/sda2 | more;其中“aa55”之前的为boot,含有魔数“ef53”的区域为super block;
3). 查看超级块中的内容:tune2fs –l /dev/sda2;例子见附件1。
4). 查看详细的块组信息:dumpe2fs –x /dev/sda2;例子见附件2。
一个块组描述字占用32个字节,其中三个主要指针分别指到到这个块组的i节点表、i节点位图和块位图。块组的设计是为了拉近inode和它的数据块的距离,这样就可以提高磁盘存取性能,一个块组的具体结构示意图见图〖二〗右边部分。
inode是EXT2文件系统的精华,一个inode对应一个文件,inode编号是全局性的,从1开始,描述参考图〖三〗。
inode中存放文件的一些重要属性,如权限、文件大小、访问时间、修改时间、创建时间、文件属主ID、组ID、块数等。Inode包含15个指针,前12个直接指向数据块,后三个依次是一次间接、二次间接和三次间接指向数据块。
文件系统的目录不同于普通文件的结构,是一种固定格式的文件,里面的每一个条目代表目录中的一个文件,示意图见图〖四〗。
图〖四〗:目录条目示意图
在ext2文件系统上增加一个特殊的inode(日志文件),用于记录文件系统元数据的变化,即日志journal,这就是EXT3文件系统。Ext3这种粗糙的实现日志的文法付出了很大的代价:写两次!
实验:ext2和ext3文件系统之间的转换(不需要重新格式化)
1). ext2转换成ext3文件系统:tune2fs –j /dev/sda2;如果sda之前已经mount,那么该命令执行完后在顶层目录创建了一个不能删除和dump的日志文件.journal,机器重启或umount且e2fsck后该文件将被改变成隐藏的特殊日志文件inode。如果/dev/sda2是启动时自动mount的,那么还需手工修改/etc/fstab中/dev/sda2所对应的文件系统类型,否则还是按ext2类型mount和使用。
2). ext3转换成ext2文件系统:umount /dev/sda2; tune2fs –O ^has_journal /dev/sda2; e2fsck –y /dev/sda2; mount –t ext2 /dev/sda2 /mnt; 对于自动mount的设备还需修改/etc/fstab。
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 综合评价
Ext2在linux上使用已经有很长的历史了,市面上已经出现了 针对 Windows 和 Mac OS X 的 ext2 驱动器,允许您直接从这些操作系统中读取和写入ext2 文件系统,这使它成为了共享设备(如移动硬盘)极好的格式。另外Ext2还积累了可观的人气,与ext3和ReiserFS相比尽管存在更多的不足,但毕竟成了许多it人士的习惯,而且正在许多机器上跑着,尽管跑得有点艰难,想让其在短时间内从我们眼中消失是不可能的,这一点还真有点类似windows桌面!有人说ext3与ext2的唯一区别就是前者在后者的基础上增加了日志功能,这话有点偏激。Ext3的日志模式有三种,在mount时指定,journal模式日志功能同时作用于数据和元数据,写操作有点令人难以忍受(如果再在其上跑大型数据库,我敢肯定那一定是一个蹩脚的系统管理员干的^O^),ordered模式只对文件系统元数据的变化记录日志(数据先写入磁盘,然后元数据写入日志),它只对文件系统的完整性负责,而不顾用户数据,在这种模式下跑数据库效果不错,由数据库负责数据的完整性,双方各司其责,配合完美,writeback模式不能保证数据先于元数据写入磁盘,因此可能存在元数据已经更新但数据没有更新的情况,传言这是三种模式中最快的。
先进的日志机制、几乎0%的磁盘碎片、支持海量存储和无限CPU、轻松管理上亿的文件、“光速”小文件访问速度,快速的自修复功能,启动X Window比ext2/3快30%以上,……,这就是目前ReiserFS 3.6给人留下的深刻影响。刚刚发布的ReiserFS 4更是绝,Benchmark结果几乎样样领先,ReiserFS 4加入kernel只是时间问题。据ReiserFS 4追随者感叹,你一旦使用它,想破坏文件系统也难。
4 选择
面对如此众多的文件系统和一个具体的应用环境,我们该如何选择一个更好的文件系统呢?首先要了解各种文件系统的特性,其次是了解自己应用环境的特征。
建议把/tmp和/var从/中独立出来,单独放在两个分区上。目录/tmp/中存放运行过程中产生的临时文件,且系统一般会不定期删除它们,临时文件的重要程度又不高,而/tmp下的文件删除和生成频繁,因此建议采用文件系统ext2比较好;/var目录记录系统日志、邮件、假脱机打印文件和任务脚本等信息,而且里面的文件主要是只生成不删除,重要程度较高,建议采用journal日志模式的ext3文件系统(充分利用日志功能、文件只增功能、ACL功能等);如果是桌面应用,/opt也应该建立在独立的设备上,由于/opt目录中一般安装各种应用软件,读写比较频繁,因此很容易导致文件不连续存放,而且桌面用户特别在意应用的启动、使用和退出的速度,所以选择ordered日志模式的ReiserFS文件系统是比较明智的;根目录对于系统的重要程度是不言而喻的,系统文件一般是一次安装永久使用,且涉及大量的小的配置文件,不管是桌面还是server,把根建立在ReiserFS文件系统上是一个不错的选择,且最好以journal模式mount根文件系统;对于涉及一些大数据文件操作的应用,诸如数据库、domino等,应建立在单独的文件系统上,且选择ext3文件系统最佳,如果应用本身具有日志功能(如oracle),注意一定要以ordered日志模式mount分区,如果应用没有日志机制且数据又非常重要,那么建议以journal模式mount分区,其他情况应以wrtiteback模式mount;至于文件服务之类的应用,那就选择ReiserFS吧,虽然难说是最好的选择,但至少是不坏的选择!
由于ext2是按块组来组织磁盘空间的,一个块组内含有inode和对应的数据,这样就拉近了inode和数据块之间的距离,有利于提高磁盘数据的访问速度。因此对于可人为控制文件大小的情况,比如oracle的数据文件的安排,那么应该一次性地分配足够多的goup(整数倍),以后也按group的整数倍增加。
分析是历史的,事物是发展的,我更看好ReiserFS的未来,让我们拭目以待吧。
附件1:
#tune2fs –l /dev/sda2
tune2fs 1.38 (30-Jun-2005)
Filesystem volume name:
Last mounted on:
Filesystem UUID: dc95688e-102b-4db8-9083-61504bb5039e
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal filetype needs_recovery sparse_super
Default mount options: (none)
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 7340032
Block count: 7337984
Reserved block count: 366899
Free blocks: 6540458
Free inodes: 7214741
First block: 0
Block size: 4096
Fragment size: 4096
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 32768
Inode blocks per group: 1024
Filesystem created: Fri Jul 14 21:25:45 2006
Last mount time: Mon Aug 21 15:37:49 2006
Last write time: Mon Aug 21 15:37:49 2006
Mount count: 1
Maximum mount count: 500
Last checked: Mon Aug 21 15:34:27 2006
Check interval: 5184000 (2 months)
Next check after: Fri Oct 20 15:34:27 2006
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Journal inode: 8
First orphan inode: 655363
Default directory hash: tea
Directory Hash Seed: 34aeb113-401e-46df-a65b-f1000855cdbe
Journal backup: inode blocks
附件2:
#dumpe2fs –x /dev/sda2
Group 0: (Blocks 0x0001-0x2000)
Primary superblock at 0x0001, Group descriptors at 0x0002-0x0002
Block bitmap at 0x0003 (+2), Inode bitmap at 0x0004 (+3)
Inode table at 0x0005-0x00e4 (+4)
7951 free blocks, 1781 free inodes, 2 directories
Free blocks: 0x00f2-0x2000
Free inodes: 0x000c-0x0700
Group 1: (Blocks 0x2001-0x4000)
Backup superblock at 0x2001, Group descriptors at 0x2002-0x2002
Block bitmap at 0x2003 (+2), Inode bitmap at 0x2004 (+3)
Inode table at 0x2005-0x20e4 (+4)
7964 free blocks, 1792 free inodes, 0 directories
Free blocks: 0x20e5-0x4000
Free inodes: 0x0701-0x0e00
Group 2: (Blocks 0x4001-0x6000)
Block bitmap at 0x4001 (+0), Inode bitmap at 0x4002 (+1)
Inode table at 0x4003-0x40e2 (+2)
7966 free blocks, 1792 free inodes, 0 directories
Free blocks: 0x40e3-0x6000
Free inodes: 0x0e01-0x1500
Group 3: (Blocks 0x6001-0x8000)
Backup superblock at 0x6001, Group descriptors at 0x6002-0x6002
Block bitmap at 0x6003 (+2), Inode bitmap at 0x6004 (+3)
Inode table at 0x6005-0x60e4 (+4)
7964 free blocks, 1792 free inodes, 0 directories
Free blocks: 0x60e5-0x8000
Free inodes: 0x1501-0x1c00
Group 4: (Blocks 0x8001-0xa000)
Block bitmap at 0x8001 (+0), Inode bitmap at 0x8002 (+1)
Inode table at 0x8003-0x80e2 (+2)
7966 free blocks, 1792 free inodes, 0 directories
Free blocks: 0x80e3-0xa000
Free inodes: 0x1c01-0x2300
Group 5: (Blocks 0xa001-0xc000)
Backup superblock at 0xa001, Group descriptors at 0xa002-0xa002
Block bitmap at 0xa003 (+2), Inode bitmap at 0xa004 (+3)
Inode table at 0xa005-0xa0e4 (+4)
7964 free blocks, 1792 free inodes, 0 directories
Free blocks: 0xa0e5-0xc000
Free inodes: 0x2301-0x2a00
Group 6: (Blocks 0xc001-0xc34f)
Block bitmap at 0xc001 (+0), Inode bitmap at 0xc002 (+1)
Inode table at 0xc003-0xc0e2 (+2)
621 free blocks, 1792 free inodes, 0 directories
Free blocks: 0xc0e3-0xc34f
Free inodes: 0x2a01-0x3100
附件3:ACL演练
(/* ACL覆盖UGO,ACL的user权限覆盖ACL的group权限)
1) 创建一个演练环境: root#cd /tmp; dd if=/dev/zero of=abc bs=1024 count=40000; losetup /dev/loop0 /tmp/abc; mkreiserfs –l testACLs /dev/loop0; mount –t reiserfs –o acl /dev/loop0 /mnt; cd /mnt; touch file1; groupadd test; useradd –m –s /bin/bash –d /home/abc –p abc –g test abc;
2) root#ls –l
-rw-r--r-- 1 root root 1072 Aug 30 00:16 file1
#getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r--
3) abc$cd /mnt; l / > file1
-bash: file1: Permission denied
4) root#setfacl –m u:abc:rw file1; ls –l file1
-rw-rw-r--+ 1 root root 1072 Aug 30 00:16 file1
root#getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:abc:rw-
group::r--
mask::rw-
other::r--
5) abc$ l / > file1
6) root# setfacl –b file1
7) root# setfacl –m g:test:rw file1
8) abc$ l / > file1
9) root# setfacl –b file; setfacl –m u:abc:r, g:test:w file1;
10) abc$ l / > file1
-bash: file1: Permission denied
11) root# setfacl –b file; chgrp test file1; chmod g=w file1; setfacl –m u:abc:r file1
12) abc$ l / >> file1
-bash: file1: Permission denied
13) 清理现场:root#cd /; userdel abc; rm –ef /home/abc; groupdel test; umount /mnt; losetup –d /dev/loop0; rm –f /tmp/abc
14) 参考资料:
1. www.namesys.com
2. Linux日志文件系统及性能分析(组图). 2008-08-14
3. Design and Implementation of the Second Extended Filesystem.
4. Virtual file system Part 1/2
5. ReiserFS 3.6 源码