EXT2文件系统Word格式.docx

上传人:b****6 文档编号:17649514 上传时间:2022-12-07 格式:DOCX 页数:28 大小:744.04KB
下载 相关 举报
EXT2文件系统Word格式.docx_第1页
第1页 / 共28页
EXT2文件系统Word格式.docx_第2页
第2页 / 共28页
EXT2文件系统Word格式.docx_第3页
第3页 / 共28页
EXT2文件系统Word格式.docx_第4页
第4页 / 共28页
EXT2文件系统Word格式.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

EXT2文件系统Word格式.docx

《EXT2文件系统Word格式.docx》由会员分享,可在线阅读,更多相关《EXT2文件系统Word格式.docx(28页珍藏版)》请在冰豆网上搜索。

EXT2文件系统Word格式.docx

__le32s_free_inodes_count;

//未使用的inode的总数

__le32s_first_data_block;

//块ID,在小于1KB的文件系统中为0,大于1KB的文件系统中为1

__le32s_log_block_size;

//用以计算块的大小(1024算术左移该值即为块大小)

__le32s_log_frag_size;

//用以计算段大小(为正则1024算术左移该值,否则右移)

__le32s_blocks_per_group;

//每个块组中块的总数

__le32s_frags_per_group;

//每个块组中段的总数

__le32s_inodes_per_group;

//每个块组中inode的总数

__le32s_mtime;

//POSIX中定义的文件系统装载时间

__le32s_wtime;

//POSIX中定义的文件系统最近被写入的时间

__le16s_mnt_count;

//最近一次完整校验后被装载的次数

__le16s_max_mnt_count;

//在进行完整校验前还能被装载的次数

__le16s_magic;

//文件系统标志,ext2中为0xEF53

__le16s_state;

//文件系统的状态

__le16s_errors;

//文件系统发生错误时驱动程序应该执行的操作

__le16s_minor_rev_level;

//局部修订级别

__le32s_lastcheck;

//POSIX中定义的文件系统最近一次检查的时间

__le32s_checkinterval;

//POSIX中定义的文件系统最近检查的最大时间间隔

__le32s_creator_os;

//生成该文件系统的操作系统

__le32s_rev_level;

//修订级别

__le16s_def_resuid;

//报留块的默认用户ID

__le16s_def_resgid;

//保留块的默认组ID

//仅用于使用动态inode大小的修订版(EXT2_DYNAMIC_REV)

__le32s_first_ino;

//标准文件的第一个可用inode的索引(非动态为11)

__le16s_inode_size;

//inode结构的大小(非动态为128)

__le16s_block_group_nr;

//保存此超级块的块组号

__le32s_feature_compat;

//兼容特性掩码

__le32s_feature_incompat;

//不兼容特性掩码

__le32s_feature_ro_compat;

//只读特性掩码

__u8s_uuid[16];

//卷ID,应尽可能使每个文件系统的格式唯一

chars_volume_name[16];

//卷名(只能为ISO-Latin-1字符集,以'

\0'

结束)

chars_last_mounted[64];

//最近被安装的目录

__le32s_algorithm_usage_bitmap;

//文件系统采用的压缩算法

//仅在EXT2_COMPAT_PREALLOC标志被设置时有效

__u8s_prealloc_blocks;

//预分配的块数

__u8s_prealloc_dir_blocks;

//给目录预分配的块数

__u16s_padding1;

//仅在EXT3_FEATURE_COMPAT_HAS_JOURNAL标志被设置时有效,用以支持日志

__u8s_journal_uuid[16];

//日志超级块的卷ID

__u32s_journal_inum;

//日志文件的inode数目

__u32s_journal_dev;

//日志文件的设备数

__u32s_last_orphan;

//要删除的inode列表的起始位置

__u32s_hash_seed[4];

//HTREE散列种子

__u8s_def_hash_version;

//默认使用的散列函数

__u8s_reserved_char_pad;

__u16s_reserved_word_pad;

__le32s_default_mount_opts;

__le32s_first_meta_bg;

//块组的第一个元块

__u32s_reserved[190];

};

块组描述符表(GDT,GroupDescriptorTable)

由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符。

