Linux 文件查找 原理,linux下查找文件原理

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 文件名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值