linux下查找文件原理

来源:互联网 发布:淘宝号封了支付宝解除 编辑:程序博客网 时间:2024/05/21 20:28

     Linux系统的文件名格式和Unix系统的文件名格式一样,其中的目录名用斜杠(/)分隔。例如,文件 名/home/vmail/test,其中/home和/vmail是目录名,test则是文件名。Linux系统中的文件名可以由任何可打印的字符组 成,也可以是任何的长度。系统通过分析目录中的文件,来查找文件对应的索引节点。
   

    系统需要的第一个索引节点是文件系统根目录的索引节点,它的 值保存在文件系统的超级块中。要读取一个 ext2文件系统的索引节点,我们必须在相应的数据块组中的索引节点表中查找。例如,如果一个根目录的索引节点值是42,那么我们需要读取在数据块组0中 的索引节点表中的第42个索引节点。根目录索引节点是一个ext2的目录节点,也就是说,根目录索引节点的模式(mode)是目录,而它的数据块中包含的 是ext2 / 目录的入口。从/索引节点我们可以找到home名字目录对应的索引节点,home目录只是众多目录入口中的一个,我们可以从/home对应节点中查找出描 述/home/vmail目录的索引节点值。接下来我们读取这个目录(首先读取它的索引节点,然后读取此索引节点描述的数据块中的vmail目录),从中查找描述 /home /vmail目录的索引节点值。最后,在描述/home/ vmail目录的索引节点指向的目录入口中找到test文件的索引节点值,通过它的索引节点值找到存储在文件中的数据的数据块。


索引节点 inode  

在ext2文件系统中索引节点是一切的基础,文件系统中的每一个文件和目录都使用一个唯一的索引节点。每一个数据块组中的索引节点都保存在索引节点表中。数据块组中还有一个索引节点位图,它用来记录系统中已分配和未分配的索引节点。下面是ext2的索引节点的一些主要的字段:

1. mode ─ i_node
这里保存两个信息:一个是此索引节点描述的是什么,另一个是用户拥有的权限。例如,对于ext2,一个索引节点可以描述文件、目录、符号连接、块设备、字符设备以及FIFO结构。
2. Owner Information
这是文件或目录所有者的用户和组标识符。这使得文件系统可以正确地授权某种存取操作。
3. Size ─ i_size
文件的字节大小。
4. Timestemps ─ i_ctime
索引节点建立的时间和索引节点最后修改的时间。
5. Datablocks ─ i_block
指向存储此索引节点描述文件的数据块的指针。前十二个指针是指向存储数据的物理数据块的指针,而后三个指针则包括不同级别的间接指针。例如,两级指针指向一个指向其他指针块的指针块。这意味着小于或者等于1 2个数据块的文件的存取速度要高于多于1 2个数据块的文件。
你应该注意到ext2的索引节点可以描述一些特殊的设备文件。这些设备文件不是真正的文件,但系统中的程序可以使用这些设备文件来存取它们相关的设备。所有的这些设备文件都在/dev目录下面。例如,挂接程序可以把它希望挂接的设备文件作为它的一个参数。

 超级块


  超级块(Superblock)━存储着描述文件系统的大小和形状的基本信息。文件系统的管理员可以使用其中的信息来使用和维护文件系统。(一般情况下,当文件系统挂接时,系统只读取数据块组0中的超级块,但每一个数据块组中都包含一个超级块的复本,以防系统崩溃时使用)
  EXT2在磁盘上的超级块存放在一个ext2_super_block结构中.超级块包括如下的主要信息:
1. Magic Number(幻数)━ s_magic
 使挂接程序确认这是ext2文件系统的超级块。目前其值为0xEF53。                  (每种类型的问系统的幻数都不同,"幻数"是用来区分每种不同的文件系统)
2. Revision Level(修订级别)━ (版本号 s_rev_level; 次版本号 s_minor_rev_level )
这是文件系统的主版本号和从版本号。挂接程序可以根据此信息决定此文件系统是否支持一些特定文件系统的函数。
3. Mount Count(挂接数)━ s_mnt_count 和 Maximum Mount Count(最大挂接数)─s_max_mnt_count
系统用来决定文件系统是否应该全面地检查。文件系统每挂接一次,mount count的值就会加1。当Mount count的值和Maximum mount count的值相等时,系统将显示Maximal mount count reached, running e2fsck is recommended信息,提示用户进行文件系统的检查。
4. Block Group Number(块组号)━ s_block_group_nr
包含此超级块的数据块组号。
5. Block Size(块大小)━ s_log_block_size
文件系统中数据块的大小,例如1 0 2 4字节。
6. Blocks per Group(每组块数)━ s_blocks_per_group
 数据块组中的数据块数目和Block Size一样,它在文件系统创建以后就是固定的了。
7. Free Blocks(空闲块)━ s_free_blocks_count
文件系统中空闲的数据块的数目。
8. Free Inodes(空闲索引节点)━ s_free_inodes_count
文件系统中空闲的索引节点的数目。
9. First Inode(第一个索引节点)━ s_first_ino
文件系统中的第一个索引节点号。在一个ext2根文件系统中,第一个索引节点是/目录的入口。
                        
EXT2的组描述符

   每一个数据块组都有一个描述它的数据结构和超级块一样,在每一个数据块组中都要复制一份数据块组描述符。
   每个组的组描述符存放在ext2_group_desc结构中. 数据块组描述符包含以下的信息:
1. Blocks Bitmap(块位图的块号)─ bg_block_bitmap
2. Inode Bitmap(索引节点位图的块号)─ bg_inode_bitmap
3. Inode Ta b l e (第一个索引节点表块的块号)─bg_inode_table
4. Free blocks count(组中空闲块数)─bg_free_blocks_count
5. Free Inodes count(组中空闲索引节点数)─ bg_free_inodes_count
6. Used directory c o u n t(已用目录数)─ bg_used_dirs_count
  Notice: EXT2 文件系统事实上只使用数据块组中的第0块中的数据块描述符表.

EXT2的目录

  Ext2以一种特殊的问实现了目录,这种文件的数据块把文件名和相应的索引节点号存放在一起。
  这种目录结构是存放在ext2_dir_entry_2的结构。
  此结构的长度是可变的。该结构的最后一个name字段是EXT2_NAME_LEN个字符的变长数组,因此这个结构是可变的。
  Ext2目录项中的字段:
   1. inode 索引节点号
   2. rec_len 目录项长度
   3. name_len 文件名长度
   4. file_type 文件类型
   5. name 文件名

 

原创粉丝点击