ext2文件系统了解

一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的信息。下以ext2文件系统为例说明文件在磁盘上如何存储。

一个分区ext2文件系统的总体存储布局

启动块大小确定,1KB,启动块由PC标准规定,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启动块。启动块之后才是ext2文件系统的开始,ext2文件系统将整个分区划分成若干个同样大小的块组(Block Group),每个块组都是有以下部分组成。

超级块(Super Block)

描述整个分区的文件系统信息,例如块大小、文件系统版本号、上次mount的时间等等。

超级块在每个块组的开头都有一份拷贝。

块组描述符表(GDT,Group Descriptor Table)

由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符(Group Descriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等。和超级块类似,块组描述符表在每个块组的开头也都有一份拷贝,这些信息是非常重要的,一旦超级块意外损坏就会丢失整个分区的数据,一旦块组描述符意外损坏就会丢失整个块组的数据,因此它们都有多份拷贝。通常内核只用到第0个块组中的拷贝,当执行e2fsck检查文件系统一致性时,第0个块组中的超级块和块组描述符表就会拷贝到其它块组,这样当第0个块组的开头意外损坏时就可以用其它拷贝来恢复,从而减少损失。

块位图(Block Bitmap)

一个块组中的块是这样利用的:数据块存储所有文件的数据,比如某个分区的块大小是1024字节,某个文件是2049字节,那么就需要三个数据块来存,即使第三个块只存了一个字节也需要占用一个整块;超级块、块组描述符表、块位图、inode位图、inode表这几部分存储该块组的描述信息。那么如何知道哪些块已经用来存储文件数据或其它描述信息,哪些块仍然空闲可用呢?块位图就是用来描述整个块组中哪些块已用哪些块空闲的,它本身占一个块,其中的每个bit代表本块组中的一个块,这个bit为1表示该块已用,这个bit为0表示该块空闲可用。

为什么用df命令统计整个磁盘的已用空间非常快呢?因为只需要查看每个块组的块位图即可,而不需要搜遍整个分区。相反,用du命令查看一个较大目录的已用空间就非常慢,因

为不可避免地要搜遍整个目录的所有文件。

与此相联系的另一个问题是:在格式化一个分区时究竟会划出多少个块组呢?主要的限制在于块位图本身必须只占一个块。用mke2fs格式化时默认块大小是1024字节,可以用-b参数指定块大小,现在设块大小指定为b字节,那么一个块可以有8b个bit,这样大小的一个块位图就可以表示8b个块的占用情况,因此一个块组最多可以有8b个块,如果整个分区有s个块,那么就可以有s/(8b)个块组。格式化时可以用-g参数指定一个块组有多少个块,但是通常不需要手动指定,mke2fs工具会计算出最优的数值。

inode位图(inode Bitmap)

和块位图类似,本身占一个块,其中每个bit表示一个inode是否空闲可用。

inode表(inode Table)

我们知道,一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访问时间等,也就是ls -l命令看到的那些信息,这些信息存在inode中而不是数据块中。每个文件都有一个inode,一个块组中的所有inode组成了inode表

inode表占多少个块在格式化时就要决定并写入块组描述符中,mke2fs格式化工具的默认策略是一个块组有多少个8KB就分配多少个inode。由于数据块占了整个块组的绝大部分,也可以近似认为数据块有多少个8KB就分配多少个inode,换句话说,如果平均每个文件的大小是8KB,当分区存满的时候inode表会得到比较充分的利用,数据块也不浪费。如果这个分区存的都是很大的文件(比如电影),则数据块用完的时候inode会有一些浪费,如果这个分区存的都是很小的文件(比如源代码),则有可能数据块还没用完inode就已经用完了,数据块可能有很大的浪费。如果用户在格式化时能够对这个分区以后要存储的文件大小做一个预测,也可以用mke2fs的-i参数手动指定每多少个字节分配一个inode。

数据块(Data Block)

根据不同的文件类型有以下几种情况

》对于常规文件,文件的数据存储在数据块中。

》对于目录,该目录下的所有文件名和目录名存储在数据块中,注意文件名保存在它所在目录的数据块中,除文件名之外,ls -l命令看到的其它信息都保存在该文件的inode中。注意这个概念:目录也是一种文件,是一种特殊类型的文件。

》对于符号链接,如果目标路径名较短则直接保存在inode中以便更快地查找,如果目标路径名较长则分配一个数据块来保存。

》设备文件、FIFO和socket等特殊文件没有数据块,设备文件的主设备号和次设备号保存在inode中。

现在做几个小实验来理解这些概念。例如在home目录下ls -l:

$ ls -l

total 32

drwxr-xr-x 114 akaedu akaedu 12288 2008-10-25 11:33 akaedu

drwxr-xr-x 114 ftp ftp 4096 2008-10-25 10:30 ftp

drwx------ 2 root root 16384 2008-07-04 05:58 lost+found

为什么各目录的大小都是4096的整数倍?因为这个分区的块大小是4096,目录的大小总是数据块的整数倍。为什么有的目录大有的目录小?因为目录的数据块保存着它下边所有文件和目录的名字,如果一个目录中的文件很多,一个块装不下这么多文件名,就可能分配更多的数据块

给这个目录。再比如:

$ ls -l /dev

......

prw-r----- 1 syslog adm 0 2008-10-25 11:39 xconsole

crw-rw-rw- 1 root root 1, 5 2008-10-24 16:44 zero

xconsole文件的类型是p(表示pipe),是一个FIFO文件,后面会讲到它其实是一块内核缓冲区的标识,不在磁盘上保存数据,因此没有数据块,文件大小是0。zero文件的类型是c,表示字符设备文件,它代表内核中的一个设备驱动程序,也没有数据块,原本应该写文件大小的地方写了1, 5这两个数字,表示主设备号和次设备号,访问该文件时,内核根据设备号找到相应的驱动程序。再比如:

$ touch hello

$ ln -s ./hello halo

$ ls -l

total 0

lrwxrwxrwx 1 akaedu akaedu 7 2008-10-25 15:04 halo -> ./hello

-rw-r--r-- 1 akaedu akaedu 0 2008-10-25 15:04 hello

文件hello是刚创建的,字节数为0,符号链接文件halo指向hello,字节数却是7,为什么呢?

其实7就是“./hello”这7个字符,符号链接文件就保存着这样一个路径名。再试试硬链接:

$ ln ./hello hello2

$ ls -l

total 0

lrwxrwxrwx 1 akaedu akaedu 7 2008-10-25 15:08 halo -> ./hello

-rw-r--r-- 2 akaedu akaedu 0 2008-10-25 15:04 hello

-rw-r--r-- 2 akaedu akaedu 0 2008-10-25 15:04 hello2

hello2和hello除了文件名不一样之外,别的属性都一模一样,并且hello的属性发生了变化,第二栏的数字原本是1,现在变成2了。从根本上说,hello和hello2是同一个文件在文件系统中的两个名字,ls -l第二栏的数字是硬链接数,表示一个文件在文件系统中有几个名字(这些名字可以保存在不同目录的数据块中,或者说可以位于不同的路径下),硬链接数也保存在inode中。既然是同一个文件,inode当然只有一个,所以用ls -l看它们的属性是一模一样的,因为都是从这个inode里读出来的。再研究一下目录的硬链接数:

$ mkdir a

$ mkdir a/b

$ ls -ld a

drwxr-xr-x 3 akaedu akaedu 4096 2008-10-25 16:15 a

$ ls -la a

total 20

drwxr-xr-x 3 akaedu akaedu 4096 2008-10-25 16:15 .

drwxr-xr-x 115 akaedu akaedu 12288 2008-10-25 16:14 ..

drwxr-xr-x 2 akaedu akaedu 4096 2008-10-25 16:15 b

$ ls -la a/b

total 8

drwxr-xr-x 2 akaedu akaedu 4096 2008-10-25 16:15 .

drwxr-xr-x 3 akaedu akaedu 4096 2008-10-25 16:15 ..

首先创建目录a,然后在它下面创建子目录a/b。目录a的硬链接数是3,这3个名字分别是当前目录下的a,a目录下的.和b目录下的..。目录b的硬链接数是2,这两个名字分别是a目录下的b和b目录下的.。注意,目录的硬链接只能这种方式创建,用ln命令可以创建目录的符号链接,但不能创建目录的硬链接。

转自:akaedu教材

时间: 2024-10-16 23:34:10

ext2文件系统了解的相关文章

Linux的Ext2文件系统(Inode&Block)详解

前述:Linux系统管理员很重要的任务之一就是管理好自己的磁盘文件系统,每个分区不可太大也不可以太小,太大会导致磁盘容量的浪费,太小会导致产生的文件无法存储的问题.在Linux里面文件是由两部分数据组成,一部分是metadata,另一部分是data.那么这些数据都存放在文件系统的什么地方呢?这就让我们必须得了解文件系统的Inode与Block的基本原理了,而Linux最传统的磁盘文件系统使用的是Ext2,所以我们了解下它的内部原理. 第一部分:磁盘的组成和分区(基础) 磁盘的机械部分: 1.圆形

Linux 下EXT2文件系统 —— 如何将蚂蚁和大象优雅的装进冰箱里

这一阵子真是偷懒,无时无刻不和自己身体中的懒癌做斗争.最终我还是被打败了,星期天两天几乎都是荒废过去的,在空闲的时候实际上我内心也是有点焦虑的,不知道去怎么度过这时间.学习吧又不想学习,看电视娱乐吧也没有心情.在这种状态中,我度过了星期天,到了今天我才趴在窗扇看了一会linux.这一部分之前也看过,不过是走马观花式的看,并没有投入精力.今天看了下,发现其实windows的文件系统和linux还是有很多不同的.从设计的角度上,linux的文件系统似乎更加聪明,看完这部分,我也更喜欢linux了.

ext2文件系统

文件系统特性: 磁盘分区完毕后还需要进行格式化,因为每个操作系统所设定的文件属性.权限并不相同.比如Windows98是采用的FAT或FAT16,Windows2000后才有了NTFS,Linux正统系统则为ext2这一个. 传统的磁盘与文件系统之应用中,一个分割槽(partition)只能够被格式化成为一个文件系统,但由于新技术的产生,比如LVM.磁盘列阵(software RAID),这些技术能够将一个分割槽格式化为多个文件系统(例如LVM),也能将多个分割槽格式化为一个系统. 文件系统之运

chapter8:Linux磁盘与文件系统管理之(1)认识Ext2文件系统

8.1认识EXT2文件系统 8.1.1 硬盘的组成与分区 8.1.2 文件系统的特性 8.1.3 Ext2文件系统(inode) 8.1.4   与目录树的关系 8.1.5   Ext2/Ext3文件的访问与日志功能 8.1.6    Linu文件系统的操作 8.1.7    挂载点 8.1.8    其它Linux支持的文件系统与VFS

Linux 文件系统及 ext2 文件系统

linux 支持的文件系统类型 Ext2: 有点像 UNIX 文件系统.有 blocks,inodes,directories 的概念. Ext3: Ext2 的加强版,添加了日志的功能.支持 POSIX ACL(Access control Lists,访问控制列表) . Isofs(iso9660): CDROM 文件系统. Sysfs:  基于 ram 的文件系统,起始于 ramfs.用于导出终端用户可以简便使用的内核对象(kernel objects). Procfs: proc 文件系

EXT2 文件系统

对文件系统而言,文件仅是一系列可读写的数据块.文件系统并不需要了解数据块应该放到物理介质上什么位置.这些都是设备驱动的任务.无论何时,只要文件系统需要从包含它的块设备中读取信息或数据,它就将请求底层的设备驱动读取一个基本块大小整数倍的数据块.EXT2文件系统将它所使用的逻辑分区划分成数据块组.每个数据块组都将那些对文件系统完整性最重要的信息复制出来,同时将实际文件盒目录看做信息与数据块. 罗即文件系统管理的是一个逻辑空间,这个逻辑空间就像一个大的数组,数组的每个元素就是文件系统操作的基本单位——

ext2文件系统寻址

ext2 文件系统相关介绍:ext2文件系统,一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规.目录.符号链接等),权限,文件大小,创建/修改/访问时间等,也就是ls -l命令看到的那些信息,这些信息存在inode中而不是数据块中.但是文件名存在哪里,首先文件名不是存在inode中的,那么文件名存在哪里? 这里我们可以看到目录大小都为4096,当你创建一个目录的时候操作系统会为其分配一个块(4096),文件名也就是存在目录文件中,值得说明的是:当文件的目录下文件很多的时候

