【Linux】详解文件系统以及周边知识

news2025/1/9 16:43:59

一、磁盘的基本知识

        磁盘中可以被划分成一个一个的环,每个环都是一个磁道。每个磁道又可以被均分成一个一个的扇区,扇区是磁盘IO的基本单位(想要修改扇区中的一个比特位就必须把该扇区的全部比特位都加载到内存中)。磁盘中的盘面,磁道和扇区都是有编号的。要访问一个扇区中的内容,必须通过磁头先定位到哪一个磁道(柱面cylinder),再确定要读取哪一个盘面(磁头head),最后确定磁道上的哪一个扇区(sector),这种定位法被称为CHS定位法

1.1、磁盘逻辑结构的理解

         磁盘盘面的每个磁道我们都可以想象成把它扯出来,就变成了一个线性的结构,如果把每一个磁道都拼接在一起,再把每一个盘面拼接在一起,就形成了一个比较长的线性结构,就变得类似于磁带了。假设磁盘每一个盘面的大小为200GB,一共有四个盘面,假设每一个扇区大小为512kb,那800GB就可以被分成1677721600个扇区大小。那么如果把这个线性结构看成是一个数组的话,那么我们每次拿着要访问的扇区对应的数组下标通过对应的算法转化成CHS地址就能访问到该扇区了,该工作是由磁盘完成的。所以,操作系统需要知道磁盘有多少个扇面,每个扇面的大小是多少,每个扇区的大小是多少,每个磁道有多少个扇区,这个在操作系统内部编程的时候就可以统一使用线性地址,要访问磁盘数据时,将线性地址交给磁盘,磁盘会自己将线性地址转化成CHS地址,就可以实现操作系统对数据的读取和写入了。

 二、文件系统底层的实现原理

2.1、系统层面的数据块

         但是在操作系统层面上,会认为一次只和磁盘交互一个扇区的数据数据量太小了。在操作系统文件系统认为,IO的基本单位是4kb,也就是8个扇区(假设),也就是说操作系统和磁盘一次最小交换的数据量为8个扇区。那操作系统又可以对磁盘中的800GB进行重新分块,以8个扇区为一个数据块,第一个数据块数组下标编号为1,第二个数据块数组下标编号为2,以此类推,这种编址叫做LBA地址(Logical Block Address)。这个操作系统要对某个数据块进行读取或写入的时候,就只需要拿着数据块的数组编号乘8再加上[0,1,2,3,4,5,6,7],就可以找到对应连续的8个扇区,将8个扇区的线性地址交给磁盘转化成CHS地址就可以对这8个扇区进行读取或写入了。

2.2、分区和分组 

        上面我们已经谈了磁盘和操作系统对于存储空间的分块问题,接下来可以聊一聊操作系统如何对这800GB的空间进行管理了。在实际的情况中,操作系统并不是将这800GB的空间都当成一个整体来维护的,操作系统会对这800GB的空间进行分区(也就是我们平常电脑中所见的C盘,D盘,E盘),分区下面又会有分组,通过一个分组的管理经验再沿用到其它的分组中(当然了也可以沿用其它管理经验),就可以将800GB中所有的分组和分区都管理好了。

         Linux磁盘文件特性分为文件内容加上文件属性,文件属性包括类型,大小,权限,时间,inode编号等等......文件名不属于文件属性),一个文件的inode编号在它所属的分区内是唯一的系统中标识一个文件用的不是文件名,用的是它的inode编号。内容和属性是分开存储的。在磁盘中,文件的属性存储在struct inode结构体中,大小为128字节。操作系统一个数据块的大小为4kb(同上),也就是说一个数据块可以存储32个struct inode结构体。

2.3、组的管理模式

        为了管理好每一个分组中的10GB空间,系统将10GB进行了模块化管理。

i节点表(inode Table):存放文件属性 ,如文件大小,所有者,最近修改时间等。

inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。

数据区(Data blocks):存放文件内容 。

块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。

Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。

超级块(Super Block):在磁盘中,每个分区都有一个super block,且只有个别的组有super block。存放文件系统本身的结构信息。记录的信息主要有:block和inode的总量, 未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个 文件系统结构就被破坏了。

