EXT2文件系统(2)

2020-05-04 12:08

间等,也就是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的结构如下: struct ext2_inode {

__le16 i_mode; // 文件格式和访问权限 __le16 i_uid; // 文件所有者ID的低16位 __le32 i_size; // 文件字节数

__le32 i_atime; // 文件上次被访问的时间 __le32 i_ctime; // 文件创建时间

__le32 i_mtime; // 文件被修改的时间

__le32 i_dtime; // 文件被删除的时间(如果存在则为0) __le16 i_gid; // 文件所有组ID的低16位

__le16 i_links_count; // 此inode被连接的次数

__le32 i_blocks; // 文件已使用和保留的总块数(以512B为单位) __le32 i_flags; // 此inode访问数据时ext2的实现方式 union {

struct {

__le32 l_i_reserved1; // 保留

} linux1; struct {

__le32 h_i_translator; // “翻译者”标签 } hurd1; struct {

__le32 m_i_reserved1; // 保留 } masix1;

} osd1; // 操作系统相关数据

__le32 i_block[EXT2_N_BLOCKS]; // 定位存储文件的块的数组,前12个为块号,第13个为一级间接块号,第14个为二级间接块号,第15个为三级间接块号 __le32 i_generation; // 用于NFS的文件版本

__le32 i_file_acl; // 包含扩展属性的块号,老版本中为0 __le32 i_dir_acl; // 表示文件的“High Size”,老版本中为0 __le32 i_faddr; // 文件最后一个段的地址

union {

struct {

__u8 l_i_frag; // 段号 __u8 l_i_fsize; // 段大小

__u16 i_pad1;

__le16 l_i_uid_high; // 文件所有者ID的高16位 __le16 l_i_gid_high; // 文件所有组ID的高16位 __u32 l_i_reserved2; } linux2;

struct {

__u8 h_i_frag; // 段号 __u8 h_i_fsize; // 段大小

__le16 h_i_mode_high;

__le16 h_i_uid_high; // 文件所有者ID的高16位 __le16 h_i_gid_high; // 文件所有组ID的高16位 __le32 h_i_author; } hurd2; struct {

__u8 m_i_frag; // 段号 __u8 m_i_fsize; // 段大小 __u16 m_pad1;

__u32 m_i_reserved2[2]; } masix2;

} osd2; // 操作系统相关数据 };

inode结构:

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

EXT2文件系统中的每个文件由一个inode描述,且只能由一个inode描述。 inode与文件一起存放在外存,系统运行时,把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:04 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命令可以创建目录的符号链接,但不能创建目录的硬链接。


EXT2文件系统(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:功效系数法

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: