Linux文件系统EXT2,EXT3,ReiserFS详解


Linux文件系统EXT2,EXT3,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 等表示一个物理磁盘 。实验:
  • 查看硬盘物理参数: hdparm /dev/sda; hdparm –i /dev/had(IDE 硬盘 ) ;
  • 读入分区表信息: dd if=/dev/sda of=/tmp/mbr bs=1 count=64 skip=446 ;
  • 查看主分区表信息: od –t x1 mar ;
  • 备份主引导区信息: dd of=/dev/sda if=/dev/sda bs=512 count=1 seek=1 ;
 
2.1VFS
自从邓小平南巡讲话那年之前 VFS 投胎于 linux 以来( Mr. Linus 不愧为一个有远见的接生婆,@_@ ),VFS就一直与 Linux 形影不离,并且成了 Kernel 的一部分,在 Kernel 版本号如芝麻开花般节节攀升的同时自己也枝繁叶茂起来 。
VFS 就像一个一个默默无闻的公仆,它介于各种文件系统和用户进程之间(参见图〖一〗),一方面屏蔽下层的各种异构文件系统的个性,另一方面为上层用户提供一个统一的接口(如 open 、 read 等),同时 VFS 还提供一些文件系统没有的操作,比如,没有哪个文件系统提供了函数 lseek,此函数由 VFS 实现 。


推荐阅读