GDT,Group Descriptor Table:块组描述符,描述块组属性信息。

        创建一个文件需要在一个组的inodeBitmap中从左向右遍历找到第一个非1的比特位,将该比特位置1,并通过该比特位索引到inodeTable中对应的位置申请一个struct inode结构体,将该填的属性一填,在Block Bitmap找到非1的比特位,置1并将数据填入到Data blocks对应的数据块中。删除一个文件只需要将其在inode Bitmap和Block Bitmap中所占有的比特位置0即可,而不需要再磁盘中将对应的数据全部删除掉,这也是为什么我们删除一个文件比下载一个文件快得多的本质原因每一个分区的每一个分组都有一个起始编号,struct inode结构体的inode编号可以理解成就是该分组的起始编号加上在inode Bitmap中的偏移量。这样就可以做到一个文件的inode编号在它所属的分区内是唯一的。        

        为了将文件的属性和内容之间建立起联系,struct inode结构体中还存在一个int block[15]的数组用来表征这个分组内的哪些数据块属于这个文件。block数组下标[0,11]直接保存的就是Data blocks中的编号(一级索引);[12,13]不直接保存编号,而保存的是其它保存数据的数据块对应的编号(二级索引),[14]保存就是三级索引,这样可以有效增加保存文件数据的数据块的个数,进一步的可以使一个文件保存更多的数据。

三、重谈文件的增删查改

        在Linux系统中,目录也是文件,其中目录的内容中就保存了目录中的文件的inode编号和文件名之间的映射关系这就是为什么如果我们对一个目录没有w权限,我们就无法在这个目录中新建文件的原因。因为新建文件要将文件的inode编号和文件名之间的映射关系写到目录的内容当中,本质就是修改目录的内容,操作系统就不让我修改。删除一个文件时,拿着文件名在当前目录中做字符串匹配,当匹配成功时,将所在分组的inodebitmap和blockbitmap中对应的比特位由一置零,再在所处目录的内容中将文件名和inode的映射关系删除掉,这样一个文件就被删除了。

四、重谈文件路径

        查找一个文件,在内核当中,都要递归似的帮我们找到根目录,从根目录进行路径解析。因为我们要得到一个文件的内容,就要先拿到它的inode编号,可是我们只有文件名啊,那怎么办?文件名和它的inode编号是存储在它所在的目录中的,所以要到目录的内容中去找。可是目录我们也只是知道目录名啊,我们又要去上级目录中找该目录的inode编号,依次类推,直到找到根目录,根目录的inode编号系统是已知的,所以我们就可以逆向找到所有目录的inode编号,进而找到我们的文件的inode编号,也就找到文件内容了。这就是文件路径最本质的作用

五、挂载的理解

        挂载(Mounting)是指由操作系统使一个存储设备(诸如硬盘、CD-ROM或网络共享)上的计算机文件和目录可供用户通过计算机的文件系统访问的一个过程一个被写入文件系统的分区要被Linux操作系统使用,必须将其挂载到一个目录下。分区的访问都是通过所挂载的路径访问的。通过文件路径前缀就可以知道文件处于哪一个分区中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1559249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「MySQL」索引事务

🎇个人主页:Ice_Sugar_7 🎇所属专栏:数据库 🎇欢迎点赞收藏加关注哦! 索引&事务 🍉索引🍌特点🍌通过 SQL 操作索引🍌底层数据结构 🍉事务&…

张颂文|永远保持好奇心的人,是永远进步的人。

哈喽,你好啊,我是雷工! 今天看到了张颂文的一段演讲,提到了他因为好奇心而被改变的人生。 如果想把单一和枯燥的工作做的更好,张颂文的办法是像一个孩子一样保持好奇心,不停地提出一些有趣的问题。 在5年的导游经历中,对每次游览的地点都像初次游览般保持好奇心,正因为…

C++从入门到精通——引用()

C的引用 前言一、C引用概念二、引用特性交换指针引用 三、常引用保证值不变权限的方法权限的放大权限的缩小权限的平移类型转换临时变量 四、引用的使用场景1. 做参数2. 做返回值 五、传值、传引用效率比较值和引用的作为返回值类型的性能比较 六、引用和指针的区别引用和指针的…

工单系统的作用与优势!为什么企业需要它?

什么是工单系统?工单系统作为企业服务类工具,能在管理上和业务上为企业带来什么帮助吗? 什么是工单系统 ZohoDesk工单系统是一种用于管理和处理任务或请求的软件工具。它提供了一个集中的平台,使组织能够跟踪、分配和解决各种问题、请求和…

AWS创建IAM用户,以及通过IAM用户登录

基本概念: IAM Identity Center(AWS SSO) 跨账户访问:IAM Identity Center允许用户使用他们自己的单一登录凭证来访问多个AWS账户和应用程序。这意味着你可以拥有一个账户和密码,通过IAM Identity Center的用户门户&…

前端虚拟滚动列表 vue虚拟列表

前端虚拟滚动列表 在大型的企业级项目中经常要渲染大量的数据,这种长列表是一个很普遍的场景,当列表内容越来越多就会导致页面滑动卡顿、白屏、数据渲染较慢的问题;大数据量列表性能优化,减少真实dom的渲染 看图:绿色…

攻防世界——catfly