每个块组描述符(GroupDescriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等。

和超级块类似,块组描述符表在每个块组的开头也都有一份拷贝,这些信息是非常重要的,一旦超级块意外损坏就会丢失整个分区的数据,一旦块组描述符意外损坏就会丢失整个块组的数据,因此它们都有多份拷贝。

通常内核只用到第0个块组中的拷贝,当执行e2fsck检查文件系统一致性时,第0个块组中的超级块和块组描述符表就会拷贝到其它块组,这样当第0个块组的开头意外损坏时就可以用其它拷贝来恢复,从而减少损失。

存放于超级块所在块的下一个块中。

一个块组描述符的结构如下:

structext2_group_desc

{

__le32bg_block_bitmap;

//块位图所在的第一个块的块ID

__le32bg_inode_bitmap;

//inode位图所在的第一个块的块ID

__le32bg_inode_table;

//inode表所在的第一个块的块ID

__le16bg_free_blocks_count;

//块组中未使用的块数

__le16bg_free_inodes_count;

//块组中未使用的inode数

__le16bg_used_dirs_count;

//块组分配的目录的inode数

__le16bg_pad;

__le32bg_reserved[3];

块位图(BlockBitmap)

一个块组中的块是这样利用的:

数据块存储所有文件的数据,比如某个分区的块大小是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位图(inodeBitmap)

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

inode表(inodeTable)

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

每个文件都有一个inode,一个块组中的所有inode组成了inode表。

inode表占多少个块在格式化时就要决定并写入块组描述符中,mke2fs格式化工具的默认策略是一个块组有多少个8KB就分配多少个inode(每个inode占用多少字节?

128字节)。

由于数据块占了整个块组的绝大部分,也可以近似认为数据块有多少个8KB就分配多少个inode,换句话说,如果平均每个文件的大小是8KB,当分区存满的时候inode表会得到比较充分的利用,数据块也不浪费。

如果这个分区存的都是很大的文件(比如电影),则数据块用完的时候inode会有一些浪费,如果这个分区存的都是很小的文件(比如源代码),则有可能数据块还没用完inode就已经用完了,数据块可能有很大的浪费。

如果用户在格式化时能够对这个分区以后要存储的文件大小做一个预测,也可以用mke2fs的-i参数手动指定每多少个字节分配一个inode。

inode表用于跟踪定位每个文件,包括位置、大小等(但不包括文件名,文件名包含于dentry结构中),一个块组只有一个inode表。

一个inode的结构如下:

structext2_inode{

__le16i_mode;

//文件格式和访问权限

__le16i_uid;

//文件所有者ID的低16位

__le32i_size;

//文件字节数

__le32i_atime;

//文件上次被访问的时间

__le32i_ctime;

//文件创建时间

__le32i_mtime;

//文件被修改的时间

__le32i_dtime;

//文件被删除的时间(如果存在则为0)

__le16i_gid;

//文件所有组ID的低16位

__le16i_links_count;

//此inode被连接的次数

__le32i_blocks;

//文件已使用和保留的总块数(以512B为单位)

__le32i_flags;

//此inode访问数据时ext2的实现方式

union{

struct{

__le32l_i_reserved1;

//保留

}linux1;

__le32h_i_translator;

//“翻译者”标签

}hurd1;

__le32m_i_reserved1;

}masix1;

}osd1;

//操作系统相关数据

__le32i_block[EXT2_N_BLOCKS];

//定位存储文件的块的数组,前12个为块号,第13个为一级间接块号,第14个为二级间接块号,第15个为三级间接块号

__le32i_generation;

//用于NFS的文件版本

__le32i_file_acl;

//包含扩展属性的块号,老版本中为0

__le32i_dir_acl;

//表示文件的“HighSize”,老版本中为0

__le32i_faddr;

//文件最后一个段的地址

__u8l_i_frag;

//段号

__u8l_i_fsize;

//段大小

__u16i_pad1;

__le16l_i_uid_high;

//文件所有者ID的高16位

__le16l_i_gid_high;

//文件所有组ID的高16位

__u32l_i_reserved2;

}linux2;

__u8h_i_frag;

__u8h_i_fsize;

__le16h_i_mode_high;

__le16h_i_uid_high;

__le16h_i_gid_high;

__le32h_i_author;

}hurd2;

__u8m_i_frag;

__u8m_i_fsize;

__u16m_pad1;

__u32m_i_reserved2[2];

}masix2;

}osd2;

inode结构:

inode是EXT2基本构件,表示文件系统树型结构的节点。

EXT2文件系统中的每个文件由一个inode描述,且只能由一个inode描述。

inode与文件一起存放在外存,系统运行时,把inode写入内存建立映像,加快文件系统速度。

数据块(DataBlock)

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

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

∙对于目录,该目录下的所有文件名和目录名存储在数据块中,注意文件名保存在它所在目录的数据块中,除文件名之外,ls-l命令看到的其它信息都保存在该文件的inode中。

注意这个概念:

目录也是一种文件,是一种特殊类型的文件。

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

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

现在做几个小实验来理解这些概念。

例如在home目录下ls-l:

$ls-l

total32

drwxr-xr-x114akaeduakaedu122882008-10-2511:

33akaedu

drwxr-xr-x114ftpftp40962008-10-2510:

30ftp