mke2fs 制作ext2文件系统image

方法1: 利用/dev/ram1: linux下有很多ram,我们用ram1,首先把ram1格式化成ext2文件系统[[email protected] babylinux]#   sudo mkfs.ext2 -m0 /dev/ram1将ram1挂装到文件系统中:先建立一个挂装点:#mkdir /mnt/ram挂上ram1:# sudo mount /dev/ram1 /mnt/ram将先前做好的rootfs根文件系统拷贝到ram1上.# sudo cp -R dist/* /mnt/ram/

深入解析ext2文件系统之mke2fs

上一遍博文的重点其实将ext2整体的组织框架,我们知道了ext2文件系统由块组组成,每个块组里面的组织形式.我们甚至直接把超级块和组描述符里面的内容,用十六进制形式展现了出来.这篇博文主要讲述如何mke2fs生成合适需要的ext2 文件系统,基本就是参数选择的问题. mke2fs 常用的几个参数有:       1)    -b     block-size .       块大小是ext2文件系统比较重要的一个参数,目前只支持1024.2048和4096.上篇博文讲到了其中的一点,就是块大小决

深入解析 ext2 文件系统

很久以来,就想写一篇关于ext 家族文件系统的文章,源于我刚工作的时候,曾经一不小心rm -rf,误删除了很多文件,当时真想有个数据恢复软件能帮我把数据回复了.当然学习数据恢复,首先要学习文件系统.最近工作原因,好长时间没看学习Linux kernel 相关的东西,感觉面目可憎.扯远了,开始我们的ext2 文件系统的探索之旅. 那些介绍ext2特征的套话我就不说了,任何一本靠谱的linux教程中都可以找到,我们直接单刀直入,开始探索. 首先生成一个ext2文件系统.我在我磁盘空间有限的Ubunt