这道题我觉得很难,我当初刷题看见这道题,是唯一一道直接跳过的,现在掌握了一点知识才回来重新看 这道题在linux运行下是这样,我首先猜测是和下面这个time有关,判断达到一定次数就会给我flag 但是我找了好久都没找到那…

NFT-前端开发(一)

使用 在我们想要保存项目的目录下打开终端运行npx create-react-app test2命令初始化,test2是我们的项目名字,可以自己去更改。 初始化完成后,我们目录下就会多出一个test2文件夹 ,然后我们在vscode中打开该文件夹 然后我们打开j…

C++教学——从入门到精通 5.单精度实数float

众所周知&#xff0c;三角形的面积公式是(底*高)/2 那就来做个三角形面积计算器吧 到吗如下 #include"bits/stdc.h" using namespace std; int main(){int a,b;cin>>a>>b;cout<<(a*b)/2; } 这不对呀&#xff0c;明明是7.5而他却是7&#xff0c;…

(一)kafka实战——kafka源码编译启动

前言 本节内容是关于kafka消息中间键的源码编译&#xff0c;并通过idea工具实现kafka服务器的启动&#xff0c;使用的kafka源码版本是3.6.1&#xff0c;由于kafka源码是通过gradle编译的&#xff0c;以及服务器是通过scala语言实现&#xff0c;我们要预先安装好gradle编译工具…

暴力破解笔记

1 暴力破解简介 暴力破解&#xff1a; 蛮力攻击&#xff0c;又称为穷举攻击&#xff0c;或暴力破解&#xff0c;将密码进行逐个尝试验证&#xff0c;直到尝试出真正的密码为止。 暴力破解是指采用反复试错的方法并希望最终猜对&#xff0c;以尝试破解密码或用户名或找到隐藏的…

进无止境,砥砺前行,互联网营销专家杨建允助力多个品牌和机构提升营运效率!

进无止境&#xff0c;砥砺前行&#xff01;在过去的一年&#xff08;2023年&#xff09;&#xff0c;互联网营销专家杨建允持续为数十家品牌和机构提供了品牌和营销支持&#xff01;统计如下&#xff1a;&#xff08;排名不分先后&#xff09; 滴滴&#xff1b; 企查查&#…

了解XSS和CSRF攻击与防御

什么是XSS攻击 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站脚本攻击&#xff09;是一种常见的网络安全漏洞&#xff0c;它允许攻击者在受害者的浏览器上执行恶意脚本。这种攻击通常发生在 web 应用程序中&#xff0c;攻击者通过注入恶意脚本来利用用户对网站的信任&…

属性选择器

1.[title]{background:yellow;}&#xff1a;所有带title标签设置成黄色 2.div[class]{background:yellow;}&#xff1a;所有div中带class标签设置成黄色 3.div[classbox1]{border:1px solid blue; }&#xff1a;div中包含class并且classbox1的设置成蓝边框 4. class…

【Linux】进程实践项目 —— 自主shell编写

送给大家一句话&#xff1a; 不管前方的路有多苦&#xff0c;只要走的方向正确&#xff0c;不管多么崎岖不平&#xff0c;都比站在原地更接近幸福。 —— 宫崎骏《千与千寻》 自主shell命令编写 1 前言2 项目实现2.1 创建命令行2.2 获取命令2.3 分割命令2.4 运行命令 3 源代码…

python mysql错误如何处理

错误代码类型&#xff1a;pymysql.err.InternalError: (1054, "Unknown column jack in field list") import pymysql d_mysql {host: 127.0.0.1, port: 33333,user: *****,password: *****,db: *****,charset: utf8} conn pymysql.connect(**d_mysql) cur co…

基于SSM远程同步课堂系统

基于SSM远程同步课堂系统的设计与实现 摘要 在这样一个网络数据大爆炸的时代&#xff0c;人们获取知识、获取信息的通道非常的多元化&#xff0c;通过网络来实现数据信息的获取成为了现在非常常见的一种方式&#xff0c;而通过网络进行教学&#xff0c;在网络上进行远程的课堂…

C++--内联函数

当调用一个函数时&#xff0c;程序就会跳转到该函数&#xff0c;函数执行完毕后&#xff0c;程序又返回到原来调用该函数的位置的下一句。 函数的调用也需要花时间&#xff0c;C中对于功能简单、规模小、使用频繁的函数&#xff0c;可以将其设置为内联函数。 内联函数&#xff…

IAG—热门单曲

喜欢你&#x1f60d; 泡沫&#x1fae7; 倒数 ... 太多了 句号 多远都要在一起 来自天堂的魔鬼 再见 ……

车载电子电器架构 —— 通信信号数据库开发

车载电子电器架构 —— 信号数据库开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自…