敬请期待下一句怎么对,seo排名优化教程,企业工商信息查询系统官网,做个个人网站要怎么做目录
前言#xff1a;
简单理解文件系统
细节理解 前言#xff1a;
前文我们介绍了磁盘#xff0c;介绍磁盘的原因是因为我们需要在理解文件系统之前#xff0c;通过磁盘的了解#xff0c;介绍一些文件相关的内容#xff0c;比如文件是如何在磁盘里面存储的#xff…目录
前言
简单理解文件系统
细节理解 前言
前文我们介绍了磁盘介绍磁盘的原因是因为我们需要在理解文件系统之前通过磁盘的了解介绍一些文件相关的内容比如文件是如何在磁盘里面存储的什么是CHS定址法为什么OS不使用CHS定址法什么是LBA块等。
我们今天的介绍顺序是先简单搭建起来对文件系统的理解再深挖细节问题。
那么进入今日的话题吧 简单理解文件系统
对于文件系统框架的搭建我们可以先从这个指令进入 即stat指令查看文件的信息这个信息是文件的属性还是文件的内容呢
我们知道文件 属性 内容但是我们常常关注的都是文件的内容对于文件的属性我们关注的并没有那么常见。所以要理解文件系统的框架我们要从文件的属性进入。
由stat提供的信息来看我们看到了File:main.c这个代表的是文件名Size代表的是文件的大小BlocksIO Block? Inode?这些都是什么
不急我们再次引入上文的话题 对于上文将磁盘从非线性的转换为了线性的然后线性的空间我们看成了数组那么数组我们可以通过位图的类似做法找到数据的存储地址。但是因为磁盘取数据的特殊点取数据都是一次性的取4kb数据所以OS为了方便将数据分为了多个块也就是LBA块分好之后找到一整块空间就十分容易了。
所以我们对于文件的管理从磁盘到了CHS到了数组到了LBA最后无非就是搞清楚LBA里面究竟有什么就可以了 形象的图片就是这样那么块组里面我们分清楚了有Super Block, Group Deseciptor Table, Block Bitmap, Inode Table, Data Blocks。
那么我们从哪里开始讨论呢
从Data Blocks开始讨论Data Blocks是数据块的翻译也就是文件的内容都是放在这里的但是因为方便介绍我们将Data Blocks的大小缩小成了和其他差不多的大小。对于该块占据的空间大小应该是整个块组的95%以上。
那么对于Data Blocks里面都有什么呢 看起来是非常抽象的因为Data Blocks里面存储的都是一个一个的数据块大小都是为4kb的取的时候就直接将该数据块丢出去就行了。
对于这么多的数据块都是只存储文件的内容的。
并且我们知道文件 内容 属性对于文件内容属性而言Linux特定的文件系统是将文件的属性和内容分开存储的这点我们先记住。对于Data Blocks我们就探讨到这里。
那么下一个就是Block Bitmap相信在C学习的时候同学们都是知道位图这个概念的。
最开始介绍位图的时候都是通过的判断数据是否在一堆数据的集合里面这里同理引入block Bitmap就是为了判断是否某个数据块是否存在数据这里位图就不多介绍了但是引入了位图确实能在遍历数据块上节省极大部分的时间。 下一个就是非常重要的inode Tableinode Table成为i节点表存放的是文件的属性文件的大小所有者最近的修改时间等。这是inode Table。
那么文件的属性一般都有什么呢
struct inode
{int size;mode_t mode;int creater;int time;...int inode_number;int datablocks[N];
};
我们拿几个非常常见的出来举例文件大小文件的权限创建时间等但是最重要的我们应该关心inode_number和datablocks[N]。而这个块的名字是inode_table所以它所处的空间自然是这么多个结构体所处的集合。
所以文件的属性不过是一个一个完全相同的结构体
而在里面inode的结构体如何分区的呢都是通过inode_number进行分区的那么datablocks的作用是什么呢我们使用文件的时候通过了inode_number找到了对应的文件属性结构体我们需要找到内容就需要datablocks这个数据指向的内容就是block Data的空间 像这样比如N等于12的时候前11个直接指向的数据块但是我们没有办法找到对应的大文件所以第12个指向的Data Blocks里面也存放的指针指向了其他的数据块就有一种指数的感觉。
那么数据还不够13 14后面都可以指向并且就不是一层关系这么简单了是一层指向一层一层又指向一层套好几层最后才指向数据这样就能找到大文件的数据了。
这种查找数据的方法叫做ext2文件系统我们目前大多数使用的都是ext2还有ext3 ext4等。
所以对于inode结构体我们就知道了个所以然那么inode bitmap那不就是同理了吗
通过inode bitmap找到表里面的某个位置是否存在文件的属性然后进行后续的操作。 那么现在我们就清楚了inode table, inode bitmap, data blocks, data bitmap。对于剩下的两个比如GDT也就是Group Descriptor table翻译过来叫做块组描述符描述的是块组的属性信息其实就是这个块的信息了这更加体现了一种分治的思想。
对于Super blocks它的名字可就厉害了叫做超级块存放的是文件系统本身的结构信息而且不是每个组都有的可能几个组才回有一个。比如存放的有inode使用的个数未使用的个数datablocks的使用个数datablocks未使用的个数。这些都是超级块所要记录的内容。
那么提问既然是记录所有的结构信息为什么要整这么多个呢
因为磁盘是可能损坏的如果损坏的时候刚好磁头给一个超级块的内容消除了那么这不就完蛋了吗所有多存储几个增加了容错率
说了那么多inode是十分重要的查看inode是-i 细节理解
对于上文来说我们已经理解了块里面的6个成员现在我们来谈论具体细节问题
第一个细节
如何通过inode找到对应的data blocks
因为inode和data都是以分区为单位的所以inode可以通过数组datablocks找到的
第二个细节
我们使用的不是一直都是文件名吗好像并没有使用inode可是我们改变文件内容的时候一直使用的都是文件名啊
这个时候我们就要谈谈目录了目录 文件属性 文件内容这里可不要认为目录就不是文件了提问目录的文件内容是什么呢
目录的文件内容 文件名和inode的编号关系当我们创建好了一个文件文件所在的目录就会记录该文件和inode的关系方便找到并进行修改。
所以目录里面的文件名就是和inode映射关系
到了这里相信同学们能理解为什么一个目录下不能创建多个同名文件了吧因为如果创建了同名文件映射关系一乱整个文件系统就瘫痪了。
可是当我们修改目录的时候用的还是目录名啊又是什么存储的目录和inode的关系呢
看这个 pwd打印出来了路径是因为环境变量PATH而我们在该目录下修改文件需要找到对应的inode找到inode之前我们需要找到该文件所在的目录找到该文件所在的目录我们就应该要找到目录的目录最后直接到了根目录
而在根目录这里就是OS已经提前加载好了有关路径缓存的信息了这里涉及到了知识点有结构体dentry格式化挂载等。我们先不管我们只需要知道Linux会缓存路径信息从而我们可以通过文件 目录来修改对应内容。 现在我们顺便回顾一下目录的r w当我们将r去掉之后也就是没有可读权限 此时目录就不允许我们读取文件内容本质就是不让我们知道文件名和inode的映射关系。 这里就不演示了当我们没有了w权限之后我们无法创建文件本质就是因为不要我们创建文件名和Inode的映射关系
所以对于细节2我们可以得出结论
1 目录下不能创建同名文件因为会打乱映射关系
2 查找的文件顺序是通过文件名查找对应的inode编号
3 r是让我们找到对应的映射关系w是不让我们写入对应的映射关系
第三个细节
我们如何理解文件的增删查改呢
文件增就是找到对应的映射关系在datablock里面增加数据查就是找对应的映射关系改也是通过inode修改datablocks里面的数据关系。
那么删除呢
其实这里的删除是一种伪删除。
即将Inode bitmap datablock bitmap都置为0即可。这是一种删除。
我们对于文件系统的框架有了简单的理解那么理解接下来的软硬连接动态库就会轻松很多了。 感谢阅读