drwx------2rootroot163842008-07-0405:

58lost+found

为什么各目录的大小都是4096的整数倍?

因为这个分区的块大小是4096,目录的大小总是数据块的整数倍。

为什么有的目录大有的目录小?

因为目录的数据块保存着它下边所有文件和目录的名字,如果一个目录中的文件很多,一个块装不下这么多文件名,就可能分配更多的数据块给这个目录。

再比如:

$ls-l/dev

...

prw-r-----1syslogadm02008-10-2511:

39xconsole

crw-rw-rw-1rootroot1,52008-10-2416:

44zero

xconsole文件的类型是p(表示pipe),是一个FIFO文件,后面会讲到它其实是一块内核缓冲区的标识,不在磁盘上保存数据,因此没有数据块,文件大小是0。

zero文件的类型是c,表示字符设备文件,它代表内核中的一个设备驱动程序,也没有数据块,原本应该写文件大小的地方写了1,5这两个数字,表示主设备号和次设备号,访问该文件时,内核根据设备号找到相应的驱动程序。

$touchhello

$ln-s./hellohalo

total0

lrwxrwxrwx1akaeduakaedu72008-10-2515:

04halo->

./hello

-rw-r--r--1akaeduakaedu02008-10-2515:

04hello

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

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

再试试硬链接:

$ln./hellohello2

-rw-r--r--2akaeduakaedu02008-10-2515:

04hello2

hello2和hello除了文件名不一样之外,别的属性都一模一样,并且hello的属性发生了变化,第二栏的数字原本是1,现在变成2了。

从根本上说,hello和hello2是同一个文件在文件系统中的两个名字,ls-l第二栏的数字是硬链接数,表示一个文件在文件系统中有几个名字(这些名字可以保存在不同目录的数据块中,或者说可以位于不同的路径下),硬链接数也保存在inode中。

既然是同一个文件,inode当然只有一个,所以用ls-l看它们的属性是一模一样的,因为都是从这个inode里读出来的。

再研究一下目录的硬链接数:

$mkdira

$mkdira/b

$ls-lda

drwxr-xr-x3akaeduakaedu40962008-10-2516:

15a

$ls-laa

total20

15.

drwxr-xr-x115akaeduakaedu122882008-10-2516:

14..

drwxr-xr-x2akaeduakaedu40962008-10-2516:

15b

$ls-laa/b

total8

15..

首先创建目录a,然后在它下面创建子目录a/b。

目录a的硬链接数是3,这3个名字分别是当前目录下的a,a目录下的.和b目录下的..。

目录b的硬链接数是2,这两个名字分别是a目录下的b和b目录下的.。

注意,目录的硬链接只能这种方式创建,用ln命令可以创建目录的符号链接,但不能创建目录的硬链接。

2.2. 

实例剖析请点评

如果要格式化一个分区来研究文件系统格式则必须有一个空闲的磁盘分区,为了方便实验,我们把一个文件当作分区来格式化,然后分析这个文件中的数据来印证上面所讲的要点。

首先创建一个1MB的文件并清零:

$ddif=/dev/zeroof=fscount=256bs=4K

我们知道cp命令可以把一个文件拷贝成另一个文件,而dd命令可以把一个文件的一部分拷贝成另一个文件。

这个命令的作用是把/dev/zero文件开头的1M(256×

4K)字节拷贝成文件名为fs的文件。

刚才我们看到/dev/zero是一个特殊的设备文件,它没有磁盘数据块,对它进行读操作传给设备号为1,5的驱动程序。

/dev/zero这个文件可以看作是无穷大的,不管从哪里开始读,读出来的都是字节0x00。

因此这个命令拷贝了1M个0x00到fs文件。

if和of参数表示输入文件和输出文件,count和bs参数表示拷贝多少次,每次拷多少字节。

做好之后对文件fs进行格式化,也就是把这个文件的数据块合起来看成一个1MB的磁盘分区,在这个分区上再划分出块组。

$mke2fsfs

mke2fs1.40.2(12-Jul-2007)

fsisnotablockspecialdevice.

Proceedanyway?

(y,n)(输入y回车)

Filesystemlabel=

OStype:

Linux

Blocksize=1024(log=0)

Fragmentsize=1024(log=0)

128inodes,1024blocks

51blocks(4.98%)reservedforthesuperuser

Firstdatablock=1

Maximumfilesystemblocks=1048576

1blockgroup

8192blockspergroup,8192fragmentspergroup

128inodespergroup

Writinginodetables:

done

Writingsuperblocksandfilesystemaccountinginformation:

done

Thisfilesystemwillbeautomaticallycheckedevery27mountsor

180days,whichevercomesfirst.Usetune2fs-cor-i

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 其它考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1