Linux中ext2文件系统存储结构的个人理解

看了几天《深入理解linux内核》的ext2文件系统部分和VFS部分,稍微了解了点文件在内存中的存储结构,但是总是弄不清楚在硬盘上实际的存储方式,特别是文件夹的存储。

保存文件夹的结构很简单,没有这个文件夹下所有文件的索引,看了几遍书,都不能理解在硬盘上文件夹结构的存储,只能根据网上的例子自己跟着做实验。(过程参考了http://blog.chinaunix.net/u1/48373/showart_1210707.html的博客)

首先显示要分配一个空间,格式化为ext2分区,并在这个空间上进行文件和文件夹的操作。

dd if=/dev/zero of=disk bs=1M count=1 #创建1MB的空间,并填充为0

mkfs.ext2 disk #格式化为ext2分区,从输出信息中可以看见block大小为1024byte

mount -o loop disk /mnt/ #挂载分区

然后进入挂载的目录,开始创建文件和文件夹。

test.txt(内容为hello)

创建test1.txt(内容为hello1)

创建文件夹test

在文件夹test中,创建文件test2.txt(内容为hello2)

创建文件test3.txt(内容为hello3)

然后就可以卸载这个文件,用16进制编辑器打开disk文件,查看ext2的文件保存格式。

打开disk文件后,跳转到地址0x800处(开头第一块保留为引导块,后面一块为块组0的超级块),即块组0的组描述符处。

 


 

根据组描述符的结构,在第9个字节开始是第一个索引节点表块的块号。从这开始的4个字节(均为little-endian),就是第一个索引节点表块的块号。这里是8。根据计算可知,它的16进制地址是0x2000。

因为文件系统的根目录总是在索引节点的第二个,每个索引节点大小是固定的,为128字节(0x80)。即地址0x2080就是根目录的索引节点(inode)。根据索引节点的结构,可以找到根目录数据块编号为0x18,也就是地址0x6000。

在0x6000处,可以看见根目录下创建的所有目录和文件。也就是说,ext2的文件夹结构ext2_dir_entry_2中保存的内容,不是文件夹本身,而是文件夹中的所有文件的信息(包括目录),其中的第一个inode字段,是这个文件(文件夹)所在的索引节点编号。

 


 

这里找到的除了刚刚创建的一个文件夹和一个文件之外,还有文件系统创建的时候自动产生的lost+find文件夹和.和..文件夹(分别表示本文件夹和父文件夹)。通过目录结构的第一个字段,可以找到想要寻找的文件(文件夹)所在的inode,然后去索引节点表中寻找这个节点,并找到这个节点的数据存储位置(i_blocks字段),再计算分配到的block的地址,读取实际的数据。

根据目录的结构查找,找到test.txt的索引节点偏移量是0x0D。那么,test.txt的索引节点地址是0x2000+0x80*(0x0D-0x01)=0x2600。在该处找到数据块的指针为0x27(地址0x9C00)。

转到0x9C00,就可以看见里面的数据hello。

 


 

时间: 2024-10-27 08:11:52

Linux中ext2文件系统存储结构的个人理解的相关文章

ext2文件系统存储结构(sina博客移入)

看了几天<深入理解linux内核>的ext2文件系统部分和VFS部分,稍微了解了点文件在内存中的存储结构,但是总是弄不清楚在硬盘上实际的存储方式,特别是文件夹的存储. 保存文件夹的结构很简单,没有这个文件夹下所有文件的索引,看了几遍书,都不能理解在硬盘上文件夹结构的存储,只能根据网上的例子自己跟着做实验.(过程参考了http://blog.chinaunix.net/u1/48373/showart_1210707.html的博客) 首先显示要分配一个空间,格式化为ext2分区,并在这个空间上

LINUX 的EXT2文件系统的组织方式

LINUX 的EXT2文件系统学习理解 文件系统的构架非常复杂,在学习中使用了EXT2进行分析和学习,EXT3,EXT4虽然有改进但是基本原理一致 结合学习的东西必须记录一下. 磁盘的块分布情况,默认的我们的一个块是4K,在磁盘中块被划分成成组的形式.记为GROUP 0-GROUP N. 使用dumpe2fs 命令可以看到block group的使用情况. 块的组织方式: 磁盘第一个块:启动块 (boot block) 组0:(假设I个块) 组第一个块:超级块 (SUPER BLOCK) 组第二

linux中FHS文件系统用法介绍

FHS文件系统 /bin: 可执行程序存放,二进制文件/sbin: 只有管理员才能执行的命令操作系统自身运行启动时则需要的程序/sbin,/bin其他位置:/usr/bin/usr/sbin/usr/local/bin/usr/local/sbin操作系统本身之外其他功能某些服务执行程序,在/usr/bin和./usr/sbin第三方程序,/usr/local/bin和/sbin /boot : 存放系统引导文件,内核,ramfs文件,bootloader,grup等/dev : 设备文件存放目

Linux 中 7 个判断文件系统类型的方法

文件通过文件系统在磁盘及分区上命名.存储.检索以及更新,文件系统是在磁盘上组织文件的方式. 文件系统分为两个部分:用户数据和元数据(文件名.创建时间.修改时间.大小以及目录层次结构中的位置等). 在本指南中,我们将用 7 种方法来识别你的 Linux 文件系统类型,如 Ext2.Ext3.Ext4.BtrFS.GlusterFS 等等. 1. 使用 df 命令 df 命令报告文件系统磁盘空间利用率,要显示特定的磁盘分区的文件系统类型,像下面那样使用 -T 标志: $ df -Th 或者 $ df

Linux中7个判断文件系统类型的方法

文件通过文件系统在磁盘及分区上命名.存储.检索以及更新,文件系统是在磁盘上组织文件的方式. 文件系统分为两个部分:用户数据和元数据(文件名.创建时间.修改时间.大小以及目录层次结构中的位置等). 在本指南中,我们将用 7 种方法来识别你的 Linux 文件系统类型,如 Ext2.Ext3.Ext4.BtrFS.GlusterFS 等等. 1. 使用 df 命令 df 命令报告文件系统磁盘空间利用率,要显示特定的磁盘分区的文件系统类型,像下面那样使用 -T 标志: $ df -Th  或者  $ 

Linux的ext2/ext3文件系统知识

Linux最传统的磁盘文件系统(filesystem)使用的是ext2,所以要了解文件系统就得要由ext2开始. 一.文件系统特性 磁盘分区完毕后还需要进行格式化,之后操作系统才能够使用这个分区.这是因为每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区进行格式化,以成为操作系统能够利用的文件系统格式.传统的磁盘与文件系统的应用中,一个分区誻只能够被格式化成为一个文件系统,所以我们可以说一个文件系统就是一个分区. 操作系统的文件数据除文件内容外,通常还有非常

pyinotify:在Linux中实时监控文件系统更改

Pyinotify 是一个简单而有用的 Python 模块,它可用于在 Linux 中实时监控文件系统更改. 作为一名系统管理员,你可以用它来监视你感兴趣的目录的更改,如 Web 目录或程序数据存储目录及其他目录. 它依赖于 inotify(在内核 2.6.13 中纳入的 Linux 内核功能),它是一个事件驱动的通知程序,其通知通过三个系统调用从内核空间导出到用户空间. pyinotiy 的目的是绑定这三个系统调用,并在其上提供了一个通用和抽象的方法来操作这些功能. 在本文中,我们将向你展示如

深入解析 ext2 文件系统

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

Linux日志式文件系统面面观_unix linux

    文件系统是用来管理和组织保存在磁盘驱动器上的数据的系统软件,其实现了数据完整性的保 证,也就是保证写入磁盘的数据和随后读出的内容的一致性.除了保存以文件方式存储的数据以外,一个文件系统同样存储和管理关于文件和文件系统自身的一些重要信息(例如:日期时间.属主.访问权限.文件大小和存储位置等等).这些信息通常被称为元数据(metadata). 由于为了避免磁盘访问瓶颈效应,一般文件系统大都以异步方式工作,因此如果磁盘操作被突然中断可能导致数据被丢失.例如如果出现这种情况:如果当你处理一个在l